在 PHP 中使用 mysqli 进行数据库操作时,经常会遇到需要打印错误信息的情况。通常,mysqli 扩展提供了错误代码 (mysqli::$errno) 和错误信息 (mysqli::$error),可以帮助我们在发生错误时及时反馈问题。但是,如何优雅地打印这些错误信息,让错误日志更加清晰、易于调试呢?本文将向您展示如何在 PHP 中优雅地使用 mysqli::$errno 打印错误代码和错误信息。
首先,我们来看一下 PHP 中如何使用 mysqli 进行数据库连接和基本的错误处理。在 mysqli 连接对象中,错误信息和错误代码可以通过 mysqli::$error 和 mysqli::$errno 属性获取。
<?php
$host = 'localhost';
$username = 'root';
$password = 'password';
$database = 'test_db';
// 创建 MySQLi 连接
$conn = new mysqli($host, $username, $password, $database);
// 检查连接是否成功
if ($conn->connect_error) {
echo "连接失败: " . $conn->connect_error;
exit();
}
// 执行查询
$sql = "SELECT * FROM non_existing_table";
$result = $conn->query($sql);
// 检查查询是否成功
if (!$result) {
// 打印错误代码和错误信息
echo "错误代码: " . $conn->errno . "<br>";
echo "错误信息: " . $conn->error;
}
// 关闭连接
$conn->close();
?>
使用 connect_error 检查数据库连接是否成功。
使用 errno 和 error 获取错误代码和错误信息。
在执行查询时,如果出现错误,通过 errno 和 error 输出详细信息。
直接输出错误信息虽然有效,但在生产环境中,通常我们希望记录错误日志并避免将敏感信息暴露给最终用户。在实际开发中,优雅的错误处理方式不仅可以帮助开发人员快速定位问题,也能提高系统的安全性和用户体验。
我们可以使用 error_log() 函数将错误信息写入日志文件。以下是改进后的代码:
<?php
$host = 'localhost';
$username = 'root';
$password = 'password';
$database = 'test_db';
$conn = new mysqli($host, $username, $password, $database);
if ($conn->connect_error) {
// 使用 error_log 记录连接错误
error_log("连接失败: " . $conn->connect_error, 3, "/var/log/php_errors.log");
exit();
}
$sql = "SELECT * FROM non_existing_table";
$result = $conn->query($sql);
if (!$result) {
// 记录错误日志
error_log("错误代码: " . $conn->errno . " 错误信息: " . $conn->error, 3, "/var/log/php_errors.log");
// 输出友好的错误信息
echo "操作失败,请稍后再试。";
}
$conn->close();
?>
使用 error_log() 将错误信息写入指定的日志文件(如 /var/log/php_errors.log)。
将用户友好的错误信息显示在前端,避免暴露过多的技术细节。
通过 3 参数设置将错误写入文件。
在生产环境中,我们通常会禁用 PHP 的错误显示,而是记录到日志中。为了防止敏感的错误信息暴露给终端用户,我们可以通过修改 php.ini 或使用以下代码禁用错误输出:
<?php
// 禁用错误显示
ini_set('display_errors', '0');
// 启用错误日志记录
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php_errors.log');
// 连接数据库并执行查询
$conn = new mysqli($host, $username, $password, $database);
if ($conn->connect_error) {
// 记录连接错误
error_log("连接失败: " . $conn->connect_error, 3, "/var/log/php_errors.log");
exit();
}
$sql = "SELECT * FROM non_existing_table";
$result = $conn->query($sql);
if (!$result) {
// 记录错误信息
error_log("错误代码: " . $conn->errno . " 错误信息: " . $conn->error, 3, "/var/log/php_errors.log");
echo "操作失败,请稍后再试。";
}
$conn->close();
?>
ini_set('display_errors', '0'):禁用错误显示。
ini_set('log_errors', '1'):启用错误日志记录。
错误信息通过 error_log() 函数记录到指定的文件。
为了使错误处理更加灵活,我们可以定义一个自定义的错误处理函数,在其中统一处理 mysqli::$errno 和 mysqli::$error。这样可以减少重复代码,并提高代码的可维护性。
<?php
// 自定义错误处理函数
function handleMysqliError($conn) {
// 将错误记录到日志
error_log("错误代码: " . $conn->errno . " 错误信息: " . $conn->error, 3, "/var/log/php_errors.log");
// 显示友好的错误信息
echo "操作失败,请稍后再试。";
}
// 创建数据库连接
$conn = new mysqli($host, $username, $password, $database);
if ($conn->connect_error) {
handleMysqliError($conn);
exit();
}
$sql = "SELECT * FROM non_existing_table";
$result = $conn->query($sql);
if (!$result) {
handleMysqliError($conn);
}
$conn->close();
?>
handleMysqliError 函数封装了错误处理的逻辑。
在发生错误时,直接调用该函数,既简化了代码,又确保了统一的错误处理方式。
在 PHP 中,使用 mysqli::$errno 和 mysqli::$error 打印错误信息是非常常见的需求。为了让错误处理更加优雅和安全,我们可以通过日志记录、禁用错误输出、使用自定义错误处理函数等方式,来提升系统的健壮性和用户体验。
希望本文能帮助你更好地理解如何在 PHP 中优雅地处理数据库操作中的错误。如果有任何问题,欢迎留言讨论!