在 ServBay 中使用 PHP MySQL 扩展 (mysqlnd, mysqli, PDO)
ServBay 作为一个强大的集成式本地 Web 开发环境,极大地简化了 PHP 应用程序与数据库的交互。它为所有支持的 PHP 版本预装并默认启用了关键的 MySQL 数据库扩展,包括 mysqlnd
、mysqli
和 PDO_MySQL
。这意味着您无需手动配置即可开始在 PHP 项目中使用 MySQL 或 MariaDB 数据库进行数据操作。
ServBay 中可用的 PHP MySQL 扩展
ServBay 为其管理的 PHP 环境内置了以下三种主流的 MySQL 扩展,确保了兼容性和性能:
- MySQL Native Driver (
mysqlnd
): PHP 的原生驱动程序,作为mysqli
和PDO_MySQL
的底层库,提供与 MySQL/MariaDB 服务器通信的基础,通常具有更好的性能和内存管理。 - MySQLi (
mysqli
): MySQL Improved Extension,提供了面向对象和过程式两种接口,专门用于连接 MySQL 和 MariaDB 数据库,支持预处理语句、事务、存储过程和多语句查询等高级特性。 - PDO MySQL (
PDO_MySQL
): PHP Data Objects (PDO) 的 MySQL 驱动。PDO 提供了一个统一的数据库访问抽象层,允许开发者使用一致的 API 与多种数据库(包括 MySQL, MariaDB, PostgreSQL, SQLite 等)交互,增强了代码的可移植性。
启用状态
在 ServBay 中,mysqlnd
、mysqli
和 PDO_MySQL
扩展在所有 PHP 版本中均默认启用。您无需执行任何额外的步骤来开启它们。ServBay 已为您处理好 php.ini
的相关配置,让您可以直接在代码中使用这些扩展连接数据库。
各 PHP MySQL 扩展详解
理解这三种扩展的区别有助于您根据项目需求做出最佳选择:
MySQL Native Driver (
mysqlnd
)- 核心作用:
mysqlnd
是一个用 C 语言编写的 PHP 原生驱动程序,作为 PHP 与 MySQL/MariaDB 数据库服务器通信的基础层。 - 主要特点: 从 PHP 5.3 版本开始,
mysqlnd
成为了mysqli
和PDO_MySQL
扩展的默认底层库。它直接集成到 PHP 中,无需链接外部 MySQL 客户端库(如libmysqlclient
)。 - 关键优势: 相比旧的
libmysqlclient
库,mysqlnd
通常提供更好的性能、更高效的内存管理,并支持如异步查询、持久连接改进以及丰富的插件 API 等高级特性。您通常不会直接与mysqlnd
API 交互,而是通过mysqli
或PDO
来利用它的优势。
- 核心作用:
MySQLi (
mysqli
)- 核心作用: MySQL Improved Extension 是专门为 MySQL (4.1.3 及以上版本) 和 MariaDB 设计的 PHP 扩展。
- 主要特点: 提供两种编程接口:面向对象 (Object-Oriented) 和过程式 (Procedural)。支持预处理语句(有效防止 SQL 注入)、事务控制、存储过程调用、多语句执行等 MySQL/MariaDB 的高级功能。
- 关键优势: 功能丰富,针对 MySQL/MariaDB 进行了优化,性能良好。如果您确定项目只会使用 MySQL 或 MariaDB,并且需要利用其特定高级特性,
mysqli
是一个可靠的选择。
PDO MySQL (
PDO_MySQL
)- 核心作用: PHP Data Objects (PDO) 提供了一个轻量级、一致性的接口,用于访问多种数据库。
PDO_MySQL
是 PDO 针对 MySQL/MariaDB 数据库的特定驱动程序。 - 主要特点: 通过统一的 API(如
PDO
类、PDOStatement
类)进行数据库操作。强制使用预处理语句(通过prepare()
和execute()
),是防止 SQL 注入的最佳实践。支持事务处理。 - 关键优势: 数据库可移植性是 PDO 的最大优势。如果您的应用程序未来可能需要切换到 PostgreSQL、SQLite 或其他支持的数据库,使用 PDO 可以最大限度地减少代码修改。它提供了清晰、面向对象的接口,代码通常更简洁、更安全。对于新项目,通常推荐使用 PDO。
- 核心作用: PHP Data Objects (PDO) 提供了一个轻量级、一致性的接口,用于访问多种数据库。
PHP 代码示例:连接并操作数据库
以下示例展示了如何在您的 PHP 代码中分别使用 mysqli
和 PDO
扩展连接到 ServBay 管理的数据库(假设为 MariaDB 或 MySQL)并执行基本操作。
前提条件:
- 您需要在 ServBay 中运行 MySQL 或 MariaDB 服务。
- 假设您已创建名为
servbay_db
的数据库。 - 假设您已创建名为
servbay_user
的用户,其密码为your_password
,并授予了对servbay_db
的相应权限。 - 假设
servbay_db
数据库中存在一个名为users
的表,包含id
(INT, PK, AI),name
(VARCHAR),email
(VARCHAR),age
(INT) 列。
您可以使用 ServBay 内置的 phpMyAdmin 或其他数据库管理工具来完成这些设置。
示例代码(mysqli
方式)
<?php
// --- mysqli 示例 ---
// 数据库连接参数
$servername = "127.0.0.1"; // 或 'localhost'
$port = 3306; // ServBay 中 MySQL/MariaDB 的默认端口
$username = "servbay_user";
$password = "your_password"; // 请替换为您的实际密码
$dbname = "servbay_db";
// 创建 mysqli 连接(面向对象方式)
$conn = new mysqli($servername, $username, $password, $dbname, $port);
// 检查连接是否成功
if ($conn->connect_error) {
die("mysqli Connection failed: " . $conn->connect_error);
}
echo "mysqli Connected successfully<br>";
// 插入数据 (使用预处理语句防止 SQL 注入)
$stmt = $conn->prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)");
$name = "ServBay Demo";
$email = "[email protected]";
$age = 5;
// "ssi" 表示 string, string, integer 类型
$stmt->bind_param("ssi", $name, $email, $age);
if ($stmt->execute()) {
echo "mysqli: New record created successfully<br>";
} else {
echo "mysqli Error: " . $stmt->error . "<br>";
}
$stmt->close();
// 查询数据
$sql = "SELECT id, name, email, age FROM users WHERE name = 'ServBay Demo'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "mysqli Queried data:<br>";
// 输出数据
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. " - Age: " . $row["age"]. "<br>";
}
} else {
echo "mysqli: 0 results found<br>";
}
// 关闭连接
$conn->close();
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
示例代码(PDO
方式)
<?php
// --- PDO 示例 ---
// 数据库连接参数
$host = '127.0.0.1'; // 或 'localhost'
$port = 3306; // ServBay 中 MySQL/MariaDB 的默认端口
$dbname = 'servbay_db';
$username = 'servbay_user';
$password = 'your_password'; // 请替换为您的实际密码
$charset = 'utf8mb4';
// 数据源名称 (DSN)
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=$charset";
// PDO 连接选项
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 抛出异常而不是警告
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 默认获取关联数组
PDO::ATTR_EMULATE_PREPARES => false, // 使用原生预处理语句
];
try {
// 创建 PDO 连接实例
$pdo = new PDO($dsn, $username, $password, $options);
echo "PDO Connected successfully<br>";
// 插入数据 (使用预处理语句)
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
$name = 'ServBay PDO Demo';
$email = '[email protected]';
$age = 10;
// 绑定参数并执行
$stmt->execute([
':name' => $name,
':email' => $email,
':age' => $age
]);
echo "PDO: New record created successfully<br>";
// 查询数据
$stmt = $pdo->prepare("SELECT id, name, email, age FROM users WHERE name = :name");
$stmt->execute([':name' => 'ServBay PDO Demo']);
// 获取所有结果
$users = $stmt->fetchAll(); // 使用默认的 FETCH_ASSOC
if ($users) {
echo "PDO Queried data:<br>";
foreach ($users as $row) {
echo "id: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . " - Age: " . $row['age'] . "<br>";
}
} else {
echo "PDO: 0 results found<br>";
}
} catch (\PDOException $e) {
// 捕获并显示连接或查询错误
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
// PDO 连接在脚本结束时通常会自动关闭,无需显式调用 close()
// $pdo = null; // 可以显式设置 null 来关闭
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
放置代码: 将以上任一示例代码保存为 .php
文件(例如 db_test_mysqli.php
或 db_test_pdo.php
)并放置在您的 ServBay 网站根目录(例如 /Applications/ServBay/www/myproject/
)下,然后通过浏览器访问对应的 URL(例如 http://myproject.servbay.demo/db_test_mysqli.php
)。确保您的网站在 ServBay 中已正确配置并运行。
常见问题解答 (FAQ)
Q: 我是否需要手动在 ServBay 中安装 PHP 的 MySQL 扩展?
A: 不需要。ServBay 已经为您管理的所有 PHP 版本预装并默认启用了 mysqlnd
、mysqli
和 PDO_MySQL
这三个关键的 MySQL 数据库扩展。您可以直接在 PHP 代码中使用它们,无需任何安装或配置步骤。
Q: 在 mysqli
和 PDO
之间,我应该选择哪一个?
A:
- 推荐使用
PDO
: 如果您的应用程序可能需要支持多种数据库(不仅仅是 MySQL/MariaDB),或者您追求更现代、更面向对象且具有更好可移植性的代码,PDO 是首选。它强制使用预处理语句,有助于编写更安全的代码。 - 考虑使用
mysqli
: 如果您的项目确定只使用 MySQL 或 MariaDB,并且您需要利用这些数据库特有的一些高级功能,mysqli
是一个强大且性能良好的选择。它同时提供面向对象和过程式接口。
对于新项目,一般推荐使用 PDO
。
Q: 如何确定连接 ServBay 中 MySQL/MariaDB 服务的参数?
A:
- 主机名 (Host): 通常使用
127.0.0.1
或localhost
。 - 端口 (Port): ServBay 中 MySQL 和 MariaDB 服务的默认端口通常是
3306
。您可以在 ServBay 的软件包管理界面确认具体服务的端口号。 - 用户名 (Username) / 密码 (Password): 您需要使用在 MySQL/MariaDB 中创建的数据库用户的凭据。如果您是初次使用,可能需要创建一个新用户或使用 root 用户(不推荐在生产代码中使用 root)。您可以通过 ServBay 内置的 phpMyAdmin 或其他数据库工具管理用户和权限。
- 数据库名 (Database Name): 您需要连接到的数据库的名称。
Q4: 我有一个旧项目使用了已被废弃的 mysql_*
函数,ServBay 支持吗?
A: 是的,为了方便开发者维护或迁移旧版应用程序,ServBay 特别在其提供的 PHP 5.6 环境中包含了对旧式 mysql_*
函数的支持(比如mysql_connect
)。这些函数在 PHP 5.5 中被标记为废弃,并在 PHP 7.0 中被移除。通过 ServBay 的 PHP 5.6,您可以运行依赖这些旧函数的代码,而无需费力寻找更早的 PHP 版本。
然而,强烈建议您:
- 仅将此功能用于临时兼容或遗留项目维护。
- 对于新项目或在重构旧代码时,务必迁移到更现代、更安全的
mysqli
或PDO
扩展。mysql_*
函数存在安全风险(如易受 SQL 注入攻击)且缺乏现代数据库特性支持。
结论
ServBay 通过为所有 PHP 版本预装并默认启用 mysqlnd
、mysqli
和 PDO_MySQL
扩展,以及为 PHP 5.6 提供对旧 mysql_*
函数的兼容支持,显著简化了 PHP 开发者的数据库工作流程。您无需关心繁琐的扩展安装和配置过程,可以直接在代码中选择最适合您项目的扩展(推荐使用 PDO 或 mysqli)来连接和操作 ServBay 环境中运行的 MySQL 或 MariaDB 数据库。
这种开箱即用的便利性让您可以更专注于应用程序本身的逻辑开发,利用 ServBay 提供的稳定、高效的本地环境,快速构建、测试和维护您的 Web 服务。