PHP物件導向07_PDO

飛鴻影~發表於2016-04-21

oop007複習

2014-9-4 9:42:28

 

摘要:

1、pdo的作用
2、pdo的安裝
3、pdo連線屬性設定
4、pdo物件和PDOStatement物件
5、pdo預處理
6、pdo事務機制

1、pdo的作用

簡介:
PDO(php data object)擴充套件類庫為php訪問資料庫定義了輕量級的、一致性的介面,它提供了一個資料庫訪問抽象層.
這樣,無論你使用什麼資料庫,都可以通過一致的函式執行查詢和獲取資料.
PDO大大簡化了資料庫的操作並能夠遮蔽不同資料庫之間的差異.
使用pdo可以很方便地進行跨資料庫程式的開發,以及不同資料庫間的移植,是將來php在資料庫處理方面的主要發展方向.
它可以支援mysql,postgresql,oracle,mssql等多種資料庫.

舉例說明:
假如我們做了個專案,使用的是mysql,如果是程式導向運算元據庫,那麼,基本上所有的資料庫函式都是mysql_形式.
現在我們突然要換資料庫了,比如pgsql.而pgsql資料庫函式基本是pg_形式.
並且二者部分函式是互相不存在的,都有各自的”擴充套件函式”.
那麼這時候改專案就比較複雜了.

但是如果我們使用的是pdo運算元據庫,一切都簡單了.
使用mysql,我們只需在連線的時候這樣定義:

$m=new PDO("mysql:host=localhost;dbname=test","root","123");

使用pgsql,我們只需在連線的時候這樣定義:

$m=new PDO("pgsql:host=localhost;port=5432;dbname=test","postgres","123");

其它的操作都是一樣的,比如查詢都是stmt=m->query(sql),stmt->fetchAll();
一切都變簡單了.PDo還提供了預處理和事務支援.

2、pdo的安裝

[windows環境]
01) 編輯php.ini檔案:

extension=php_pdo.dll
extension=php_pdo_mysql.dll

02)重啟apache服務:

httpd –k restart

03)開啟phpinfo.php檢視是否有pdo、pdo_mysql

[Linux環境(CentOS6.0)]
一般步驟是:



1 tar -zxvf PDO_MYSQL-1.0.2.tgz
2 cd PDO_MYSQL-1.0.2
3 /usr/local/php/bin/phpize
4 ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
5 make
6 make install

編輯php.ini,新增
注:$ext_dir為擴充套件目錄名字,例如no-debug-zts-20060613

extension_dir=/usr/local/php/lib/php/extensions/$ext_dir
extension=pdo_mysql.so

然後重啟伺服器即可.

3、pdo連線屬性設定

*連線資料庫格式:

PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

01)連線mysql

$m=new PDO("mysql:host=localhost;dbname=test","root","123");

02)連線pgsql

$m=new PDO("pgsql:host=localhost;port=5432;dbname=test","postgres","123");

03)連線Oracle

$m=new PDO("OCI:dbname=accounts;charset=UTF-8", "scott", "tiger"); 

*不過,一般都是採用異常處理方式連線,例如 :

try{
  $m=new PDO("mysql:host=localhost;dbname=test","root","123");
  }catch(PDOException $e){
  die(`資料庫連線失敗:` . $e->getMessage());
}

 

*PDO與連線有關的選項

PDO::ATTR_ERRMODE
PDO::ERRMODE_SILENT 0    忽略錯誤模式
PDO::ERRMODE_WARNING 1    警告級別模式
PDO::ERRMODE_EXCEPTION 2    異常處理模式
PDO::ATTR_AUTOCOMMIT
//關閉自動提交
//開啟自動提交
PDO::ATTR_DEFAULT_FETCH_MODE 
PDO::FETCH_ASSOC 2
PDO::FETCH_NUM 3
PDO::FETCH_BOTH 4
PDO::FETCH_OBJ 5

例如:

$option=array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
$m=new PDO("mysql:host=localhost;dbname=test","root","123",$option);

 

或者更通用的設定屬性方式:



$m->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//設定異常處理方式
$m->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);//設定預設關聯索引遍歷

 

常見PDO屬性輸出:

echo "
PDO是否關閉自動提交功能:". $m->getAttribute(PDO::ATTR_AUTOCOMMIT);
echo "
當前PDO的錯誤處理的模式:". $m->getAttribute(PDO::ATTR_ERRMODE); 
echo "
表欄位字元的大小寫轉換: ". $m->getAttribute(PDO::ATTR_CASE); 
echo "
與連線狀態相關特有資訊: ". $m->getAttribute(PDO::ATTR_CONNECTION_STATUS); 
echo "
空字串轉換為SQL的null:". $m->getAttribute(PDO::ATTR_ORACLE_NULLS); 
echo "
應用程式提前獲取資料大小:".$m->getAttribute(PDO::ATTR_PERSISTENT); 
echo "
與資料庫特有的伺服器資訊:".$m->getAttribute(PDO::ATTR_SERVER_INFO); 
echo "
資料庫伺服器版本號資訊:". $m->getAttribute(PDO::ATTR_SERVER_VERSION);
echo "
資料庫客戶端版本號資訊:". $m->getAttribute(PDO::ATTR_CLIENT_VERSION);

 

