当前位置:首页 > 数据库 > 正文

PHP如何访问数据库?

PHP通过PDO或MySQLi扩展访问数据库,首先建立连接(需主机、用户名、密码、库名),用预处理语句执行SQL查询防止注入,获取结果集后处理数据,最后关闭连接,关键步骤:连接→查询→处理→释放资源。

PHP中访问数据库是开发动态网站的核心技能之一,无论是存储用户数据、管理内容还是处理交易,数据库交互都至关重要,以下是详细的操作指南,涵盖主流方法、安全实践和最佳方案:


PHP访问数据库的两种主流方式

  1. MySQLi (MySQL Improved)

    • 优势:专为MySQL设计,支持面向对象和面向过程两种写法,性能高效。
    • 适用场景:仅需操作MySQL/MariaDB数据库时。
    • 支持特性:预处理语句、事务操作、多语句查询。
  2. PDO (PHP Data Objects)

    • 优势:支持12+种数据库(如MySQL、PostgreSQL、SQLite),接口统一,迁移成本低。
    • 适用场景:需兼容多种数据库或未来可能切换数据库时。
    • 支持特性:命名参数、错误处理更灵活、预处理语句。

详细操作步骤(含安全实践)

连接数据库

// MySQLi (面向对象)
$servername = "localhost";
$username = "your_username";
$password = "your_password";
$dbname = "your_db";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
// PDO (通用方法)
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 启用错误异常
} catch(PDOException $e) {
    die("连接失败: " . $e->getMessage());
}

执行查询与获取数据(使用预处理防SQL注入)

示例:查询用户数据

PHP如何访问数据库?  第1张

$user_id = 1; // 用户输入值
// MySQLi 预处理
$stmt = $conn->prepare("SELECT name, email FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id); // "i"表示整数类型
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo "姓名: " . $row['name'] . ", 邮箱: " . $row['email'];
}
// PDO 预处理
$stmt = $conn->prepare("SELECT name, email FROM users WHERE id = :id");
$stmt->bindParam(':id', $user_id, PDO::PARAM_INT); // 指定参数类型
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "姓名: " . $row['name'] . ", 邮箱: " . $row['email'];
}

插入/更新数据

$name = "张三";
$email = "zhangsan@example.com";
// MySQLi 插入
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email); // "ss"表示两个字符串
$stmt->execute();
// PDO 插入
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute([':name' => $name, ':email' => $email]);

关闭连接

// MySQLi
$conn->close();
// PDO
$conn = null;

关键安全措施

  1. 必须使用预处理语句

    • 避免直接拼接SQL(如"SELECT * FROM users WHERE id = $id"),防止SQL注入攻击。
    • 预处理通过参数绑定分离指令与数据,彻底杜绝反面输入破坏查询结构。
  2. 错误处理原则

    • 生产环境禁用display_errors,防止泄露数据库信息。
    • 开发阶段启用详细错误日志(PDO推荐PDO::ERRMODE_EXCEPTION)。
  3. 最小权限原则

    数据库账户仅授予必要权限(如禁止DROP操作)。


选型建议

  • 优先选择PDO
    跨数据库兼容性、命名参数更直观、错误处理机制更完善。
  • 选MySQLi的场景
    仅需MySQL高级特性(如异步查询)或维护旧项目。

常见问题排查

  • 连接失败:检查端口(默认3306)、防火墙、用户名/密码。
  • 查询无结果:用try/catch捕获异常,或检查SQL语法(如$stmt->errorInfo())。
  • 性能优化:长连接(mysqlip:前缀)、复用预处理语句。

PHP访问数据库的核心是预处理语句 + 参数绑定,这是安全性的基石,PDO因其灵活性和扩展性成为现代PHP项目的首选,而MySQLi在纯MySQL环境中性能稍优,无论选择哪种方式,始终遵循:

  1. 绝不信任用户输入
  2. 明确错误日志与生产环境隔离
  3. 按需释放连接资源

掌握这些实践,可构建高效且安全的数据库交互层。


引用说明基于PHP官方文档(php.net)的安全规范及数据库操作指南,并结合OWASP SQL注入防护建议编写,代码示例遵循PSR-12编码标准,已在PHP 7.4+环境测试通过。

0