PDO概述
以往,PHP對(duì)不同的數(shù)據(jù)庫(kù)有著不同支持的擴(kuò)展函數(shù),如果在項(xiàng)目中要切換數(shù)據(jù)庫(kù),則要進(jìn)行相當(dāng)于返工重構(gòu)的工作量反粥。
引入PDO的概念后, PHP有了一個(gè)對(duì)數(shù)據(jù)庫(kù)同一進(jìn)行操作的對(duì)象:
PDO的全稱(chēng)是:PHP Data Object(PHP數(shù)據(jù)對(duì)象)在新版本的PHP(PHP5以上)中,PHP為用戶(hù)封裝了一套PDO擴(kuò)展庫(kù)谓松,專(zhuān)門(mén)用來(lái)操作不同類(lèi)型的數(shù)據(jù)庫(kù)星压!
———————————————————————————————————————
PDO具體實(shí)現(xiàn):
開(kāi)啟PDO擴(kuò)展:
PHP.INI中開(kāi)啟pdo_pdo.dll ,并開(kāi)啟對(duì)應(yīng)數(shù)據(jù)庫(kù)的擴(kuò)展
PDO的實(shí)例化:
PDO的擴(kuò)展庫(kù)是面對(duì)對(duì)象封裝的,內(nèi)部結(jié)構(gòu):
- PDO::__construct — 創(chuàng)建一個(gè)表示數(shù)據(jù)庫(kù)連接的 PDO 實(shí)例
- PDO::beginTransaction — 啟動(dòng)一個(gè)事務(wù)
- PDO::commit — 提交一個(gè)事務(wù)
- PDO::errorCode — 獲取跟數(shù)據(jù)庫(kù)句柄上一次操作相關(guān)的 SQLSTATE
- PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle
- PDO::exec — 執(zhí)行一條 SQL 語(yǔ)句,并返回受影響的行數(shù)
- PDO::getAttribute — 取回一個(gè)數(shù)據(jù)庫(kù)連接的屬性
- PDO::getAvailableDrivers — 返回一個(gè)可用驅(qū)動(dòng)的數(shù)組
- PDO::inTransaction — 檢查是否在一個(gè)事務(wù)內(nèi)
- PDO::lastInsertId — 返回最后插入行的ID或序列值
- PDO::prepare — Prepares a statement for execution and returns a statement object
- PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object
- PDO::quote — Quotes a string for use in a query.
- PDO::rollBack — 回滾一個(gè)事務(wù)
- PDO::setAttribute — 設(shè)置屬性
1鬼譬、構(gòu)造函數(shù)-設(shè)置數(shù)據(jù)源:
PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
創(chuàng)建一個(gè)表示連接到請(qǐng)求數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)連接 PDO 實(shí)例娜膘。
第一個(gè)參數(shù):$dsn : data source name數(shù)據(jù)源名稱(chēng),其實(shí)就是告訴PDO類(lèi)應(yīng)該選擇哪種類(lèi)型的數(shù)據(jù)庫(kù)优质,主機(jī)名和端口號(hào)是什么竣贪,選擇哪個(gè)數(shù)據(jù)庫(kù)以及采用什么樣的字符編碼。
例如:
$dbms=‘mysq1‘巩螃;
$port=‘3306‘演怎;
$dbname=‘?dāng)?shù)據(jù)庫(kù)名‘;
$charset=‘utf8‘避乏;
$dsn=“$dbms:host=$host爷耀;port=$port;charset=$charset拍皮;dbname=$dbname”歹叮;
實(shí)例化:
$pdo=new PDO($dsn,$user,$pass);
記一下幾個(gè)重要的方法:
* rowcount(); 返回結(jié)果集行數(shù)
* columncount(); 返回結(jié)果集列數(shù)
PDO statement:
- PDOStatement::bindColumn — 綁定一列到一個(gè) PHP 變量
- PDOStatement::bindParam — 綁定一個(gè)參數(shù)到指定的變量名
- PDOStatement::bindValue — 把一個(gè)值綁定到一個(gè)參數(shù)
- PDOStatement::closeCursor — 關(guān)閉游標(biāo),使語(yǔ)句能再次被執(zhí)行铆帽。
- PDOStatement::columnCount — 返回結(jié)果集中的列數(shù)
- PDOStatement::debugDumpParams — 打印一條 SQL 預(yù)處理命令
- PDOStatement::errorCode — 獲取跟上一次語(yǔ)句句柄操作相關(guān)的 SQLSTATE
- PDOStatement::errorInfo — 獲取跟上一次語(yǔ)句句柄操作相關(guān)的擴(kuò)展錯(cuò)誤信息
- PDOStatement::execute — 執(zhí)行一條預(yù)處理語(yǔ)句
- PDOStatement::fetch — 從結(jié)果集中獲取下一行
- PDOStatement::fetchAll — 返回一個(gè)包含結(jié)果集中所有行的數(shù)組
- PDOStatement::fetchColumn — 從結(jié)果集中的下一行返回單獨(dú)的一列咆耿。
- PDOStatement::fetchObject — 獲取下一行并作為一個(gè)對(duì)象返回。
- PDOStatement::getAttribute — 檢索一個(gè)語(yǔ)句屬性
- PDOStatement::getColumnMeta — 返回結(jié)果集中一列的元數(shù)據(jù)
- PDOStatement::nextRowset — 在一個(gè)多行集語(yǔ)句句柄中推進(jìn)到下一個(gè)行集
- PDOStatement::rowCount — 返回受上一個(gè) SQL 語(yǔ)句影響的行數(shù)
- PDOStatement::setAttribute — 設(shè)置一個(gè)語(yǔ)句屬性
- PDOStatement::setFetchMode — 為語(yǔ)句設(shè)置默認(rèn)的獲取模式
記一下幾個(gè)重要的方法:
1爹橱、利用fetch對(duì)結(jié)果集進(jìn)行遍歷萨螺,fetchAll獲取全部結(jié)果集:
PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )
$rows=array();
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
$rows[]=$row;var_dump($rows);
其中可以攜帶的參數(shù)為:
- PDO::FETCH_ASSOC:返回一個(gè)索引為結(jié)果集列名的數(shù)組
- PDO::FETCH_BOTH(默認(rèn)):返回一個(gè)索引為結(jié)果集列名和以0開(kāi)始的列號(hào)的數(shù)組
- PDO::FETCH_BOUND:返回
TRUE
,并分配結(jié)果集中的列值給 PDOStatement::bindColumn() 方法綁定的 PHP 變量。
- PDO::FETCH_CLASS:返回一個(gè)請(qǐng)求類(lèi)的新實(shí)例慰技,映射結(jié)果集中的列名到類(lèi)中對(duì)應(yīng)的屬性名椭盏。如果
fetch_style
包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),則類(lèi)名由第一列的值決定
- PDO::FETCH_INTO:更新一個(gè)被請(qǐng)求類(lèi)已存在的實(shí)例惹盼,映射結(jié)果集中的列到類(lèi)中命名的屬性
- PDO::FETCH_LAZY:結(jié)合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ庸汗,創(chuàng)建供用來(lái)訪問(wèn)的對(duì)象變量名
- PDO::FETCH_NUM:返回一個(gè)索引為以0開(kāi)始的結(jié)果集列號(hào)的數(shù)組
- PDO::FETCH_OBJ:返回一個(gè)屬性名對(duì)應(yīng)結(jié)果集列名的匿名對(duì)象
———————————————————————————————————————
PDO預(yù)處理:
減輕服務(wù)器連接數(shù)據(jù)庫(kù)壓力
因?yàn)槊看螆?zhí)行的sql語(yǔ)句的命令和結(jié)構(gòu)都是一樣的,只是其中的數(shù)據(jù)不同手报,但是蚯舱,由于采用傳統(tǒng)的執(zhí)行方式,每次都必須傳輸整條sql語(yǔ)句掩蛤,而且對(duì)于MySQL服務(wù)器而言枉昏,得到的每一次的命令都是全新,都是根據(jù)sql語(yǔ)句從0解析并執(zhí)行揍鸟!
基本策略
預(yù)處理的基本策略:
1 將sql語(yǔ)句強(qiáng)制一分為二:
第一部分為前面相同的命令和結(jié)構(gòu)部分
第二部分為后面可變的數(shù)據(jù)部分
在執(zhí)行sql語(yǔ)句的時(shí)候兄裂,首先將前面相同的命令和結(jié)構(gòu)部分發(fā)送給MysQL服務(wù)器,讓MysQL先進(jìn)行預(yù)處理:
相對(duì)應(yīng)的sql語(yǔ)句為:
第一步:準(zhǔn)備擁有占位符的預(yù)處理語(yǔ)句
mysql> prepare 語(yǔ)句名稱(chēng) from“預(yù)處理的sql 語(yǔ)句值1=? 值2=?”阳藻;
其中語(yǔ)句名稱(chēng)就是給后面需要預(yù)處理的sql語(yǔ)句起一個(gè)名字晰奖!
定義參數(shù)變量并傳入, 無(wú)參數(shù)的預(yù)處理就無(wú)這部
mysql> set @param 1= ; set @param 2= ;
多次不同更改只需要改變@param 的值
第三執(zhí)行
mysql>execute 語(yǔ)句名 using 參數(shù)變量 @param 1,@param 2
其在PDO中對(duì)應(yīng)的方法為:
第一步: 調(diào)用prepare得到statement結(jié)果對(duì)象
構(gòu)造有占位符的sql并使用prepare處理
第二步:傳參
bindParam(第幾個(gè)占位符(如果不是用?,用:+字符串站位站位則為字符串綁定),參數(shù))
執(zhí)行
調(diào)用execute 執(zhí)行
———————————————————————————————————————
PDO相關(guān)屬性
設(shè)置 setAttribute :
獲取 getAttribute :