我查看了MySqli中的预处理语句,从过滤的角度来看一切正常(personID必须是数字)。但是,当我使用store_result(循环记录)时,过滤似乎停止了。例如:
$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 :(得分: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)