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

Tek*_*kus 3 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();
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ski 5

i您提供的整数类型是 MySQLi 将该值传递到查询中的类型。然而,API 本身实际上并不关心它获取的值是字符串还是整数。PHP/MySQLi 在将字符串传递给 RDBMS 时一定会将其转换为整数。

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

echo (int)'a';
// 0
Run Code Online (Sandbox Code Playgroud)

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

update app_site_group set name_eng = 'one', name_fra = 'two'  where app_site_group_id = 0 
Run Code Online (Sandbox Code Playgroud)

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