程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 新的數據庫連接方式 PHP Data Object

php 新的數據庫連接方式 PHP Data Object

編輯:關於PHP編程

PHP數據對象(PDO)擴展定義了一個輕型的一致的訪問數據庫的接口.每個實現了PDO接口的驅動程序像一般的擴展函數一樣展示數據庫相關的特性.不能用PDO函數本身執行任何數據庫函數,必須使用數據庫相關的驅動程序來訪問數據庫服務器。
PDO提供了一個數據訪問抽象層,意思是不需要知道正在使用什麼數據庫,就可以用同樣的函數發布查詢和檢索數據。
PDO綁定到了PHP5.1中,在PHP5.0中可以作為PECL擴展使用,PDO要求新的PHP5核心的面向對象的特性,在之前的版本不能運行。

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是轉的,作為入門讀物了。

★數據庫的連接:
我們通過下面的例子來分析PDO連接數據庫,
<?php
$dbms=mysql;     //數據庫類型 Oracle 用ODI,對於開發者來說,使用不同的數據庫,只要改這個,不用記住那麼多的函數了
$host=localhost;//數據庫主機名
$dbName=test;   //使用的數據庫
$user=root;      //數據庫連接用戶名
$pass=;         //對應的密碼
$dsn="$dbms:host=$host;dbname=$dbName";
//

try{
   $dbh=newPDO($dsn,$user,$pass);//初始化一個PDO對象,就是創建了數據庫連接對象$dbh
   echo"連接成功<br/>";
   /*你還可以進行一次搜索操作

   foreach($dbh->query(SELECT * from FOO)as$row){
        print_r($row);//你可以用 echo($GLOBAL); 來看到這些值
   }
   */
   $dbh=null;
}catch(PDOException$e){
   die("Error!: ".$e->getMessage()."<br/>");
}
//默認這個不是長連接,如果需要數據庫長連接,需要最後加一個參數:array(PDO::ATTR_PERSISTENT => true) 變成這樣:
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT=>true));
?>

★數據庫查詢:

上面我們已經進行了一次查詢,我們還可以使用如下的查詢:
<?php
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); //設置屬性
$rs=$db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr=$rs->fetchAll();
print_r($result_arr);
?>

以上因為用到setAttribute()方法,放上那兩個參數,把字段名強制轉換成大寫。下面列出多有PDO::setAttribute()的參數:

PDO::ATTR_CASE: 強制列名變成一種格式,詳細如下(第二個參數):

PDO::CASE_LOWER: 強制列名是小寫.

PDO::CASE_NATURAL: 列名按照原始的方式

PDO::CASE_UPPER: 強制列名為大寫.

PDO::ATTR_ERRMODE: 錯誤提示.

PDO::ERRMODE_SILENT: 不顯示錯誤信息,只顯示錯誤碼.

PDO::ERRMODE_WARNING: 顯示警告錯誤.

PDO::ERRMODE_EXCEPTION: 拋出異常.

PDO::ATTR_ORACLE_NULLS(不僅僅是ORACLE有效,別的數據庫也有效): )指定數據庫返回的NULL值在php中對應的數值。

PDO::NULL_NATURAL: 不變.

PDO::NULL_EMPTY_STRING: Empty string is converted toNULL.

PDO::NULL_TO_STRING: NULL is converted to an empty string.

PDO::ATTR_STRINGIFY_FETCHES: Convert numeric values to strings when fetching. Requires bool.

PDO::ATTR_STATEMENT_CLASS: Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requiresarray(string classname, array(mixed constructor_args)).

PDO::ATTR_AUTOCOMMIT(available in OCI, Firebird and MySQL): Whether to autocommit every single statement.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(available in MySQL): Use buffered queries.

例子中的$rs->setFetchMode(PDO::FETCH_ASSOC);是PDOStatement::setFetchMode(),對返回類型的聲明。
有如下:
PDO::FETCH_ASSOC-- 關聯數組形式
PDO::FETCH_NUM   -- 數字索引數組形式
PDO::FETCH_BOTH  -- 兩者數組形式都有,這是缺省的
PDO::FETCH_OBJ  -- 按照對象的形式,類似於以前的 mysql_fetch_object()

更多返回類型聲明(PDOStatement::方法名)看手冊。

★插入,更新,刪除數據,
$db->exec("DELETE FROM `xxxx_menu` where mid=43");

