马黑黑 发表于 2026-4-9 12:44

PHP连接MySQL数据库的错误处理

<style>
        .artBox { font: normal 18px/1.5 sans-serif; overflow: auto; position: relative; }
        .artBox p { margin: 10px 0; }
        .artBox h1, .artBox h2 { margin: 8px 0; }
        .artBox code, .artBox pre { background: #f7f4f3; padding: 2px 6px; tab-size: 4; }
        .artBox pre { padding: 10px 20px; white-space: pre-wrap; word-wrap: break-word; }
        .artBox pre code { padding: 0; background: none; }
        .artBox blockquote { margin: 10px 20px; padding: 2px 15px; border-left: 3px solid skyblue; background: #e7e5e3; }
</style>

<div class="artBox">
    <p>先看网上各类教程最流行的连接方式:</p>
    <pre><code>&lt;?php
$servername = 'localhost'; // 数据库服务器名
$username = 'root';      // 数据库用户名
$password = '123456';      // 数据库密码

// 创建连接
$conn = new mysqli($servername, $username, $password);

// 检测连接
if ($conn-&gt;connect_error) {
    die("连接失败: " . $conn-&gt;connect_error);
}

echo "成功连接数据库";
?&gt;</code></pre>
    <p>作为教学,上述代码没毛病,问题是,在实际应用中——包括开发环境和工作环境——这种做法并不靠谱!具体表现为:当 mysqli 所需参数只要任意一个存在错误,创建连接时就会直接报错,检测连接模块根本没有机会运行!</p>
    <p>解决方法很多,这里提供一个兼容多数PHP版本的方式进行连接,用的是
      <code>try ... catch ...</code> 语句:
    </p>
    <pre><code>&lt;?php
$servername = 'localhost'; // 数据库服务器名
$username = 'root';      // 数据库用户名
$password = '123456';      // 数据库密码

try {
    $conn = new mysqli($servername, $username, $password);
    // 检测连接
    if ($conn-&gt;connect_error) {
      die("连接失败: " . $conn-&gt;connect_error);
    }
} catch (mysqli_sql_exception $e) {
    die("连接失败: " . $e-&gt;getMessage());
}

echo "成功连接数据库";
?&gt;</code></pre>
    <p>就是说,用
      <code>try ... catch ...</code> 取代了前面代码中的连接和检测,其它不变。
    </p>
    <p>有人可能会说:可以不必要这么麻烦,给 new mysqli 加前导词
      <code>@</code> 就可以解决问题。是,
      <code>@</code> 可以屏蔽错误,但不是百分百,试看:
    </p>
    <blockquote>
      <p>
            <strong>警告</strong> :PHP 8.0.0 之前,如果错误被 @ 运算符抑制,则在自定义错误处理程序中调用 error_reporting() 将始终返回 0。PHP 8.0.0 起,返回(按位)表达式的值:E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE。
      </p>
    </blockquote>
    <p>所以说,为万全起见,还是尽可能不使用
      <code>@</code> 运算符来抑制错误。
    </p>
</div>

红影 发表于 2026-4-9 18:06

又是冷门知识呢,论坛里玩的人很少有人去管数据库连接的事。
不过学习一下也是好的,感谢黑黑好帖{:4_187:}

马黑黑 发表于 2026-4-9 18:20

红影 发表于 2026-4-9 18:06
又是冷门知识呢,论坛里玩的人很少有人去管数据库连接的事。
不过学习一下也是好的,感谢黑黑好帖{:4_187: ...

PHP可以可以选择,但数据库应该是前端绕不开的

梦江南 发表于 2026-4-9 18:52

虽然不懂,看看也是涨知识。黑黑老师辛苦了!{:4_190:}

马黑黑 发表于 2026-4-9 20:43

梦江南 发表于 2026-4-9 18:52
虽然不懂,看看也是涨知识。黑黑老师辛苦了!

这个不懂没关系的

红影 发表于 2026-4-9 22:47

马黑黑 发表于 2026-4-9 18:20
PHP可以可以选择,但数据库应该是前端绕不开的

对专业人士来说肯定绕不开,对不懂的就悄悄逃了 {:4_173:}

马黑黑 发表于 2026-4-9 23:11

红影 发表于 2026-4-9 22:47
对专业人士来说肯定绕不开,对不懂的就悄悄逃了
实际上也绕不开。比如把,数据库出错了,你就无法正常访问论坛

梦江南 发表于 2026-4-11 11:05

马黑黑 发表于 2026-4-9 20:43
这个不懂没关系的

黑黑老师,可以不懂吗?

马黑黑 发表于 2026-4-11 12:34

梦江南 发表于 2026-4-11 11:05
黑黑老师,可以不懂吗?

美人能懂世间全部的东东

红影 发表于 2026-4-11 19:05

马黑黑 发表于 2026-4-9 23:11
实际上也绕不开。比如把,数据库出错了,你就无法正常访问论坛

可以请专业人士去处理的啊{:4_173:}

马黑黑 发表于 2026-4-11 21:39

红影 发表于 2026-4-11 19:05
可以请专业人士去处理的啊

他处理之前你是无法访问的

红影 发表于 2026-4-12 12:01

马黑黑 发表于 2026-4-11 21:39
他处理之前你是无法访问的

那是当然,没处理好之前我也不急着玩啊{:4_173:}

马黑黑 发表于 2026-4-12 12:59

红影 发表于 2026-4-12 12:01
那是当然,没处理好之前我也不急着玩啊

急也没用

红影 发表于 2026-4-12 14:08

马黑黑 发表于 2026-4-12 12:59
急也没用

是啊,知道这点,还有什么可急的{:4_173:}

马黑黑 发表于 2026-4-12 23:22

红影 发表于 2026-4-12 14:08
是啊,知道这点,还有什么可急的

但你不能说数据库可以因此绕开

红影 发表于 2026-4-14 22:55

马黑黑 发表于 2026-4-12 23:22
但你不能说数据库可以因此绕开

没绕开啊,是有人帮忙啊{:4_173:}

马黑黑 发表于 2026-4-14 22:56

红影 发表于 2026-4-14 22:55
没绕开啊,是有人帮忙啊

如此甚好

红影 发表于 2026-4-15 22:02

马黑黑 发表于 2026-4-14 22:56
如此甚好

我们又不懂,没人帮怎么行啊{:4_173:}

马黑黑 发表于 2026-4-15 22:30

红影 发表于 2026-4-15 22:02
我们又不懂,没人帮怎么行啊

你说的是交易

红影 发表于 2026-4-18 14:03

马黑黑 发表于 2026-4-15 22:30
你说的是交易

也可以说是友谊。
页: [1] 2
查看完整版本: PHP连接MySQL数据库的错误处理