[英]Trouble Using SQL SELECT and then UPDATE in One PHP Function - MYSQL PHP ST EXECUTE PDO
更新:解決了,謝謝大家的幫助!
因此,我想擁有一個PHP函數,該函數查詢數據庫所有“ 簽出”類型的遭遇,然后以最近一次遭遇的日期來更新人員表字段lastCO 。
但是在我的UPDATE函數的while循環中似乎以某種方式出錯了。 您可以告訴我輸入了“ echo”語句,以便查看循環條件是否被滿足,實際上,當我查看源代碼時,它回響了一次 。
但是,當我注釋掉第二條(UPDATE)SQL語句時,while循環似乎可以正確地進行迭代(並且我的echo語句打印了很多次)。
public static function getLastCO() {
$conn = new PDO( DB, DBU, DBP );
$sql = "SELECT UNIX_TIMESTAMP(encPastDate) AS encPastDate, encPastText,encPastPTRef
FROM enctsPast WHERE encPastText = 'Check-out'";
$st = $conn->prepare( $sql );
$st->execute();
$row = $st->fetch();
//trouble seems to start here!!!!
while ( $row = $st->fetch() ) {
$person = new Person( $row );
if ($person->encPastDate != null){
echo '123abc456';
$sql1 = "UPDATE persons SET lastCO =
(CASE WHEN lastCO < '$person->encPastDate' THEN '$person->encPastDate'
WHEN lastCO = null THEN '$person->encPastDate' END)";
$st = $conn->prepare( $sql1 );
$st->execute();
}
}
$conn = null;
}
那么我的UPDATE語句和執行怎么了? 問題是在同一“連接”上同時連接到兩個不同表的方式嗎? 還有嗎
我只是在調試它時遇到了麻煩,而我可憐的回聲嘗試並沒有使我走遠:/
在此先感謝您的幫助!
請查看此手冊http://php.net/manual/zh/pdo.prepare.php ,它應該很清楚,
但是要在while循環內創建一個新的Persoon對象,而在之后不使用unset($ persoon)則是不好的內存管理。而且在循環內創建對象並不是很好,應該是一次又一次地重復使用相同的創建對象,再次像下面這樣
$person = new Person();
while ( $row = $st->fetch() ) {
person->populateFromArray($row)
替換為:
WHEN lastCO = null
與:
WHEN lastCO is null
變量和NULL值之間的比較必須使用IS NULL語句完成,否則始終為UNKNOWN,因此尚未執行您的THEN分支。
在您的查詢中,另一件事不適合我。
您使用CASE,但是如果lastCO不為null並且大於您的變量,則lastCO的值設置為NULL,因此您可以放置ELSE分支來防止此行為。
最后,您可以合並到僅一個不帶循環的UPDATE查詢中。
編輯評論的答案:
嘗試以下操作:在此查詢中,由於沒有放置where子句,因此更新了person表的所有記錄
UPDATE persons
SET lastCO =
CASE
WHEN lastCO < '$person->encPastDate'
THEN '$person->encPastDate'
WHEN lastCO is null
THEN '$person->encPastDate'
ELSE lastCO = lastCO
END
以其他方式:以這種方式,您僅更新lastCO未定值或低於變量'$ person-> encPastDate'的人員的記錄
UPDATE persons
SET lastCO =
CASE
WHEN lastCO < '$person->encPastDate'
THEN '$person->encPastDate'
WHEN lastCO is null
THEN '$person->encPastDate'
END
where lastCO is null or lastCO < '$person->encPastDate'
第三種:您有一個循環,您處理一個人的每一步。 因此,您可以使用where子句將更新限制為該人:person.id = $ person-> id或其他存儲了person ID的變量。
告訴我是否可以
$conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
在WHILE循環中運行無緩沖查詢時,無法執行某些操作。 添加以下行以確保正在使用緩沖的查詢。
編輯
當然,您需要在sql中使用where條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.