2012-09-28 66 views
6

我有以下查詢:PDO檢查現場對準備:PARAM,處理IS NULL條件

//query: 
$query = " 
    SELECT field1 FROM table 
    WHERE 
     field2 = :PARAM1 
    AND ... 
    AND fieldx = :PARAM1X"; 

//params: 
$params = array(); 
$params [":PARAM" . $i] = NULL; 

//prepare and execute: 
$o = $cnx->prepare($query); 
$o->execute($params); 

我怎麼能結合PARAMS與NULL值? PDO會自動將= :PARAM1更改爲IS NULL?要說清楚,試圖計算WHERE field = null在mysql中不起作用,並且永遠不會返回任何內容。我們必須改用WHERE field IS NULL

這就是我現在正在處理的。

我必須說,我的第一個測試是積極的,但我真的不希望發現在生產環境中6個月的副作用...

+0

我們可以看到您用來執行綁定的代碼嗎? – ultranaut

+1

是的,在這裏我發佈了它。自從我意識到我沒有明確地「綁定」參數,而是準備它們(道歉)之後,我也更正了標題 – Sebas

+1

在我看來,將此問題視爲「不具有建設性」是錯誤的。然而,它是這個問題的重複:[如果我想讓它同時接受INT和NULL與PDO?](http://stackoverflow.com/questions/7082405/)如何綁定一個值。我們接受的答案是使用[NULL-safe equal operator'<=>'](http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#operator_equal-to)。 – TachyonVortex

回答

1

至於說從PHP Docs評論,

bindValue(':PARAM1', null, PDO::PARAM_INT); 

$myNull = null; 
$stmt->bindParam(':PARAM1', $myNull, PDO::PARAM_NULL); 
+0

是的,但它會照顧IS NULL而不是= NULL,這在mysql sql語句中不起作用? – Sebas

+0

@好吧,我想你不能那樣做。你的問題有點類似於此,它沒有解決[點擊這裏](http://board.phpbuilder.com/showthread.php?10377549-mysql_real_escape_string-to-fix-apostrophes&goto=nextoldest),最好的方法是在PHP中創建一個條件來構建你的WHERE條件。 (例如,如果'param1'爲空,則附加這個條件,否則做另一個條件..) –

1

如果要綁定PARAMS將空值,則需要使用bindValues

bindValue(':param', null, PDO::PARAM_INT); 

因此對於您的查詢,它可以是這樣的。

$sth = $dbh->prepare('SELECT field1 FROM table WHERE field2 = :PARAM1 AND fieldx = :PARAM1X'); 
$sth->bindValue(':PARAM1', null, PDO::PARAM_INT); 

希望這有助於。

+0

是的,但它也會照顧IS NULL而不是= NULL,它不適用於mysql sql中的條件句子? – Sebas

+0

不,我不相信。 PDO佔位符不是爲了那個。如果你想把一些條件放到你的查詢中,然後用合適的條件構建查詢,然後通過bindParam或bindValue傳遞值; –

+1

謝謝你的回答 – Sebas