PHP 连接 MySQL
PHP 连接 MySQL 是 Web 开发中常见任务,用于从数据库读取或写入数据。PHP 主要通过 mysqli
扩展或 PDO
(PHP Data Objects)与 MySQL 交互,旧的 mysql_
函数已废弃且不安全(PHP 7 移除)。以下是 PHP 连接 MySQL 的中文讲解,包含 mysqli
和 PDO
的实现方式、代码示例和注意事项,简洁实用。
1. 使用 mysqli
连接 MySQL
mysqli
是 MySQL 的改进扩展,支持面向过程和面向对象风格,适合专注于 MySQL 的项目。
1.1 面向对象方式
<?php
$host = 'localhost'; // 数据库主机
$user = 'root'; // 数据库用户名
$password = ''; // 数据库密码
$database = 'mydb'; // 数据库名称
// 创建连接
$mysqli = new mysqli($host, $user, $password, $database);
// 检查连接
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
echo "连接成功!";
// 关闭连接
$mysqli->close();
?>
1.2 面向过程方式
<?php
$host = 'localhost';
$user = 'root';
$password = '';
$database = 'mydb';
// 创建连接
$conn = mysqli_connect($host, $user, $password, $database);
// 检查连接
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
echo "连接成功!";
// 关闭连接
mysqli_close($conn);
?>
2. 使用 PDO
连接 MySQL
PDO
是一个数据库抽象层,支持多种数据库(如 MySQL、PostgreSQL),适合跨数据库项目,提供统一的接口和更现代化的功能。
示例代码
<?php
$host = 'localhost';
$dbname = 'mydb';
$user = 'root';
$password = '';
try {
// 创建 PDO 连接
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $password);
// 设置错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "连接成功!";
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
// 关闭连接(可选,PHP 脚本结束时自动关闭)
$pdo = null;
?>
3. 常见操作示例
以下展示如何使用 mysqli
和 PDO
执行简单的查询。
3.1 查询数据(mysqli
)
<?php
$mysqli = new mysqli('localhost', 'root', '', 'mydb');
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
// 执行查询
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['id']}, Name: {$row['name']}<br>";
}
// 释放结果集并关闭连接
$result->free();
$mysqli->close();
?>
3.2 查询数据(PDO
)
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 执行查询
$stmt = $pdo->query("SELECT id, name FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: {$row['id']}, Name: {$row['name']}<br>";
}
} catch (PDOException $e) {
die("查询失败: " . $e->getMessage());
}
$pdo = null;
?>
3.3 使用预处理语句(防止 SQL 注入)
- mysqli:
<?php
$mysqli = new mysqli('localhost', 'root', '', 'mydb');
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$name = "张三";
$email = "zhangsan@example.com";
$stmt->execute();
$stmt->close();
$mysqli->close();
?>
- PDO:
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => '张三', 'email' => 'zhangsan@example.com']);
} catch (PDOException $e) {
die("插入失败: " . $e->getMessage());
}
$pdo = null;
?>
4. 安全性和最佳实践
- 防止 SQL 注入:
- 使用预处理语句(
mysqli::prepare
或PDO::prepare
)处理用户输入,避免直接拼接 SQL。
- 字符编码:
- 设置连接字符集为
utf8mb4
,避免中文乱码:mysqli
:$mysqli->set_charset("utf8mb4");
PDO
: 在 DSN 中指定charset=utf8mb4
。
- 错误处理:
mysqli
: 检查$mysqli->connect_error
或$mysqli->error
。PDO
: 使用try-catch
捕获PDOException
。
- 连接管理:
- 操作完成后关闭连接(
mysqli::close()
或$pdo = null
)。 - 避免过多持久连接,防止资源耗尽。
- 权限控制:
- 为数据库用户分配最小权限(如只允许
SELECT
和INSERT
)。
5. mysqli
vs PDO
特性 | mysqli | PDO |
---|---|---|
数据库支持 | 仅 MySQL | 多种数据库(MySQL、PostgreSQL 等) |
编程风格 | 面向对象和过程 | 面向对象 |
预处理语句 | 支持(bind_param ) | 支持(命名参数更灵活) |
异常处理 | 手动检查错误 | 支持 try-catch 异常 |
适用场景 | 简单 MySQL 项目 | 跨数据库、现代化项目 |
建议:
- 小型项目或仅使用 MySQL:选择
mysqli
,简单直接。 - 跨数据库或需要现代化特性:选择
PDO
,更灵活。
6. 注意事项
- 不使用
mysql_
函数:
mysql_
函数已废弃(PHP 7 移除),因其不安全,切勿使用。
- 环境配置:
- 确保 PHP 已启用
mysqli
或PDO
扩展(默认启用)。 - 检查 MySQL 服务运行,确认主机、用户名、密码和数据库名称正确。
- 性能优化:
- 使用索引优化查询。
- 对于批量操作,使用事务提高效率:
php $pdo->beginTransaction(); // 多个插入操作 $pdo->commit();
- 调试:
- 记录 SQL 错误日志,便于排查问题。
- 使用工具(如 phpMyAdmin)验证数据库结构和数据。
7. 总结
PHP 连接 MySQL 主要通过 mysqli
或 PDO
,两者都支持安全、高效的数据库操作。mysqli
适合专注于 MySQL 的项目,PDO
更适合跨数据库或现代化开发。使用预处理语句、正确配置字符集和错误处理,能确保连接安全可靠。结合实际需求(如查询、插入等),选择合适的扩展并遵循最佳实践,可构建健壮的 Web 应用。
如果需要更详细的某操作示例、调试帮助,或有其他问题,请告诉我!