我正在使用打开严格模式的 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 的值不会被更新。
在这种情况下,我对成功的定义:
- 它插入了记录或更新了记录,或者如果没有进行任何更改,则什么也不做
- 它没有“默默地破坏我的数据”
许多新手程序员错误地认为查询成功而没有检查返回值或警告。他们的代码工作......在正常条件下。
我的问题是: “考虑到我的代码,打开了严格模式,并且我已经完成了错误检查,假设查询成功是否安全?这是正确还是不正确的假设?我是否也应该检查警告还是那样是多余的吗?”