2011-11-20 66 views
4

從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問題是極大的讚賞。

+1

我可以說至少是空字符串不等於NULL –

+0

還冒充日誌,無關上面的代碼,我不會把一個合理的動作。 –

+0

@ Col.Srapnel。解決了它。我不認爲這很容易。你應該把它作爲答案讓我接受。謝謝。 –

回答

5

嘗試綁定nullPDO::PARAM_NULL

$type = PDO::PARAM_INT; 
if($_POST['code'] == "") { 
    $_POST['code'] = null; 
    $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(); 

事實上,看來你並不需要使用PDO::PARAM_NULL,下面的代碼也將插入null

$stmt->bindValue(1, $_POST['code'] ? $_POST['code'] : null, PDO::PARAM_INT); 
+0

我明白了..你的回答有點晚了,請看上面的討論。但它是正確的。我想知道Shrapnel上校是否想要擁有它。如果他沒有發帖,他會接受你的回答。謝謝... –