2017-02-04 40 views
1

在準備使用PDO的SQL查詢,應該/必須做綁定空值時應該/必須使用PDO :: PARAM_NULL嗎?

$query->bindValue('column', $value, is_null($value) ? PDO::PARAM_NULL : PDO::PARAM_STR); 

或者,我可以只使用PDO::PARAM_INTPDO::PARAM_STR直接,因爲PDO數字,在它自己的了呢? (因爲它真的,真的應該在我看來)


而作爲一個好奇的後續問題,如果我必須使用PDO::PARAM_NULL,什麼是它實際上呢?

+0

應該很容易測試。設置一個帶有空列的表,然後執行'INSERTs'兩種方式。 –

+0

根據函數'really_register_bound_param'的[源代碼](https://github.com/php/php-src/blob/master/ext/pdo/pdo_stmt.c),它可以轉換爲'long',''布爾值「和一個」字符串「,如果值不是這些。因此,從某種意義上說,使用'PARAM :: TYPE'常量已經過時了,但是,如果PDO將支持另一個不允許將'''作爲'null'的db類型'null'列,如果你使用參數,那麼支持這個數據庫也是一個簡單的改變。 – Xorifelse

+0

@RickJames嗯,這就是爲什麼我問,因爲它似乎*沒有它的工作。所以想知道是否有某種邊緣情況或可能遇到的問題,如果我不*使用它可能會遇到。 – Svish

回答

0

PDO的想法是,您可以使用1個API與不同的數據庫進行通信,這意味着可以處理一個不同於另一個的值。例如的MySQL可以處理一個整數類型列既是一個整數,字符串值:

INSERT INTO table (col_type_int) VALUES (1) 
INSERT INTO table (col_type_int) VALUES ('1') 

該查詢將MySQL的正確執行兩種方式,但不同的數據庫可能會更具體。

因此PDO::PARAM_TYPE只是爲查詢添加了另一個嚴格級別以確保查詢針對不同數據庫類型正確轉換。目前在source code中使用的唯一值是PDO_PARAM_STR,PDO_PARAM_INTPDO_PARAM_BOOL。其他的只是轉換爲一個字符串。

通過添加PDO::PARAM_NULL到查詢不僅保證,如果你要使用不同的驅動程序(可能甚至不存在尚未)來處理他們不同,你不需要修改代碼,或許只有查詢。

0

理論 PDO應該認識

$value = NULL; 
$query->bindValue('column', $value, PDO::PARAM_STR); 

和存儲NULL(不是字符串'NULL',也不'')到語句。特別是它應該能夠生成

UPDATE ... SET `column` = NULL; 

從上面的綁定。

在這種情況下,你的代碼是'過度殺傷'。

+0

在這種情況下,我的代碼實際上不是,因爲我沒有那樣做;只在我的例子中 – Svish

相關問題