MySQL - PHP 语法
现代 PHP 与 MySQL 集成
Section titled “现代 PHP 与 MySQL 集成”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。
设置您的开发环境
Section titled “设置您的开发环境”手动安装 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 概念和方法
Section titled “核心 PDO 概念和方法”通过 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语句受影响的行数。
使用 PDO 连接和查询:安全示例
Section titled “使用 PDO 连接和查询:安全示例”以下示例演示了完整、安全的流程:连接、准备查询、带参数执行、获取结果和错误处理。
<?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. 脚本结束时自动关闭连接。?>