PHP连接MySQL实战:从老旧扩展迁移到PDO/MySQLi指南
在PHP开发中,数据库操作是核心环节。本文将分析传统的MySQL连接方法,并详细演示如何使用更安全的PDO和MySQLi扩展来执行数据库连接、增删改查操作。
传统MySQL扩展的演变与局限
过去,PHP开发者常使用mysql_*系列函数(如mysql_connect、mysql_query)操作数据库。然而,这些函数存在几个显著问题:
- 安全性不足:原生不支持预处理语句,容易导致SQL注入攻击。
- 非持久性:
mysql_pconnect虽提供持久连接,但管理复杂且易耗尽资源。 - 已废弃:PHP 5.5起标记为弃用,PHP 7.0起完全移除。
因此,现代PHP项目必须转向PDO或MySQLi扩展。
推荐方案一:使用PDO连接数据库
PDO(PHP Data Objects)提供了一种统一的接口访问多种数据库,支持预处理语句,是PHP官方推荐的数据库访问层。
第1步:建立PDO连接
目的:创建到MySQL服务器的安全连接实例。
$dsn = 'mysql:host=localhost;dbname=MyDatabase;charset=utf8';
$username = 'username';
$password = 'password';
try {
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
die("数据库连接失败: " . $e->getMessage());
}第2步:执行查询并获取数据
目的:使用预处理语句防止SQL注入,并安全地提取结果。
// 插入数据示例
$stmt = $pdo->prepare('INSERT INTO MyTable (name, id) VALUES (:name, :id)');
$stmt->execute(['name' => 'CheneyFu', 'id' => 5]);
echo "新增记录影响行数: " . $pdo->lastInsertId() . "\n";
// 查询数据示例
$stmt = $pdo->query('SELECT name FROM MyTable WHERE id > 65');
while ($row = $stmt->fetch()) {
echo "名称: {$row['name']}\n";
}
第3步:获取受影响行数
对于UPDATE、DELETE或INSERT操作,可使用PDOStatement::rowCount()确认执行结果:
$stmt = $pdo->prepare('UPDATE MyTable SET name = ? WHERE id >= 5');
$stmt->execute(['NewName']);
$count = $stmt->rowCount();
echo "更新了 $count 条记录";备选方案二:使用MySQLi对象模式
如果确定仅使用MySQL数据库,MySQLi也是高性能的选择。它提供了面向对象和过程式两种API,本例以面向对象为主。
第1步:初始化MySQLi连接
$mysqli = new mysqli("localhost", "username", "password", "MyDatabase");
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}第2步:预处理与绑定参数
// 准备SQL语句
$stmt = $mysqli->prepare("INSERT INTO MyTable (id, name) VALUES (?, ?)");
$param_id = 5;
$param_name = 'TestUser';
// 绑定参数 (i=integer, s=string)
$stmt->bind_param("is", $param_id, $param_name);
$stmt->execute();
// 获取影响行数
echo "受影响行数: " . $stmt->affected_rows . "\n";关键操作对比总结
| 功能 | 旧版 mysql_* (已废弃) | PDO | MySQLi (面向对象) |
|---|---|---|---|
| 连接 | mysql_connect() | new PDO(...) | new mysqli(...) |
| 执行SQL | mysql_query() | $pdo->query() / prepare() | $mysqli->query() / prepare() |
| 获取单行 | mysql_fetch_row() | $stmt->fetch(PDO::FETCH_ASSOC) | $result->fetch_assoc() |
| 获取所有行 | 循环调用 fetch | $stmt->fetchAll() | 循环调用 fetch |
| 最近插入ID | mysql_insert_id() | $pdo->lastInsertId() | $mysqli->insert_id |
| 错误处理 | 返回false | 抛出异常 (需try-catch) | $mysqli->error |
排错与维护建议
如果在迁移过程中遇到“Call to undefined function mysql_connect”错误,说明服务器运行的是PHP 7+版本,必须全部替换为PDO或MySQLi代码。此外,务必开启display_errors = Off并将错误记录至日志,避免将数据库细节暴露给前端用户。
简要总结
掌握现代PHP数据库连接方法是Web开发的必修技能。通过摒弃老旧的mysql_*函数,采用支持预处理的MySQLi,不仅能消除安全隐患,还能提升应用的可维护性。以上就是PHP MySQL常用函数与现代化迁移的详细内容,更多关于PHP开发技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













