在PHP中构建准备好的语句时,我们是否需要测试bind_param的返回值



链接的问题在这里。

我已经将链接问题中的代码升级为使用预先准备好的语句。

我现在有:

$stmt = $conn->prepare("INSERT INTO `workbook-data` (`workbook-language`, `gui-language`, `foreign-language-group-mode`, `version`) VALUES (?, ?, ?, ?)");
$stmt->bind_param('ssis', $mwblang, $guilang, $flgmode, $version);
$mwblang = mysqli_real_escape_string($conn, $_GET['mwblang']);
$guilang = mysqli_real_escape_string($conn, $_GET['guilang']);
$flgmode = mysqli_real_escape_string($conn, $_GET['flg']);
$version = mysqli_real_escape_string($conn, $_GET['version'] ?? '210061');
if ($stmt->execute()) {
echo "<br>" . "New record created successfully";
} else {
echo "Error: " .  mysqli_error($conn);
}
$stmt->close();

根据bind_param的文档,它对返回值进行了说明:

成功时返回true,失败时返回false。

在这些官方示例中,它们似乎不会对失败进行任何错误检查。我们应该测试返回值吗?我已经为execute()这样做了,但我不确定需要多少检查。

您不应该检查任何mysqli函数的返回值。这毫无意义。当您启用正确的mysqli错误报告时,您将自动被告知所有错误。

如果您出于某种奇怪的原因决定保持错误报告静音,那么您必须检查每个mysqli函数调用,包括bind_param()。如果您确实检查了返回值,请确保永远不要在屏幕上显示错误消息。将错误记录到安全的文件中。

所以,你的代码应该是这样的:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli('localhost', 'user', 'password', 'test');
$conn->set_charset('utf8mb4'); // always set the charset
// ...
$stmt = $conn->prepare("INSERT INTO `workbook-data` (`workbook-language`, `gui-language`, `foreign-language-group-mode`, `version`) VALUES (?, ?, ?, ?)");
$stmt->bind_param('ssis', $mwblang, $guilang, $flgmode, $version);
$stmt->execute();

或者像这样:

mysqli_report(MYSQLI_REPORT_OFF);
$conn = new mysqli('localhost', 'user', 'password', 'test');
if ($conn->connect_errno) {
error_log($conn->connect_error);
}
if (false === $conn->set_charset('utf8mb4')) {
error_log($conn->error);
}
// ...
if (false === ($stmt = $conn->prepare("INSERT INTO `workbook-data` (`workbook-language`, `gui-language`, `foreign-language-group-mode`, `version`) VALUES (?, ?, ?, ?)"))) {
error_log($conn->error);
}
if (false === $stmt->bind_param('ssis', $mwblang, $guilang, $flgmode, $version)) {
error_log($stmt->error);
}
if (false === $stmt->execute()) {
error_log($stmt->error);
}

请注意,根据您调用的函数,有三种不同的读取错误消息的方法。手动错误检查要详细得多。

最新更新