我正在使用启用了严格模式的MySQL。我正在通过HTML表单插入用户提供的数据。我已经完成了所有验证,这是最后一步。
以下是我的PHP代码的摘录:
$sql = 'SET sql_mode = TRADITIONAL'; //last chance data validation
$mysqli->query($sql) or output_error('Database Error: Failed to set SQL mode');
$db_err_msg = 'Database Error: Failed to update profile summary';
$sql = "INSERT INTO {$tables['text']} (lngProfileId, memProfileText) VALUES(?, ?)
ON DUPLICATE KEY UPDATE memProfileText = VALUES(memProfileText)";
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg);
$stmt->bind_param('is', $profile_id, $_POST['memProfileText'])
or output_error($db_err_msg);
$stmt->execute() or output_error($db_err_msg);
$stmt->close();
//if code reaches this point, can it assume insert/update succeeded?
注意: output_error
是致命错误的错误处理程序。它没有回归;它会退出。
我需要检查警告吗?或者我可以安全地假设插入/更新成功吗?是否有某些情况可能会导致警告而不是错误,即使打开了严格模式?
编辑:我只关心应该被视为致命错误的事情。如果它被更新而不是插入,那对我来说无关紧要。这不是错误。
此外,last_insert_id
和affected_rows
在这种情况下毫无意义。如果用户没有进行任何更改,affected_rows将为0,并且不会更新last_insert_id的值。
在这种情况下,我对的定义成功了:
许多新手程序员错误地认为假设查询成功而没有检查返回值或警告。他们的代码在正常条件下工作。
我的问题是: “考虑到我的代码,打开严格模式,并且我已经完成了错误检查,假设查询成功是否安全?这是正确的吗?或不正确的假设?我是否也应该检查警告或者是多余的?“
答案 0 :(得分:1)
您应该检查mysqli::info()
功能的值。
如果它插入数据,字符串将看起来像这样,
Records: 1 Duplicates: 0 Warnings: 0
另一个功能是mysqli::affected_rows
。它返回上次插入/更新/删除查询所影响的行数。
答案 1 :(得分:0)
是的,你可以放心地假设,但只是为了仔细检查获取插入的最新记录的ID。如果有id,则插入
答案 2 :(得分:0)
虽然我认为这可能是一个安全的假设,但我认为比抱歉更安全。我在close语句之前的execute语句之后直接添加了以下代码。
//I think this is probably redundant, but just in case
if ($mysqli->warning_count) {
$warnings = $stmt->get_warnings();
do {
trigger_error('Database Warning (' . $warnings->errno . '): '
. $warnings->message, E_USER_WARNING);
} while ( $warnings->next() );
}
我添加了评论,以便记得为什么我这样做。