PHP 连接 MySQL 的方式详解
在 PHP 中,可以使用以下三种主要方式连接 MySQL 数据库:
MySQLi(MySQL Improved)
- 适用于 MySQL 数据库。
- 支持面向过程和面向对象两种风格。
- 提供预处理语句,提高安全性,防止 SQL 注入。
PDO(PHP Data Objects)
- 适用于多种数据库(MySQL、PostgreSQL、SQLite 等)。
- 仅支持面向对象风格。
- 预处理语句功能更强,推荐使用。
MySQL 扩展(已废弃)
mysql_connect()在 PHP 5.5 版本开始废弃,PHP 7 及以上版本不再支持。- 不建议使用!
1. 使用 MySQLi 连接 MySQL
1.1 过程化风格连接 MySQL
<?php
$servername = "localhost"; // 服务器地址
$username = "root"; // MySQL 用户名
$password = ""; // MySQL 密码
$database = "testdb"; // 数据库名称
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $database);
// 检测连接是否成功
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
echo "连接成功";
?>
1.2 面向对象风格连接 MySQL
<?php
$servername = "localhost";
$username = "root";
$password = "";
$database = "testdb";
// 创建连接
$conn = new mysqli($servername, $username, $password, $database);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
1.3 关闭 MySQL 连接
mysqli_close($conn); // 过程化
$conn->close(); // 面向对象
2. 使用 PDO 连接 MySQL(推荐)
PDO(PHP Data Objects)是一个数据库抽象层,支持多种数据库类型,如 MySQL、PostgreSQL、SQLite 等。
2.1 使用 PDO 连接 MySQL
<?php
$dsn = "mysql:host=localhost;dbname=testdb;charset=utf8mb4";
$username = "root";
$password = "";
try {
$pdo = new PDO($dsn, $username, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION // 启用异常模式
]);
echo "连接成功";
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>
2.2 关闭 PDO 连接
$pdo = null;
3. 连接 MySQL 时的常见错误与解决方案
3.1 连接超时或拒绝访问
- 错误信息
Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES)
- 解决方案
- 检查 MySQL 账号密码是否正确。
- 检查 MySQL 是否允许远程访问。
- 检查防火墙是否阻挡 3306 端口(默认 MySQL 端口)。
3.2 数据库不存在
- 错误信息
Warning: mysqli_connect(): (HY000/1049): Unknown database 'testdb'
- 解决方案
- 使用
SHOW DATABASES;检查数据库是否存在:sql SHOW DATABASES; - 使用
CREATE DATABASE testdb;创建数据库。
3.3 编码问题(中文乱码)
- 解决方案
在连接 MySQL 时,指定utf8mb4编码:
mysqli_set_charset($conn, "utf8mb4");
或者在 PDO 连接字符串中添加 charset=utf8mb4。
4. MySQL 连接方式对比总结
| 方式 | 兼容性 | 语法风格 | 预处理支持 | 多数据库支持 | 推荐使用 |
|---|---|---|---|---|---|
| MySQLi | 仅限 MySQL | 面向过程 & 面向对象 | ✅ 支持 | ❌ 仅限 MySQL | 推荐用于 MySQL 项目 |
| PDO | 多种数据库 | 仅面向对象 | ✅ 支持 | ✅ 支持 MySQL、PostgreSQL、SQLite 等 | 强烈推荐 |
| MySQL 扩展(已废弃) | 仅限 MySQL | 面向过程 | ❌ 不支持 | ❌ 仅限 MySQL | 不推荐(已被移除) |
5. 相关链接(深入学习)
更多详细内容请关注其他相关文章!