PHP 连接到 MySQL
PHP 5 及更高版本可以使用以下方法与 MySQL 数据库进行交互:
- **MySQLi 扩展**(“i” 代表改进)
- PDO(PHP 数据对象)
早期版本的 PHP 使用 MySQL 扩展。但是,该扩展在 2012 年已被弃用。
我应该使用 MySQLi 还是 PDO?
如果你需要一个简短的答案,那就是“你喜欢哪个就用哪个”。
MySQLi 和 PDO 都有各自的优点。
PDO 可以与 12 种不同的数据库系统一起使用,而 MySQLi 只能与 MySQL 数据库一起使用。
因此,如果你需要将项目切换到使用其他数据库,PDO 可以简化此过程。你只需要更改连接字符串和一些查询。使用 MySQLi,你需要重写整个代码,包括查询。
两者都是面向对象的,但 MySQLi 还提供过程式 API。
两者都支持预处理语句。预处理语句可以防止 SQL 注入,对于 Web 应用程序安全性非常重要。
MySQLi 和 PDO 语法的 MySQL 示例
在本节以及接下来的章节中,我们将演示使用 PHP 和 MySQL 的三种方法:
- MySQLi(面向对象)
- MySQLi(过程式)
- PDO
MySQLi 安装
对于 Linux 和 Windows:在大多数情况下,安装 php5 mysql 包时会自动安装 MySQLi 扩展。
有关安装详细信息,请访问: https://php.ac.cn/manual/en/mysqli.installation.php
PDO 安装
有关安装详细信息,请访问: https://php.ac.cn/manual/en/pdo.installation.php
打开与 MySQL 的连接
在访问 MySQL 数据库中的数据之前,我们需要能够连接到服务器。
示例(MySQLi 面向对象)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "连接成功";
?>
关于上面面向对象示例的说明
在 PHP 5.2.9 和 5.3.0 之前,`$connect_error` 存在问题。如果您需要确保与 PHP 5.2.9 和 5.3.0 之前的版本兼容,请使用以下代码
// 检查连接
if (mysqli_connect_error()) {
die("数据库连接失败:" . mysqli_connect_error());
}
示例(MySQLi 过程式)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检查连接
if (!$conn) {
die("连接失败:" . mysqli_connect_error());
}
echo "连接成功";
?>
示例(PDO)
<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
// 将 PDO 错误模式设置为异常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "连接成功";
} catch(PDOException $e) {
echo "连接失败:" . $e->getMessage();
}
?>
注意: 在上面的 PDO 示例中,我们还指定了一个数据库 (myDB)。PDO 需要一个有效的数据库才能连接。如果没有指定数据库,将会抛出异常。
提示: PDO 的一大优势是它有一个异常类来处理数据库查询中可能出现的任何问题。如果在 `try{ }` 块中抛出异常,脚本将停止执行,并直接流向第一个 `catch(){ }` 块。
关闭连接
当脚本结束时,连接将自动关闭。要提前关闭连接,请使用以下方法
MySQLi 面向对象
$conn->close();
MySQLi 过程式
mysqli_close($conn);
PDO
$conn = null;