以多種方式調(diào)用構(gòu)造方法創(chuàng)建PDO對(duì)象

以多種方式調(diào)用構(gòu)造方法創(chuàng)建pdo對(duì)象

可以以多種昂方式調(diào)構(gòu)造方法創(chuàng)建PDO對(duì)象,下面以連接MySQL 和 Oracle 服務(wù)器為例,分別介紹構(gòu)造方法的多種調(diào)用方式。

一、將參數(shù)嵌入到構(gòu)造函數(shù)

在下面的連接Oracle 服務(wù)器的示例中,在DSN字符串中加載OCI驅(qū)動(dòng)程序并指定里兩個(gè)可選參數(shù):第一個(gè)是數(shù)據(jù)庫(kù)名稱,第二個(gè)是字符集。使用了特定的字符集連接一個(gè)特定的數(shù)據(jù)庫(kù),如果不指定任何信息就會(huì)使用默認(rèn)的數(shù)據(jù)庫(kù)。代碼如下:

<?php try{      $dbh = new PDO("OCI:dbname = accounts;charset=UTF8","scott","tiger");  }catch (PDOException $e){      echo "數(shù)據(jù)庫(kù)連接失敗:".$e->getMessage();  }  ?&gt;

OCI:dbname = accounts告訴PDO它應(yīng)該使用 OCI驅(qū)動(dòng)程序,并且應(yīng)該使用“accounts”數(shù)據(jù)庫(kù)。對(duì)于MySQL驅(qū)動(dòng)程序,第一個(gè)冒號(hào)后面的所有內(nèi)容都將會(huì)被用作MySQL的DSN。連接MySQL 服務(wù)器的顯示如下:

<?php $dbms = "mysql";                                  // 數(shù)據(jù)庫(kù)的類型  $dbName ="php_cn";                                //使用的數(shù)據(jù)庫(kù)名稱  $user = "root";                                   //使用的數(shù)據(jù)庫(kù)用戶名  $pwd = "root";                                    //使用的數(shù)據(jù)庫(kù)密碼  $host = "localhost";                              //使用的主機(jī)名稱  $dsn  = "$dbms:host=$host;dbname=$dbName";  try {      $pdo = new PDO($dsn, $user, $pwd);//初始化一個(gè)PDO對(duì)象,就是創(chuàng)建了數(shù)據(jù)庫(kù)連接對(duì)象$pdo  }catch (PDOException $e){     echo "數(shù)據(jù)庫(kù)連接失敗:".$e->getMessage();  }  ?&gt;

其他的驅(qū)動(dòng)程序會(huì)同樣以不同的方式解析它的DSN,如果無(wú)法加載驅(qū)動(dòng)程序,或者發(fā)生了連接失敗,則會(huì)拋出一個(gè)PDOException,以便您可以決定如何最好的處理該故障。省略try…catch 控制結(jié)構(gòu)并無(wú)裨益,如果在應(yīng)用程序的較高級(jí)別沒(méi)有定義異常處理,那么在無(wú)法建立數(shù)據(jù)庫(kù)連接的情況下,該腳本會(huì)終止。

二、將參數(shù)存放在文件中

在創(chuàng)建PDO對(duì)象時(shí),可以把DSN字符串放在另一個(gè)本地或者遠(yuǎn)程文件中,并在構(gòu)造函數(shù)中引用這個(gè)文件,如下所示:

