准备好的语句,绑定错误的数据不会引发错误

时间:2013-02-07 20:49:20

标签: php mysql mysqli prepared-statement

为什么绑定到无效类型的参数时,我没有收到错误?例如:

$mysqli = new mysqli(HOST, USERNAME, PASSWORD, SCHEMA);
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}

$stmt = $mysqli->prepare("update app_site_group set name_eng=?, name_fra=? where app_site_group_id=?");

$one = "one";
$two = "two";
$three = "a";
$stmt->bind_param('ssi',$one,$two,$three);

$stmt->execute();

当期望整数时,第三个参数作为字符串传递。它不会抛出错误(除了影响0行)。

1 个答案:

答案 0 :(得分:3)

您提供的整数i是MySQLi将值传递给查询的类型。但是,API本身并不关心它是获取字符串还是整数的值。在将字符串传递给RDBMS时,PHP / MySQLi将确保字符串转换为整数。

因此,看起来数字的字符串将被强制转换为等效的整数。对于'a'之类的非数字字符串,结果将是整数0,可能与数据中的行匹配也可能不匹配。

echo (int)'a';
// 0

因此,在您的情况下,执行的查询看起来像

update app_site_group set name_eng = 'one', name_fra = 'two'  where app_site_group_id = 0 

如果您有app_site_group_id = 0行,那么这些行就会匹配。因此,除了使用预准备语句之外,始终验证参数的内容非常重要,因此您确定它们包含合理的值。