從PHP manual,它指出:爲什麼模擬準備好的語句失敗,返回NULL?
PDO :: ATTR_EMULATE_PREPARES啓用或禁用準備 語句的仿真。某些驅動程序不支持本機預處理語句,或者對其支持有限。使用此設置可強制PDO 始終模擬預準備語句(如果爲TRUE),或嘗試使用準備好的語句(如果爲FALSE)。如果驅動程序無法成功準備 當前查詢,它總是會回退到模擬 準備好的語句。需要布爾。
我有一個查詢是這樣的:
$type = PDO::PARAM_INT;
if($_POST['code'] == "") $type = PDO::PARAM_NULL;
$stmt = $dbh->prepare("UPDATE Product SET code=? WHERE id=?");
$stmt->bindValue(1, $_POST['code'], $type);
$stmt->bindValue(2, $_SESSION['id'], PDO::PARAM_INT);
$stmt->execute();
我意識到,如果沒有設置下面的語句,我會得到一個'0'
而不是NULL
值(當$_POST['code'] == ""
)到使用我的數據庫上面的代碼。爲什麼?
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
UPDATE:
雖然仿真的禁止工作對我來說,我更願意使用它,因爲像這樣question的OP,基本上所有我的查詢每個腳本執行一次只能執行。因此,在擬備不會獲得我任何優勢的聲明,並創建到數據庫不必要的調用如下圖所示一般查詢日誌:
Emulation Disabled
22 Connect [email protected] on Database
22 Prepare UPDATE Product SET code=? WHERE id=?
22 Execute UPDATE Product SET code='abc' WHERE id='123'
22 Close stmt
22 Quit
Emulation Enabled
22 Connect [email protected] on Database
22 Query UPDATE Product SET code='abc' WHERE id='123'
22 Quit
任何幫助解決NULL
問題是極大的讚賞。
我可以說至少是空字符串不等於NULL –
還冒充日誌,無關上面的代碼,我不會把一個合理的動作。 –
@ Col.Srapnel。解決了它。我不認爲這很容易。你應該把它作爲答案讓我接受。謝謝。 –