2011-10-18 177 views
1

我看着MySqli中準備好的語句,從過濾的角度來看,一切正常(personID必須是數字)。但是,當我使用store_result(循環記錄)時,過濾似乎停止。例如:MySqli循環存儲結果

$personID = 4; 
if ($stmt = $mysqli->prepare("SELECT personName FROM people WHERE personID>?")) { 
$stmt->bind_param("s",$personID); 
$stmt->execute(); 
$stmt->store_result(); 
$stmt->bind_result($personName); 

//$stmt->fetch(); 
//$stmt->fetch_row(); 
    while($stmt->fetch()){ 
     echo $personName."<br /><br />"; 
    } 
    $stmt->close(); 
} 

這工作正常,但如果我設置:

$personID = 'bbccc'; 

它帶回的所有記錄,也就是說,它停止類型檢查和帶回的所有記錄。那麼如何維護過濾?

感謝

回答

0

這可能是因爲MySQL是鑄造串bbccc爲整數,其結果爲0。然後,您實際上選擇所有記錄,其中personId > 0,這可能是全部或全部,但之一你的行。

如果$personID是成爲一個整數值,你應該綁定它是這樣,而不是作爲一個字符串比:

$stmt->bind_param("i", $personID); 

在行動中看到這種行爲,執行以下查詢:

mysql> SELECT CAST('bbbcc' AS UNSIGNED); 
+---------------------------+ 
| CAST('bbbcc' AS UNSIGNED) | 
+---------------------------+ 
|       0 | 
+---------------------------+ 
1 row in set, 1 warning (0.00 sec) 
+0

感謝邁克爾,有道理,但我必須鍵入檢查所有參數?我試過$ stmt-> bind_param(「我」,$ personID);但是php \ mysqli仍然試圖用相同的結果解析一個int。再次感謝。 – user1002120

+0

@ user1002120綁定的參數只會確保發送到數據庫的內容是它所期望的類型。如果類型不正確,它不會中止 - 這仍然是您的應用程序的責任。 –