通过创建 PDO 基类的实例来建立连接。您要使用哪个驱动程序并不重要;您始终使用 PDO 类名。构造函数接受用于指定数据库源(称为 DSN)的参数,以及可选的用户名和密码(如果有)。
示例 #1 连接到 MySQL
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
如果有任何连接错误,将抛出 PDOException
对象。如果您想处理错误条件,可以捕获异常;或者,您可以选择将其留给您通过 set_exception_handler() 设置的应用程序全局异常处理程序。
示例 #2 处理连接错误
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
// 例如,尝试在一段时间后重新尝试连接
}
与任何其他 异常 一样,PDOException 可以通过 catch
语句显式捕获,也可以通过 set_exception_handler() 隐式捕获。否则,将发生将未捕获的异常转换为 E_FATAL_ERROR
的默认行为。致命错误将包含一个可能泄露连接详细信息的回溯。因此,php.ini 选项 display_errors
应该在生产服务器上设置为 0
。
成功连接到数据库后,将向您的脚本返回一个 PDO 类的实例。该连接在该 PDO 对象的生命周期内保持活动状态。要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁该对象——您可以通过将 null
分配给保存该对象的变量来做到这一点。如果您没有显式地这样做,PHP 将在您的脚本结束时自动关闭连接。
注意: 如果还有其他对该 PDO 实例的引用(例如来自 PDOStatement 实例,或来自引用相同 PDO 实例的其他变量),这些引用也必须删除(例如,通过将
null
分配给引用 PDOStatement 的变量)。
示例 #3 关闭连接
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// 在这里使用连接
$sth = $dbh->query('SELECT * FROM foo');
// 现在我们完成了;关闭它
$sth = null;
$dbh = null;
?>
许多 Web 应用程序将受益于与数据库服务器建立持久连接。持久连接在脚本结束时不会关闭,而是被缓存并在另一个脚本使用相同的凭据请求连接时重复使用。持久连接缓存允许您避免每次脚本需要与数据库通信时建立新连接的开销,从而导致更快的 Web 应用程序。
示例 #4 持久连接
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
PDO::ATTR_PERSISTENT
选项的值将转换为 bool(启用/禁用持久连接),除非它是非数字 string,在这种情况下,它允许使用多个持久连接池。这在不同的连接使用不兼容的设置时很有用,例如,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
的不同值。
注意:
如果您希望使用持久连接,则必须在传递给 PDO 构造函数的驱动程序选项数组中设置
PDO::ATTR_PERSISTENT
。如果在实例化对象后使用 PDO::setAttribute() 设置此属性,则驱动程序不会使用持久连接。
注意:
如果您使用 PDO ODBC 驱动程序,并且您的 ODBC 库支持 ODBC 连接池(unixODBC 和 Windows 是两个支持的库;可能还有更多),那么建议您不要使用持久 PDO 连接,而是将连接缓存留给 ODBC 连接池层。ODBC 连接池与进程中的其他模块共享;如果告诉 PDO 缓存连接,那么该连接将永远不会返回到 ODBC 连接池,导致创建额外的连接来为这些其他模块提供服务。