我的代码当前使用mysqli::query
并检查mysqli::$warning_count
. 尝试将文本插入整数列时,0
会被插入并生成警告。但是,我刚刚开始学习准备好的语句,对于相同的查询,不会产生警告。
这是我的代码的摘录:
$db_err_msg = 'Database Error: Failed to update profile';
$sql = "UPDATE tblProfiles SET intBookId = ? WHERE lngProfileId = ?";
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg);
$book = 'CA';
$id = 10773;
$stmt->bind_param('ii', $book, $id) or output_error($db_err_msg);
$stmt->execute() or output_error($db_err_msg);
echo '$stmt->affected_rows is ', $stmt->affected_rows, "\n";
if ($mysqli->warning_count) {
$warnings = $stmt->get_warnings();
do {
trigger_error('Database Warning (' . $warnings->errno . '): '
. $warnings->message, E_USER_WARNING);
} while ( $warnings->next() );
}
else {
echo 'no warnings', "\n";
}
产生以下输出:
$stmt->affected_rows 为 1
无警告
请注意,该intBookId
列具有TINYINT
数据类型。相同的查询在使用时会生成警告mysqli::query
,但在使用准备好的语句时不会。
启用严格模式无济于事。它会在使用时将警告变成错误mysqli::query
,但在使用准备好的语句时,该列会以0
;静默更新。
作为记录,我的应用程序在达到这一点之前已经进行了广泛的验证。但我希望通过这种额外的验证来捕捉我可能错误地错过的任何东西。
注意:切换到 PDO 超出了当前项目的范围。
为什么 MySQLi 准备好的语句会发生这种情况?这是预期的行为吗?