连接与连接管理

连接是通过创建PDO基类的实例而建立的。构造函数接收用于指定数据库源(即DSN)以及用户名和密码的参数。

PDO的连接方式有两种:普通连接和持久化连接。 普通连接在连接数据成功后,返回一个PDO类的实例给脚本,此连接在PDO对象的生存周期中保持活动。 要想关闭连接,可以赋一个NULL值给对象变量。关闭连接前,需要销毁对象以确保所有剩余引用都被删除。 如果不明确这么做,PHP在脚本结束时也会自动关闭连接。 持久连接在脚本结束后不会被关闭,而是被缓存,当有另一个使用相同凭证的脚本连接请求到来时被重用。 持久连接缓存可以避免每次脚本需要与数据库会话时建立一个新连接的开销,从而让web应用程序更快。

DSN连接字符串

PDO_ACI的DSN包含三个组成部分:DSN前缀(aci)、dbname(//hostname:port-number/database)、客户端字符集(charset)。

PDO_ACI的DSN格式如下:

aci:dbname=hostname[:port]/databaseName[;charset=charsetVal]

aci 是固定格式,后面跟冒号":" ;

dbname=hostname[:port]/databaseName : dbname选项是设置连接数据信息。

  • hostname 为数据库所在机器的IP地址;
  • [:port] 为数据库访问端口,端口与IP之间用冒号间隔,可以不指定端口,默认用2003访问数据库;
  • /databaseName 为指定数据库实例名称,数据库实例名称前必须有符号/

[;charset=charsetVal] : charset选项为设置客户工作字符集,是一个可选选项。charset与dbname选项之间用";"分号间隔。

charset 可选值有

  • US7ASCII
  • ZHS16GBK
  • ZHS32GB18030
  • ZHT16BIG5
  • UTF8
  • AL32UTF8
  • UTF16

警告

提示: 更多字符集信息请参考 ACI 程序员开发手册-> ACI 编程基础 -> 全球字符集

示例:

aci:dbname=localhost:2003/osrdb;charset=ZHS16GBK;

配置DSN别名

可以配置 php.ini, 添加 DSN 别名,创建 PDO 连接可以使用该别名连接数据库。

具体操作方式是在配置文件 php.ini 中修改或添加 pdo.dsn.别名="连接字符串" 的 DSN 别名配置项。

格式如下

pdo.dsn.* = string

定义 DSN 别名。 参见 PDO::__construct() 详细说明。

例如, 在 php.ini 配置文件中添加别名 “myaci” 的连接字符串信息。

pdo.dsn.stpdo="aci:dbname=localhost:2003/osrdb;charset=ZHS16GBK"

使用 DSN 别名代码示例

<?php
   try {
   $dsn = "stpdo";
   $user = "sysdba";
   $pass = "szoscar55";
   // 建立一个普通连接
   $dbh = new PDO($dsn, $user, $pass);

   $stmt = $dbh->prepare("SELECT NOW()");

   $res = $stmt->execute();
   while ($row = $stmt->fetch()) {
      print_r($row);
   }

   // 在此使用连接
   } catch (PDOException $e) {
     print "Error!: " . $e->getMessage() . "<br/>";
     die();
   }
?>

示例输出

Array
(
   [NOW] => 2022-06-02 05:52:50.737269 +00:00
   [0] => 2022-06-02 05:52:50.737269 +00:00
)

设置ACI属性

在连接字符串中,还可以设置ACI支持的属性,这些属性会影响ACI的工作模式。

设置方式为在dbname选项值末尾位置添加“?”问号作为标志位,格式如下:

aci:dbname=hostName[:port]/databaseName[?paraName1=paraVal#paraName2=paraVal][;optName=optval]

paraName1=paraVal 为ACI参数名称和参数值,中间用等号连接;如果想设置多个参数,多个参数之间用“#”间隔;

示例:

aci:dbname=localhost:2003/osrdb?dbtext_max_len=100000#fetch_size=100#call_timeout=55;charset=ZHS16GBK;

警告

备注:可设置的ACI选项可参考:《ACI (C/C++)程序员开发手册-->ACI编程概述-->参数配置文件-->参数说明》 中的参数及参数功能描述。

连接数据库

PDO_ACI的DSN包含三个组成部分:DSN前缀(aci)、dbname(//hostname:port-number/database)、客户端字符集(charset)。

PDO与数据库建立普通连接的编程示例如下:

<?php
$dsn = "aci:dbname=localhost:2003/osrdb;charset=ZHS16GBK";
$user = "sysdba";
$pass = "szoscar55";
// 建立一个普通连接
$dbh = new PDO($dsn, $user, $pass);
// 在此使用连接

?>

处理连接错误

如果有任何连接错误,将抛出一个 PDOException 异常对象。如果想处理错误状态,可以捕获异常,或者选择留给通过 set_exception_handler() 设置的应用程序全局异常处理程序。

使用 try...catch 处理连接错误示例如下:

<?php
try {
    $dbh = new PDO('aci:dbname=localhost:2003/osrdb;charset=ZHS16GBK', $user, $pass);
    foreach($dbh->query('SELECT * from FOO') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
?>

警告

警告 如果应用程序不在 PDO 构造函数中捕获异常,zend 引擎采取的默认动作是结束脚本并显示一个回溯跟踪,此回溯跟踪可能泄漏完整的数据库连接细节,包括用户名和密码。因此有责任去显式(通过 catch 语句)或隐式(通过 set_exception_handler() )地捕获异常。

关闭连接

连接数据成功后,返回一个 PDO 类的实例给脚本,此连接在 PDO 对象的生存周期中保持活动。要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个null 值给对象变量。 如果不明确地这么做,PHP 在脚本结束时会自动关闭连接。

关闭一个PDO与数据库的连接编程示例如下:

<?php
$dbh = new PDO('aci:dbname=localhost:2003/osrdb;charset=ZHS16GBK', $user, $pass);
// 在此使用连接


// 现在运行完成,在此关闭连接
$dbh = null;
?>

持久化连接

很多web应用程序通过使用到数据库服务的持久连接获得好处。持久连接在脚本结束后不会被关闭,且被缓存,当另一个使用相同凭证的脚本连接请求时被重用。 持久连接缓存可以避免每次脚本需要与数据库回话时建立一个新连接的开销,从而让 web 应用程序更快。

PDO与数据库建立持久连接的编程示例如下:

<?php
$dbh = new PDO('aci:dbname=localhost:2003/osrdb;charset=ZHS16GBK', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));
?>

警告

注意: 如果想使用持久连接,必须在传递给 PDO 构造函数的驱动选项数组中设置PDO::ATTR_PERSISTENT。

如果是在对象初始化之后用:doc:PDO::setAttribute() 设置此属性,则驱动程序将不会使用持久连接。

安全连接

PDO_ACI依赖aci驱动,aci驱动支持了ssl安全通信,且可以通过连接字符串设置,因此PDO_ACI也可以在连接字符串设置ssl通信相关配置,多个参数之间用“#”间隔,比如:

aci:dbname=localhost:2003/osrdb?ssl_wallet_enable=1#ssl_wallet_path=/opt/wallet/#ssl_wallet_pwd=szoscar55$;charset=ZHS16GBK;

详细可以设置的参数,可参考 《ACI (C/C++)程序员开发手册-->ACI编程概述-->参数配置文件-->参数说明》 中的参数及参数功能描述。