1

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

$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 行)。

4

1 回答 1

3

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

因此,看起来像数字的字符串将被转换为它们的等效整数。对于像 your 这样的非数字字符串'a',结果将是 integer 0,它可能与数据中的行匹配,也可能不匹配。

echo (int)'a';
// 0

所以在你的情况下,执行的查询看起来像

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

如果你有行 where app_site_group_id = 0,那么那些会被匹配。因此,除了使用准备好的语句之外,重要的是始终验证参数的内容,以确保它们包含合理的值。

于 2013-02-07T20:54:50.967 回答