*字符集設定
設定php連線mysql時的客戶端字串和連線字串集為:

$pdo->exec("set names utf8");

或者:

$pdo->query("set names utf8");

4、PDO物件和PDOStatement物件

01)pdo物件中的成員方法

1.PDO::beginTransaction — 啟動一個事務
2.PDO::commit — 提交一個事務
3.PDO::__construct — 建立一個表示資料庫連線的 PDO 例項
4.PDO::errorCode — 獲取跟資料庫控制程式碼上一次操作相關的 SQLSTATE
5.PDO::errorInfo — 獲取錯誤資訊
6.PDO::exec — 執行一條 SQL 語句,並返回受影響的行數
7.PDO::getAttribute — 取回一個資料庫連線的屬性
*8.PDO::getAvailableDrivers — 返回一個可用驅動的陣列(瞭解即可)
*9.PDO::inTransaction — 檢查是否在一個事務內(瞭解即可)
10.PDO::lastInsertId — 返回最後插入行的ID或序列值
11.PDO::prepare — 建立SQL的預處理,返回PDOStatement物件
12.PDO::query — 用於執行查詢SQL語句,返回PDOStatement物件
13.PDO::quote — 為sql字串新增單引號
14.PDO::rollBack — 回滾一個事務
15.PDO::setAttribute — 設定屬性

 

pdo::query()方法
當執行返回結果集的select查詢時,或者所影響的行數無關緊要時,應當使用pdo物件中的query()方法.
如果該方法成功執行指定的查詢,則返回一個PDOStatement物件.
如果使用了query()方法,並想了解獲取資料行總數,可以使用PDOStatement物件中的rowCount()方法獲取

pdo::exec()方法
當執行insert,update,delete沒有結果集的查詢時,使用pdo物件中的exec()方法去執行.
該方法成功執行時,將返回受影響的行數.注意,該方法不能用於select查詢.

——————————————————————————————-
示例:

<?php
try{
  $m=new PDO("mysql:host=localhost;dbname=test","root","123");
}catch(PDOException $e){
  die(`資料庫連線失敗:` . $e->getMessage());
}

$stmt=$m->query("select * from stu");//返回PDOStatement物件$stmt
echo $stmt->rowCount();
?>

 

——————————————————————————————-

02)PDOStatement物件中的成員方法

1.PDOStatement::bindColumn — 繫結一列到一個 PHP 變數(*)
2.PDOStatement::bindParam — 繫結一個引數到指定的變數名(*)
3.PDOStatement::bindValue — 把一個值繫結到一個引數(*)
4.PDOStatement::closeCursor — 關閉遊標,使語句能再次被執行。
5.PDOStatement::columnCount — 返回結果集中的列數
6.PDOStatement::debugDumpParams — 列印一條 SQL 預處理命令
7.PDOStatement::errorCode — 獲取跟上一次語句控制程式碼操作相關的 SQLSTATE(*)
8.PDOStatement::errorInfo — 獲取跟上一次語句控制程式碼操作相關的擴充套件錯誤資訊(*)
9.PDOStatement::execute — 執行一條預處理語句(*)
10.PDOStatement::fetch — 從結果集中獲取下一行(*)
11.PDOStatement::fetchAll — 返回一個包含結果集中所有行的陣列(*)
12.PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列。
13.PDOStatement::fetchObject — 獲取下一行並作為一個物件返回。
14.PDOStatement::getAttribute — 檢索一個語句屬性(*)
15.PDOStatement::getColumnMeta — 返回結果集中一列的後設資料
16.PDOStatement::nextRowset — 在一個多行集語句控制程式碼中推進到下一個行集
17.PDOStatement::rowCount — 返回受上一個 SQL 語句影響的行數(*)
18.PDOStatement::setAttribute — 設定一個語句屬性(*)
19.PDOStatement::setFetchMode — 為語句設定預設的獲取模式。

注:(*)表示必須會使用的方法.

5、pdo預處理

準備一條SQL語句使用PDOStatement::execute()方法執行.
預處理SQL語句可以使用包含零或多個命名為(:name)或者以?號標記為(?)的形式.例如

$stmt=$m->prepare("insert into stu(name,age,sex,classid)values(?,?,?,?)");
$stmt=$m->prepare("insert into stu(name,age,sex,classid)values(:name,:age,:sex,:classid)");

預處理的好處是可以防止SQL隱碼攻擊、更快執行效率支援批量操作.

6、pdo事務機制

概要:將多條sql操作(增刪改)作為一個操作單元,要麼都成功,要麼都失敗.
單條資料不用事務處理


相關文章