2017-08-17 27 views
2

我嘗試轉換mysql_querypdo相當於PHP的mysql_query中PDO

我的表結構(需要我的問題之一是other_id去除不相關的列)不同的結果它的數據如下:

----------------- 
| id | other_id | 
----------------- 
| 1 |  123 | 
----------------- 
| 2 |  0 | 
----------------- 
| 3 |  456 | 
----------------- 
| 4 |  0 | 
----------------- 

以前的數據庫查詢是:

$sql = "SELECT id FROM temp_table WHERE other_id = '{$other_id}'"; 
$result = mysql_query($sql, $db) 
return mysql_fetch_assoc($result); 

該查詢被稱爲$other_idNULL(「空」在PHP中,而不是字符串或任何東西)。

結果的mysql_query:這給我的價值觀2,4

PDO等效代碼:

$sql = "SELECT id FROM temp_table WHERE other_id = :other_id"; 
$sth = $dbConnection->prepare($sql); 
$sth->bindValue(":other_id", $other_id); 
$sth->execute(); 
return $sth->fetchAll(PDO::FETCH_COLUMN); 

結果PDO:這讓沒有價值可言。

這是我以前沒有遇到過的奇怪問題(因爲我是更多的Java開發人員,並且最近在幾年後觸及了PHP)。

作爲一種解決方法,我必須將pod輸出結果返回2,4以下行,但想更多地瞭解上述差異。

$sth->bindValue(":other_id", empty($other_id) ? 0 : $other_id); 

我也試過$sth->bindValue(":other_id", $other_id, PDO::PARAM_INT);這並沒有幫助

+1

會有什麼不同?更新:剛剛更改爲'bindParam'仍然是相同的問題 – Abubakkar

+2

從技術上講,數據庫中的'0'是* NOT NULL *,所以如果您爲'$ other_id'傳入'NULL',它*不應匹配... I爲什麼它使用*在'mysql_'擴展名下工作會更困惑 - 它不應該完成。 – CD001

+0

不是真的回答你的問題,而是空($ other_id)? 0:$ other_id'你也可以做'(int)$ other_id' –

回答

4

這是不是與mysql_ VS PDO差的問題,而是與類型戲法。

在第一個非PDO例如,$other_id被轉換爲查詢字符串,那麼您的查詢看起來是這樣的:

SELECT id FROM temp_table WHERE other_id = ''; 

的MySQL把一個空字符串一樣0爲數字字段在查詢期間鍵入,因此您的查詢實際上正確匹配兩個記錄。

在PDO例子,因爲你正在傳遞$other_id(這是null),查詢勢必如下:

SELECT id FROM temp_table WHERE other_id = NULL; 

MySQL不會把0作爲NULL,讓你發送查詢實際上是不一樣的。

4

這是我以前沒有遇到的奇怪問題。

這裏沒有什麼奇怪的。

$other_idNULL所述第一查詢變爲:

SELECT id FROM temp_table WHERE other_id = '' 

由於other_id列的類型是數字的,所提供的值(空字符串)is converted to the number 0並且有兩個匹配的行。

在另一方面,通過PDO發送的查詢等效於:

SELECT id FROM temp_table WHERE other_id = NULL 

不僅如此沒有NULL S IN的表,但此查詢不會返回任何行,即使有行在列other_id中具有NULL。 (選擇other_idNULL的行的正確方法是使用IS NULL operator)。