PDO(PHP 数据对象)定义了一个轻量级、一致的接口,用于在 PHP 中访问许多不同的 SQL 数据库。无论我们当时碰巧使用的特定数据库系统如何,您都可以使用单个界面编写和执行数据库查询。PDO 用于安全编程的主要好处是准备好的语句。
PDO 提供了一个数据访问抽象层,这意味着,无论您使用哪个数据库,您都可以使用相同的函数来发出查询和获取数据。
例如,您已经使用 MySQLi 编写了一个应用程序,现在您想要迁移您的应用程序以使用 PostgreSQL。MySQLi 和 PostgreSQL 使用不同命名的方法来完成它们的工作。因此,从一个数据库系统切换到另一个数据库系统基本上涉及重写所有数据库代码以使用新方法。如果您使用的是 PDO,那将非常简单。只需更改主配置文件中的几个参数,您就可以完成。
什么是抽象层?
OOP 语言中的对象提供了隐藏内部实现细节的抽象。
PDO 是一个数据库访问抽象层。这意味着 PDO 支持多种数据库语言(例如 SQLite、PostgreSQL、Firebird 或 Oracle),并提供一组统一的方法来处理大多数数据库交互。
这是一个很大的优势,您可以轻松地从一种数据库类型迁移到另一种数据库类型,只需重写少量代码并更改 PDO 的现有数据库驱动程序并继续照常工作。
PDO 不提供数据库抽象,也不重写 SQL 或模拟缺失的特性:
- PDO 提供了一个数据访问抽象层。它可以抽象数据库驱动程序,例如 MySQL、SQLite、PostgreSQL 等。
- PDO 不提供数据库抽象。它不能抽象 SQL 语句,也不会重写 SQL 或模拟缺失的功能。
使用 PDO 连接到数据库
您可以通过创建 PDO 类的实例来建立数据库连接:
$dbh = new PDO ($dsn, $username, $password, $options);
// OR
$dbh = new PDO ($dsn, $username, $password);
// OR
$dbh = new PDO ($dsn);
注意:dbh 代表数据库句柄。
第一步是初始化 PDO 类的一个实例并向对象构造函数传递一个、三个或四个参数:
DSN (Data Source Name)
:指示要连接的数据库类型以及其他特定于数据库的选项Username (optional)
: 数据库的用户名。Password (optional)
: 数据库的密码。Options (optional)
:驱动程序特定连接选项的键=>值数组。
对于某些 PDO 驱动程序,用户名和密码参数是可选的。
处理连接错误
如果有任何连接错误,PDOException
将抛出一个对象。如果要处理错误情况,可以捕获异常:
try {
$dbh = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}
数据源名称 (DSN)
数据源名称 (DSN) 是具有关联数据结构的字符串,用于描述与数据源(数据库服务器)的连接。DSN 字符串因数据库而异,以下列表显示了一些常见的 DSN:
MySQL
'mysql:host=localhost; port=3306; dbname=test'
PostgreSQL
'pgsql:host=localhost; port=5432; dbname=test; user=brain; password=bell'
SQLite
'sqlite:/dbs/brainbell/test'
Oracle
'oci:dbname=test'
'oci:dbname=//localhost:1521/test'
Firebird
'firebird:dbname=/path/test.fsb'
连接到 MySQL
$dsn = 'mysql:host=localhost; port=3306; dbname=test';
如果 MySQL 服务器正在侦听其默认端口(即 ),则无需指定端口号3306
:
$dsn = 'mysql:host=localhost;dbname=test';
例子:
$username = 'brain';
$password = 'bell';
$dsn = 'mysql:host=localhost;dbname=personal';
$dbh = new PDO($dsn, $username, $password);
处理连接错误:
$username = 'brain';
$password = 'bell';
$dsn = 'mysql:host=localhost;dbname=personal';
$dbh = null;
try {
$dbh = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
exit;
}
连接到 PostgreSQL
$dsn = 'pgsql:host=localhost; port=5432;
dbname=test; user=brain; password=bell';
$dbh = null;
try {
$dbh = new PDO($dsn);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}
连接到 SQLite
$dsn = 'sqlite:/path/dbFileName';
$dbh = null;
try {
$dbh = new PDO($dsn);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}
连接到 Oracle
// Connect to a database defined in tnsnames.ora file
$dsn = 'oci:dbname=personal';
//OR connect using the Oracle Instant Client
$dsn = 'oci:dbname=//localhost:1521/personal';
$username = 'brain';
$password = 'bell';
$dbh = null;
try {
$dbh = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}
连接到火鸟
$dsn = 'firebird:dbname=/path/test.fsb';
通过指定主机:
$dsn = 'firebird:dbname=192.168.0.99:/path/test.fdb';
通过指定主机和端口号:
$dsn = 'firebird:dbname=localhost/3050:/path/test.fdb';
例子:
$username = 'brain';
$password = 'bell';
$dsn = 'firebird:dbname=/path/dbFileName.ext';
$dbh = null;
try {
$dbh = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit;
}
如何使用 Unix 套接字进行连接
要通过套接字连接,您不能使用 dsn 中的 host 选项,而是指定套接字路径,请参见以下示例:
$dsn = 'mysql:dbname=test;unix_socket=/path/socket';
如果数据库在不同的端口上运行,如何连接
对于localhost
,127.0.0.1
如果数据库服务器使用不同的端口号而不是默认端口,则需要使用。请参阅以下示例以指定数据库端口:
$dsn = 'mysql:dbname=test; host=127.0.0.1; port=3311';
注意:如果数据库服务器在默认端口上运行,则不需要在 dsn 中指定端口。
关闭 PDO 连接
根据文档:
-
NULL
通过分配给保存对象的变量来销毁 PDO对象:$dbh = new PDO($dsn, $user, $password); . . $dbh = null
-
同时销毁对 PDO 实例的所有其他引用,例如
PDOStatement
实例:$dbh = new PDO($dsn, $user, $password); $sth = $dbh->query('SELECT * FROM table_1 LIMIT 5'); . . //Close connection $sth = null; $dbh = null;
-
销毁所有其他变量引用,例如,当
PDO
引用跨越函数和对象属性时:$dbh = new PDO($dsn, $user, $password); $dbh_2 = $dbh; $dbh_3 = $dbh_2; . . $dbh = NULL; $dbh_2 = NULL; $dbh_3 = NULL;