通过创建 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 连接池,从而导致创建其他连接来服务这些其他模块。