簡單的總結一下上面的操作:
查詢操作主要是PDO::query()、PDO::exec()、PDO::prepare()。
PDO::query()主要是用於有記錄結果返回的操作,特別是SELECT操作,
PDO::exec()主要是針對沒有結果集合返回的操作,比如INSERT、UPDATE、DELETE等操作,它返回的結果是當前操作影響的列數。
PDO::prepare()主要是預處理操作,需要通過$rs->execute()來執行預處理裡面的SQL語句,這個方法可以綁定參數,功能比較強大,不是本文能夠簡單說明白的,大家可以參考手冊和其他文檔。
獲取結果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()、PDOStatement::fetchALL()。
PDOStatement::fetchColumn()是獲取結果指定第一條記錄的某個字段,缺省是第一個字段。
PDOStatement::fetch()是用來獲取一條記錄,
PDOStatement::fetchAll()是獲取所有記錄集到一個中,獲取結果可以通過PDOStatement::setFetchMode來設置需要結果集合的類型。
另外有兩個周邊的操作,一個是PDO::lastInsertId()和PDOStatement::rowCount()。PDO::lastInsertId()是返回上次插入操作,主鍵列類型是自增的最後的自增ID。
PDOStatement::rowCount()主要是用於PDO::query()和PDO::prepare()進行DELETE、INSERT、UPDATE操作影響的結果集,對PDO::exec()方法和SELECT操作無效。

★事務和自動提交

    至此,您已經通過 PDO 連接到了 mysql,在發出查詢之前,您應該理解 PDO 是如何管理事務的。如果之前沒有接觸過事務,那麼首先要知道事務的 4 個特征:原子性(Atomicity)、一致性(Consistency)、獨立性(Isolation)和持久性(Durability),即 ACID。用外行人的話說,對於在一個事務中執行的任何工作,即使它是分階段執行的,也一定可以保證該工作會安全地應用於數據庫,並且在工作被提交時,不會受到來自其他連接的影響。事務性工作可以根據請求自動撤銷(假設您還沒有提交它),這使得腳本中的錯誤處理變得更加容易。
    事務通常是通過把一批更改積蓄起來、使之同時生效而實現的。這樣做的好處是可以大大提高這些更新的效率。換句話說,事務可以使腳本更快,而且可能更健壯(不過需要正確地使用事務才能獲得這樣的好處)。
    不幸的是,並不是每種數據庫都支持事務(Mysql5支持事務,mysql4我不知道),所以當第一次打開連接時,PDO 需要在所謂的“自動提交(auto-commit)”模式下運行。自動提交模式意味著,如果數據庫支持事務,那麼您所運行的每一個查詢都有它自己的隱式事務,如果數據庫不支持事務,每個查詢就沒有這樣的事務。如果您需要一個事務,那麼必須使用 PDO::beginTransaction() 方法來啟動一個事務。如果底層驅動程序不支持事務,那麼將會拋出一個 PDOException(無論錯誤處理設置是怎樣的:這總是一個嚴重錯誤狀態)。在一個事務中,可以使用 PDO::commit() 或 PDO::rollBack() 來結束該事務,這取決於事務中運行的代碼是否成功。
    當腳本結束時,或者當一個連接即將被關閉時,如果有一個未完成的事務,那麼 PDO 將自動回滾該事務。這是一種安全措施,有助於避免在腳本非正常結束時出現不一致的情況 —— 如果沒有顯式地提交事務,那麼假設有某個地方會出現不一致,所以要執行回滾,以保證數據的安全性。
try{
  $dbh=new PDO(odbc:SAMPLE,db2inst1,ibmdb2,
      array(PDO_ATTR_PERSISTENT=>true));
  echo"Connected ";
  $dbh->setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
  $dbh->beginTransaction();
  $dbh->exec("insert into staff (id, first, last) values (23, Joe, Bloggs)");
  $dbh->exec("insert into salarychange (id, amount, changedate)
      values (23, 50000, NOW())");
  $dbh->commit();
 
}catch(Exception $e){
  $dbh->rollBack();
  echo"Failed: ".$e->getMessage();
}

在上面的示例中,假設我們為一個新雇員創建一組條目,這個雇員有一個 ID 號,即 23。除了輸入這個人的基本數據外,我們還需要記錄雇員的薪水。兩個更新分別完成起來很簡單,但通過將這兩個更新包括在 beginTransaction() 和 commit() 調用中,就可以保證在更改完成之前,其他人無法看到更改。如果發生了錯誤,catch 塊可以回滾事務開始以來發生的所有更改,並打印出一條錯誤消息。
並不是一定要在事務中作出更新。您也可以發出復雜的查詢來提取數據,還可以使用那種信息構建更多的更新和查詢。當事務在活動時,可以保證其他人在工作進行當中無法作出更改。事實上,這不是 100% 的正確,但如果您之前沒有聽說過事務的話,這樣介紹也未嘗不可。<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved