PHP 连接 MySQL

PHP 连接 MySQL 是 Web 开发中常见任务,用于从数据库读取或写入数据。PHP 主要通过 mysqli 扩展或 PDO(PHP Data Objects)与 MySQL 交互,旧的 mysql_ 函数已废弃且不安全(PHP 7 移除)。以下是 PHP 连接 MySQL 的中文讲解,包含 mysqliPDO 的实现方式、代码示例和注意事项,简洁实用。


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. 常见操作示例

以下展示如何使用 mysqliPDO 执行简单的查询。

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. 安全性和最佳实践

  1. 防止 SQL 注入
  • 使用预处理语句(mysqli::preparePDO::prepare)处理用户输入,避免直接拼接 SQL。
  1. 字符编码
  • 设置连接字符集为 utf8mb4,避免中文乱码:
    • mysqli: $mysqli->set_charset("utf8mb4");
    • PDO: 在 DSN 中指定 charset=utf8mb4
  1. 错误处理
  • mysqli: 检查 $mysqli->connect_error$mysqli->error
  • PDO: 使用 try-catch 捕获 PDOException
  1. 连接管理
  • 操作完成后关闭连接(mysqli::close()$pdo = null)。
  • 避免过多持久连接,防止资源耗尽。
  1. 权限控制
  • 为数据库用户分配最小权限(如只允许 SELECTINSERT)。

5. mysqli vs PDO

特性mysqliPDO
数据库支持仅 MySQL多种数据库(MySQL、PostgreSQL 等)
编程风格面向对象和过程面向对象
预处理语句支持(bind_param支持(命名参数更灵活)
异常处理手动检查错误支持 try-catch 异常
适用场景简单 MySQL 项目跨数据库、现代化项目

建议

  • 小型项目或仅使用 MySQL:选择 mysqli,简单直接。
  • 跨数据库或需要现代化特性:选择 PDO,更灵活。

6. 注意事项

  1. 不使用 mysql_ 函数
  • mysql_ 函数已废弃(PHP 7 移除),因其不安全,切勿使用。
  1. 环境配置
  • 确保 PHP 已启用 mysqliPDO 扩展(默认启用)。
  • 检查 MySQL 服务运行,确认主机、用户名、密码和数据库名称正确。
  1. 性能优化
  • 使用索引优化查询。
  • 对于批量操作,使用事务提高效率:
    php $pdo->beginTransaction(); // 多个插入操作 $pdo->commit();
  1. 调试
  • 记录 SQL 错误日志,便于排查问题。
  • 使用工具(如 phpMyAdmin)验证数据库结构和数据。

7. 总结

PHP 连接 MySQL 主要通过 mysqliPDO,两者都支持安全、高效的数据库操作。mysqli 适合专注于 MySQL 的项目,PDO 更适合跨数据库或现代化开发。使用预处理语句、正确配置字符集和错误处理,能确保连接安全可靠。结合实际需求(如查询、插入等),选择合适的扩展并遵循最佳实践,可构建健壮的 Web 应用。

如果需要更详细的某操作示例、调试帮助,或有其他问题,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注