<?php try{      $dbh = new PDO(&#39;uri:file:///usr/localhost/dbconnect&#39;,&#39;webuser&#39;,&#39;password&#39;);  }catch(PDOException $e){      echo &#39;連接失敗:&#39;.$e->getMessage();  }  ?&gt;

只要將文件/usr/localhost/dbconnect中的DSN驅(qū)動(dòng)改變,就可以在多種數(shù)據(jù)庫(kù)系統(tǒng)之間切換,但是確保該文件由負(fù)責(zé)執(zhí)行PHP腳本的用戶所擁有,而且此用戶擁有必要的權(quán)限。

三、引用 php.ini文件

也可以在PHP服務(wù)器的配置文件中維護(hù)DSN信息,只要在php.ini文件中吧DSN信息付給一個(gè)名為 pdo.dsn.aliasname ?的配置參數(shù),這里 aliasname ?是后面將提供給構(gòu)造函數(shù)的DSN別名。如下所示連接Oracle 服務(wù)器,在php.ini中為DSN指定的別名為 oraclepdo:

【PDO】  pdo.dsn.oraclepdo?=?“OCI:dbname=//localhost:1521/mydb;chaset=UTF-8”;

重新啟動(dòng) Apaceh服務(wù)器后,就可以在php程序中,調(diào)用PDO構(gòu)造方法時(shí),在第一個(gè)參數(shù)中使用這個(gè)別名,如下所示:

<?php try{      $dbh = new PDO(&#39;oraclepdo&#39;,&#39;scott&#39;,&#39;tiger&#39;);//使用php.ini文件中的oraclepdo 別名  }catch(PDOException $e){      echo &#39;連接失敗:&#39;.$e->getMessage();  }  ?&gt;

四、PDO與連接有關(guān)的選項(xiàng)

在創(chuàng)建PDO對(duì)象時(shí),有一些與數(shù)據(jù)庫(kù)連接有關(guān)選項(xiàng),可以將必要的幾個(gè)選項(xiàng)組成數(shù)組傳遞給構(gòu)造方法的第四個(gè)參數(shù) driver_opts中,用來(lái)傳遞附加的調(diào)優(yōu)參數(shù)到PDO貨底層驅(qū)動(dòng)程序。一些常用的使用選項(xiàng)如表:

選項(xiàng)名 描述
PDO::ATTR_AUTOCOMMIT 確定PDO是否關(guān)閉自定提交功能,設(shè)置FALSE值時(shí)關(guān)閉
PDO::ATTR_CASE 強(qiáng)制PDO獲取的表字段字符的大小轉(zhuǎn)換,或遠(yuǎn)原樣使用列信息
PDO::ATTR_ERRMODE 設(shè)置錯(cuò)誤處理的模式
PDO::ATTR_PERSISTENT 確定連接是否為持久連接,默認(rèn)值為FALSE
PDO::ATTR_ORACCLE_NULLS 將返回的空字符串轉(zhuǎn)換為SQL的NULL
PDO::ATTR_PREFETCH 設(shè)置應(yīng)用程序提前獲取的數(shù)據(jù)大小,以K字節(jié)單位
PDO::ATTR_TIMEOUT 設(shè)置超市之前等待的時(shí)間(秒數(shù))
PDO::ATTR_SERVER_INFO 包含與數(shù)據(jù)庫(kù)特有的服務(wù)器信息
PDO::ATTR_SERVER_VERSION 包含與數(shù)據(jù)庫(kù)服務(wù)器版本號(hào)有關(guān)的信息
PDO::ATTR_CLIENT_VERSION 包含與數(shù)據(jù)庫(kù)客戶端版本號(hào)有關(guān)的信息
PDO::ATTR_CONNECTION_STATUS 包含數(shù)據(jù)庫(kù)特有的與連接狀態(tài)有關(guān)的信息

設(shè)置選項(xiàng)名為下表組成的關(guān)聯(lián)數(shù)組,作為驅(qū)動(dòng)程序特定的連接選項(xiàng),傳遞給PDO構(gòu)造方法的第四各參數(shù)中,在下面的實(shí)例中使用連接選項(xiàng)創(chuàng)建持久連接,持久連接的好處是能夠避免在每個(gè)頁(yè)面執(zhí)行到打開和關(guān)閉數(shù)據(jù)庫(kù)服務(wù)器連接,速度更快,如 MySQL數(shù)據(jù)庫(kù)的一個(gè)進(jìn)程創(chuàng)建了兩個(gè)連接,PHP則會(huì)把原有連接與新的連接合并共享為一個(gè)連接,代碼如下:

<?php $opt = array(PDO::ATTR_PERSISTENT =>true);  try{  ????$dbh?=?new?PDO('mysql:host=localhost;dbname=test','dbuser','password',$opt);?//使用$opt參數(shù)  }catch(PDOException?$e){  ????echo?'連接失敗:'.$e-&gt;getMessage();  }  ?&gt;

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享