傅樟星 發表於 2026-5-3 17:23:08

使用PHP连接MySQL数据库的多种方及错误处理

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、连接MySQL的常见方法</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">1. 使用MySQLi扩展</a></li><ul class="third_class_ul"><li><a href="#_label3_0_0_0">1.1 面向过程方式</a></li><li><a href="#_label3_0_0_1">1.2 面向对象方式</a></li></ul><li><a href="#_lab2_0_1">2. 使用PDO扩展</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label1">二、错误处理与调试</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">1. 常见错误原因</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_3">2. 错误捕获方法</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_1_4">3. 环境检查</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label2">三、安全与最佳实践</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">四、进阶操作示例</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_5">1. 执行查询(MySQLi面向对象)</a></li><ul class="third_class_ul"></ul><li><a href="#_lab2_3_6">2. 事务处理(PDO)</a></li><ul class="third_class_ul"></ul></ul><li><a href="#_label4">五、总结</a></li><ul class="second_class_ul"></ul></ul></div><p>以下是使用PHP连接MySQL数据库的详细指南,涵盖多种方法、错误处理及最佳实践,供不同需求的开发者参考:</p>
<p class="maodian"><a name="_label0"></a></p><h2>一、连接MySQL的常见方法</h2>
<p>PHP支持多种方式连接MySQL数据库,主要推荐使用&nbsp;<strong>MySQLi扩展</strong>(面向MySQL优化)和&nbsp;<strong>PDO扩展</strong>(支持多数据库)。以下分别介绍具体实现:</p>
<p class="maodian"><a name="_lab2_0_0"></a></p><h3>1. 使用MySQLi扩展</h3>
<p>MySQLi支持面向过程和面向对象两种编程风格,且兼容MySQL最新特性(如预处理语句)。</p>
<p class="maodian"><a name="_label3_0_0_0"></a></p><h4>1.1 面向过程方式</h4>
<div class="jb51code"><pre class="brush:php;">&lt;?php
$servername = "localhost";// 数据库服务器地址
$username = "root";      // 数据库用户名
$password = "";            // 数据库密码
$dbname = "test";          // 数据库名称

// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 检查连接状态
if (!$conn) {
    die("连接失败: " . mysqli_connect_error()); // 输出错误信息并终止脚本
}
echo "连接成功";

// 关闭连接(可选,脚本结束会自动关闭)
mysqli_close($conn);
?&gt;
</pre></div>
<p><strong>关键点</strong>:</p>
<ul><li><code>mysqli_connect()</code>&nbsp;参数依次为服务器地址、用户名、密码、数据库名(可选)。</li><li><code>mysqli_connect_error()</code>&nbsp;返回详细的连接错误信息。</li></ul>
<p class="maodian"><a name="_label3_0_0_1"></a></p><h4>1.2 面向对象方式</h4>
<div class="jb51code"><pre class="brush:php;">&lt;?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";

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

// 检查连接状态
if ($conn-&gt;connect_error) {
    die("连接失败: " . $conn-&gt;connect_error);
}
echo "连接成功";

// 关闭连接
$conn-&gt;close();
?&gt;
</pre></div>
<p><strong>优势</strong>:</p>
<ul><li>更符合现代面向对象编程习惯。</li><li>支持事务处理、预处理等高级功能。</li></ul>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>2. 使用PDO扩展</h3>
<p>PDO(PHP Data Objects)提供统一的接口支持多种数据库(如MySQL、PostgreSQL),适合需要跨数据库兼容性的项目。</p>
<div class="jb51code"><pre class="brush:php;">&lt;?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";

try {
    // 创建PDO实例
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
   
    // 设置错误模式为异常捕获
    $conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "连接成功";
} catch(PDOException $e) {
    echo "连接失败: " . $e-&gt;getMessage(); // 捕获并输出异常信息
}

