2011-10-18 129 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绑定的参数只会确保发送到数据库的内容是它所期望的类型。如果类型不正确,它不会中止 - 这仍然是您的应用程序的责任。 –