PHP连接MySQL主要使用mysqli或PDO扩展;推荐PDO因其支持多种数据库、预处理语句防SQL注入且错误处理更优雅,适合现代开发。

PHP连接MySQL数据库的核心方法主要有两种:一是使用
mysqli
扩展,它专为MySQL数据库设计,提供了面向对象和面向过程两种API;二是使用
立即学习“PHP免费学习笔记(深入)”;
PDO
(PHP Data Objects)扩展,这是一个数据库抽象层,支持多种数据库,包括MySQL,并且在安全性方面(尤其是预处理语句)表现出色。在我看来,虽然
mysqli
功能强大,但现代开发中,
PDO
因其通用性和更优雅的错误处理机制,往往是更推荐的选择。
要让PHP与MySQL数据库“牵手”,我们通常会通过以下两种方式:
1. 使用
mysqli
扩展 (MySQL Improved Extension)
mysqli
是PHP官方推荐的MySQL数据库连接方式,因为它支持MySQL的最新特性。你可以选择面向对象或面向过程的风格。
面向对象风格 (推荐)
<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
// 生产环境不应直接暴露错误信息,应记录日志
die("连接失败: " . $conn->connect_error);
}
// 设置字符集,非常重要,避免乱码
$conn->set_charset("utf8mb4");
// 执行查询示例
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 结果";
}
// 关闭连接
$conn->close();
?>面向过程风格
<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检查连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
// 设置字符集
mysqli_set_charset($conn, "utf8mb4");
// 执行查询示例
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// 输出数据
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "0 结果";
}
// 关闭连接
mysqli_close($conn);
?>2. 使用
PDO
扩展 (PHP Data Objects)
PDO
提供了一个轻量级、一致性的接口来访问数据库。它最大的优势是,只要更换驱动,你的代码几乎不需要改动就能连接到不同类型的数据库。
<?php
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_database";
try {
// 创建PDO连接
$conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password);
// 设置PDO错误模式为异常,这样可以更好地捕获和处理错误
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "连接成功<br>";
// 执行查询示例 (使用预处理语句,更安全)
$stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests WHERE lastname = :lastname");
$stmt->bindParam(':lastname', $lastname);
$lastname = "Doe"; // 假设我们要查询姓Doe的用户
$stmt->execute();
// 设置结果集为关联数组
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach($stmt->fetchAll() as $row) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} catch(PDOException $e) {
// 生产环境不应直接暴露错误信息
die("连接失败: " . $e->getMessage());
}
// 关闭连接(PDO在脚本结束时会自动关闭,或将$conn设为null)
$conn = null;
?>这个问题,嗯,是每个PHP开发者在刚接触数据库连接时都会纠结的。简单来说,
mysqli
是“MySQL专属”的,而
PDO
则是一个“多面手”。
mysqli
,顾名思义,就是“MySQL Improved”,它专门为MySQL数据库设计,提供了更全面的MySQL特性支持,比如存储过程、多语句查询等。它的性能在纯MySQL环境下可能略有优势,而且提供了面向对象和面向过程两种API,让不同习惯的开发者都能找到舒适区。我个人觉得,如果你确定你的项目只会使用MySQL,并且你习惯了面向过程的函数调用(比如从老旧的
mysql_*
函数迁移过来),那么
mysqli
的面向过程API可能会让你感觉更熟悉。
PDO
,全称PHP Data Objects,它是一个数据库抽象层。这意味着它不只支持MySQL,通过更换不同的驱动(如
pgsql
、
sqlite
等),你可以用一套统一的API去操作多种数据库。这对于那些未来可能需要更换数据库类型,或者需要同时连接多种数据库的项目来说,简直是福音。更重要的是,
PDO
在处理预处理语句(Prepared Statements)方面做得非常出色,这对于防止SQL注入攻击至关重要。它的错误处理机制也更现代化,通常通过抛出异常来处理,配合
try...catch
块,代码会显得更整洁、健壮。
在我看来,如果你正在开发一个全新的项目,或者希望代码更具未来可扩展性、安全性更高,那么
PDO
无疑是更优的选择。它的学习曲线可能比
mysqli
的面向过程API稍陡峭一点,但从长远来看,投入是值得的。我个人在过去的项目中,也逐渐从
mysqli
转向了
PDO
,主要是看中了它的通用性和安全性。
数据库连接是应用与数据交互的第一步,也是最容易出问题的一步。网络波动、数据库服务器宕机、凭据错误等等都可能导致连接失败。有效地处理这些错误,是保证应用健壮性的关键。
对于
mysqli
扩展,连接错误通常通过检查
mysqli_connect_error()
或
mysqli_connect_errno()
来获取。比如,在
new mysqli()
或
mysqli_connect()
之后,紧接着判断连接对象是否为
false
或者错误号是否存在。如果连接失败,
mysqli_connect_error()
会返回一个描述性的错误字符串。我们通常会用
die()
语句直接终止脚本并显示错误,但在生产环境中,这绝对不是一个好做法。直接把数据库错误信息暴露给用户,不仅不友好,还可能泄露敏感信息,给攻击者提供线索。正确的姿势应该是将错误信息记录到日志文件,然后向用户显示一个友好的错误页面或提示。
// mysqli 错误处理示例
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
error_log("MySQL连接失败: " . $conn->connect_error, 0); // 记录到PHP错误日志
die("抱歉,服务暂时不可用,请稍后再试。"); // 用户友好的提示
}而
PDO
的错误处理机制则更加优雅和现代化,它主要依赖于PHP的异常处理机制。通过设置
PDO::ATTR_ERRMODE
为
PDO::ERRMODE_EXCEPTION
,
PDO
会在遇到错误时抛出
PDOException
异常。这样,你就可以使用
try...catch
块来捕获并处理这些异常。这种方式使得错误处理代码与业务逻辑分离,代码可读性更高,也更易于维护。
// PDO 错误处理示例
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// ... 后续操作
} catch(PDOException $e) {
error_log("PDO连接或查询失败: " . $e->getMessage(), 0); // 记录日志
die("抱歉,系统忙碌,请稍后再试。"); // 用户友好的提示
}在我实际开发中,我总是倾向于使用
try...catch
来处理数据库操作,这让整个应用的错误处理逻辑变得非常清晰。当出现问题时,我可以快速定位到具体的代码块,而不是在冗长的函数调用中大海捞针。
SQL注入,这个词听起来就让人头皮发麻。它是一种常见的网络安全漏洞,攻击者通过在输入框中注入恶意的SQL代码,从而绕过认证、窃取数据,甚至完全控制数据库。说实话,即使是经验丰富的开发者,也可能在不经意间留下这样的漏洞。
防止SQL注入的核心武器,就是预处理语句(Prepared Statements)。无论是
mysqli
还是
PDO
,都提供了对预处理语句的支持。它的工作原理是,你先定义好一个SQL查询的模板,其中用占位符(如
?
或命名参数
:param
)代替实际的数据。然后,你再把实际的数据“绑定”到这些占位符上,最后执行查询。数据库会先解析SQL模板,然后再处理绑定进来的数据,这样就避免了恶意数据被当作SQL指令执行的风险。
使用
mysqli
的预处理语句:
<?php
// ... 连接代码 ...
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
// 'sss' 表示参数类型,s代表string,i代表integer,d代表double
$stmt->bind_param("sss", $firstname, $lastname, $email);
// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$stmt->close();
// ... 关闭连接 ...
?>使用
PDO
的预处理语句:
<?php
// ... 连接代码 ...
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
// ... 关闭连接 ...
?>除了预处理语句,还有一些辅助措施可以提升安全性:
SELECT
INSERT
UPDATE
DELETE
DROP TABLE
GRANT
在我做项目的时候,我会把预处理语句视为数据库交互的“基本礼仪”。任何涉及用户输入的查询,都必须走预处理的流程。虽然这会增加一点点代码量,但换来的是实实在在的安全保障,这笔账怎么算都划算。
以上就是PHP怎么连接MySQL_PHP与MySQL数据库连接方法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号