Skip to content

MySQL - PHP 语法

PHP 是 Web 开发的主导语言,它与 MySQL 的集成是构建动态、数据驱动型 Web 应用程序的基础。本教程涵盖了连接 PHP 到 MySQL 数据库的现代标准和最佳实践,重点关注安全性、可靠性和可维护性。

现代 PHP 数据库连接:PDO 与 MySQLi

Section titled “现代 PHP 数据库连接:PDO 与 MySQLi”

PHP 提供了两个主要的扩展来连接 MySQL:MySQLi (MySQL Improved) 和 PDO (PHP Data Objects)。虽然两者都强大且支持现代 MySQL 功能,但对于新项目通常推荐使用 PDO。

特性PDO (PHP 数据对象)MySQLi (MySQL 改进版)
数据库支持支持 12 种不同的数据库驱动(MySQL、PostgreSQL、SQLite 等)。仅支持 MySQL。
API 风格严格的面向对象。支持面向对象和过程式两种风格。
命名参数支持(例如,:name)。这可以提高可读性。不支持。仅支持位置 ? 占位符。
可移植性高。代码只需少量更改即可轻松移植到其他数据库。低。代码与 MySQL 绑定。

**推荐:**新应用程序使用 PDO。它的可移植性、一致的 API 和对命名参数的支持使其成为长期来看更灵活、更易于维护的选择。本教程中的示例将使用 PDO。

手动安装 PHP、MySQL 和 Web 服务器复杂且容易出错。现代开发者使用集成软件栈或容器化来简化设置。

  • **XAMPP (适用于 Windows, macOS, Linux):**一个流行、免费且易于安装的 Apache 发行版,包含 PHP、MariaDB(MySQL 的兼容分支)和 Perl。
  • **WAMP (适用于 Windows) / MAMP (适用于 macOS):**类似的 All-in-One 包,提供完整的 Web 开发环境。
  • **Docker:**一个容器化平台,允许您在隔离、可重现的环境中运行 PHP 和 MySQL。这是专业开发和部署的行业标准。

这些工具默认启用了 PDO 和 MySQLi 扩展,因此通常无需手动配置 php.ini。

通过 PDO 与数据库交互涉及几个关键步骤和对象:

  • new PDO(...):建立与数据库的连接。连接详情通过一个特殊的字符串,称为 DSN (Data Source Name),传递。
  • PDO::prepare():准备一个 SQL 语句以供执行。这是防止 SQL 注入的第一步。它返回一个 PDOStatement 对象。
  • PDOStatement::execute():执行预处理语句。您可以传递一个参数数组,以安全地替换 SQL 中的占位符(? 或 :name)。
  • PDOStatement::fetchAll():从结果集中获取所有剩余的行,并将它们作为数组的数组返回。
  • PDOStatement::fetch():从结果集中获取下一行。
  • PDOStatement::rowCount():返回最后一次 DELETE、INSERT 或 UPDATE 语句受影响的行数。

以下示例演示了完整、安全的流程:连接、准备查询、带参数执行、获取结果和错误处理。

<?php
// 1. 数据库连接参数
$host = 'localhost'; // 或 127.0.0.1
$db = 'your_database';
$user = 'your_username';
$pass = 'your_password';
$charset = 'utf8mb4';
// 2. 设置 DSN (数据源名称)
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
// 3. 设置 PDO 选项用于错误处理和获取数据
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 错误时抛出异常
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 以关联数组形式获取
PDO::ATTR_EMULATE_PREPARES => false, // 使用真实的预处理语句
];
// 4. 在 try-catch 块中建立连接
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo "Connected to database successfully!\n<br/>";
} catch (\PDOException $e) {
// 在实际应用程序中,您会记录此错误,而不是显示给用户
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// 5. 准备并执行带有 WHERE 子句的 SELECT 查询
$sql = 'SELECT id, name, salary FROM customers WHERE salary > ?';
$minimumSalary = 5000.00;
$stmt = $pdo->prepare($sql);
$stmt->execute([$minimumSalary]);
// 6. 获取结果
$highEarners = $stmt->fetchAll();
// 7. 处理并显示结果
if ($highEarners) {
echo "Customers with salary greater than {$minimumSalary}:\n<br/>";
foreach ($highEarners as $customer) {
echo "ID: " . htmlspecialchars($customer['id'])
. ", Name: " . htmlspecialchars($customer['name'])
. ", Salary: " . htmlspecialchars($customer['salary']) . "<br/>";
}
} else {
echo "No customers found with a salary greater than {$minimumSalary}.\n";
}
// 8. 脚本结束时自动关闭连接。
?>