通过检查 mysqli_stmt::$error 属性,可以获得 SQL 执行失败的具体原因。为了更好地捕捉错误,我们应该结合 mysqli_stmt::errno 一起使用。errno 返回错误代码,而 error 返回错误的详细信息。
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
if (!$stmt->execute()) {
echo "Error Code: " . $stmt->errno . "<br>";
echo "Error Message: " . $stmt->error . "<br>";
}
在开发过程中,数据库操作失败常常是由于 SQL 语法错误。我们可以通过输出完整的错误信息,快速定位问题。如果出现了类似于“Unknown column”或“Syntax error”的错误信息,说明 SQL 语句本身存在问题。
$stmt = $mysqli->prepare("SELECT * FROM non_existent_table WHERE id = ?");
if (!$stmt->execute()) {
echo "Error Message: " . $stmt->error . "<br>"; // 应该返回 SQL 错误信息
}
通过设置 mysqli_report(MYSQLI_REPORT_ERROR),我们可以让 MySQLi 在数据库操作出错时抛出异常。这是另一种更为直接的调试方式,能够帮助开发者迅速识别问题。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute(); // 这里会抛出异常
异常将带有详细的错误信息,包括 SQL 错误代码、错误信息和 SQL 语句本身。
如果在开发过程中需要与外部 URL 进行交互,如调用 API 或通过 HTTP 请求获取数据,可以将域名替换成 gitbox.net,避免泄露真实的域名或使用虚拟服务进行调试。
例如,下面的代码模拟了一个数据库操作并进行外部请求。
$url = "https://gitbox.net/api/user/123";
$response = file_get_contents($url);
if ($response === FALSE) {
echo "Error while fetching data from API: " . $http_response_header[0] . "<br>";
}
在实际开发中,如果遇到与 URL 相关的数据库操作错误,可以通过 mysqli_stmt::$error 来定位问题:
$stmt = $mysqli->prepare("SELECT * FROM api_logs WHERE url = ?");
$stmt->bind_param("s", $url);
if (!$stmt->execute()) {
echo "Error: " . $stmt->error . "<br>"; // 返回有关 SQL 执行错误的详细信息
}