// 关闭连接(置为null即可)
$conn = null;
?&gt;
</pre></div>
<p><strong>关键点</strong>:</p>
<ul><li>连接字符串格式:<code>mysql:host=主机名;dbname=数据库名</code>。</li><li><code>setAttribute()</code>&nbsp;设置错误处理模式,推荐使用异常机制提高代码健壮性。</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>二、错误处理与调试</h2>
<p>连接失败可能由多种原因引起,需针对性处理:</p>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>1. 常见错误原因</h3>
<ul><li>MySQL服务未启动</li><li>用户名/密码错误</li><li>权限不足(如远程连接未授权)</li><li>PHP未启用MySQL扩展</li></ul>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>2. 错误捕获方法</h3>
<p><strong>MySQLi</strong>:通过返回值检查或异常捕获:</p>
<div class="jb51code"><pre class="brush:php;">if (!$conn) {
    die("错误代码: " . mysqli_connect_errno() . ",详细信息: " . mysqli_connect_error());
}
</pre></div>
<p><strong>PDO</strong>:通过<code>try-catch</code>捕获异常:</p>
<div class="jb51code"><pre class="brush:php;">try {
    // 连接代码
} catch (PDOException $e) {
    echo "错误信息: " . $e-&gt;getMessage();
}
</pre></div>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>3. 环境检查</h3>
<ul><li><strong>检查扩展是否启用</strong>:在PHP文件中运行<code>phpinfo()</code>,查看是否存在<code>mysqli</code>或<code>pdo_mysql</code>模块。</li><li><strong>修改php.ini</strong>:取消注释<code>extension=mysqli</code>和<code>extension=pdo_mysql</code>,重启Web服务。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>三、安全与最佳实践</h2>
<p><strong>1:避免使用已弃用的mysql扩展</strong></p>
<p>PHP 7+已移除<code>mysql_connect()</code>,需使用MySQLi或PDO。</p>
<p><strong>2:使用预处理语句防止SQL注入</strong></p>
<p>示例(MySQLi预处理):</p>
<div class="jb51code"><pre class="brush:php;">$stmt = $conn-&gt;prepare("SELECT * FROM users WHERE email = ?");
$stmt-&gt;bind_param("s", $email);
$stmt-&gt;execute();
</pre></div>
<p><strong>3:敏感信息保护</strong></p>
<p>将数据库凭据存储在独立配置文件中,并设置文件权限禁止外部访问。</p>
<p><strong>4:连接池与持久连接</strong></p>
<p>高并发场景可使用连接池(如Swoole)或PDO持久连接(<code>new PDO(..., )</code>)优化性能。</p>
<p class="maodian"><a name="_label3"></a></p><h2>四、进阶操作示例</h2>
<p class="maodian"><a name="_lab2_3_5"></a></p><h3>1. 执行查询(MySQLi面向对象)</h3>
<div class="jb51code"><pre class="brush:php;">$sql = "SELECT id, name FROM users";
$result = $conn-&gt;query($sql);

if ($result-&gt;num_rows &gt; 0) {
    while($row = $result-&gt;fetch_assoc()) {
      echo "ID: " . $row["id"]. " - Name: " . $row["name"]. "&lt;br&gt;";
    }
} else {
    echo "0 结果";
}
</pre></div>
<p class="maodian"><a name="_lab2_3_6"></a></p><h3>2. 事务处理(PDO)</h3>
<div class="jb51code"><pre class="brush:php;">try {
    $conn-&gt;beginTransaction();
    // 执行多条SQL
    $conn-&gt;exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
    $conn-&gt;exec("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2");
    $conn-&gt;commit();
} catch (Exception $e) {
    $conn-&gt;rollBack();
    echo "事务失败: " . $e-&gt;getMessage();
}
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>五、总结</h2>
<table><tbody><tr><th>方法</th><th>适用场景</th><th>优势</th></tr><tr><td><strong>MySQLi</strong></td><td>纯MySQL项目、需使用MySQL特性</td><td>高性能、支持预处理和事务</td></tr><tr><td><strong>PDO</strong></td><td>多数据库支持、强调代码可移植性</td><td>统一接口、强大的错误处理机制</td></tr></tbody></table>
<p><strong>推荐选择</strong>:</p>
<ul><li>新手或小型项目:从MySQLi面向过程入手,简单直接。</li><li>中大型或跨数据库项目:优先使用PDO,提升安全性和扩展性。</li></ul>
<p>通过合理选择连接方式、严格错误处理、遵循安全规范,可构建高效稳定的PHP数据库应用。</p>
頁: [1]
查看完整版本: 使用PHP连接MySQL数据库的多种方及错误处理