php使用PDO方法詳解
本文詳細(xì)分析了php使用PDO方法。分享給大家供大家參考。具體分析如下:
PDO::exec:返回的是int類型,表示影響結(jié)果的條數(shù).
返回的是boolean型,true表示執(zhí)行成功,false表示執(zhí)行失敗,這兩個(gè)通常出現(xiàn)在如下代碼:
$pre = $pdo->prepare($sql);
$rs1 = $pre->execute();
一般情況下可以用$rs0的值判斷SQL執(zhí)行成功與否,如果其值為false表示SQL執(zhí)行失敗,0表示沒(méi)有任何更改,大于0的值表示影響了多少條記錄.
但是$rs1只能返回SQL執(zhí)行成功與否,如果需要獲取影響的記錄數(shù)需要使用$pre->rowCount();
我個(gè)人喜歡使用 MySQL,所以我的 extensions.ini 中有這二行.
extension=pdo_mysql.so
接著在程式中,代碼如下:
define('DB_USER','test');
define('DB_PASSWD','test');
define('DB_HOST','localhost');
define('DB_TYPE','mysql');
$dbh = new PDO(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWD);
文中的使用常數(shù)設(shè)定是我個(gè)人的習(xí)慣,各位不用像我這么麻煩,當(dāng)像上面的操作,$dbh 本身就是代表了PDO的連線了,那要怎樣使用PDO呢?
第一種,懶人法 query,什么都不用想,像平常一樣的使用 query 的函式,代碼如下:
foreach ( $dbh->query($sql) as $value)
{
echo $value[col];
};
第二種,自動(dòng)帶入法 prepare,我個(gè)人使用PDO后,偏好利用 prepare 的函式來(lái)進(jìn)行作動(dòng) prepare 的好處是可以先寫(xiě)好 SQL 碼,并且在稍后自動(dòng)帶入我們要的資料.
這個(gè)我想最大的好處是比起直接利用 query 可以減少許多安全性的問(wèn)題,首先,我們利用 prepare 進(jìn)行 SQL 碼的設(shè)定,在利用bindparm 來(lái)進(jìn)行設(shè)定的動(dòng)作,代碼如下:
$sth->bindParam(':str',$str,PDO::PARAM_STR,12);
$sth->bindParam(':SN',$SN);
$sth->execute();
請(qǐng)注意文中的 :str 及 :SN,當(dāng)我們利用 bindParam的函式,可以利用 :word 來(lái)指定系統(tǒng)需要套用的部份,像是我們利用:str 及 :SN 來(lái)指定,而實(shí)際的內(nèi)容,就靠bindParam還可以指定我們要輸入的型態(tài)。
首先我們先看 :str 的指定,:str 由於我確定資料是屬於文字,因此利用 PD::PARAM_STR 來(lái)告訴程式“這個(gè)是字串喲”,并且給一個(gè)范圍,也就是長(zhǎng)度是12個(gè)位元。
我們也可以不要那么復(fù)雜,像 :SN,雖然也是用 bindParam 來(lái)指定,但是我們省略了型態(tài)及長(zhǎng)度,PHP 會(huì)用該變數(shù)預(yù)設(shè)的型態(tài)來(lái)套用.
最后呢,就是利用 $sth->execute(); 來(lái)進(jìn)行執(zhí)行的動(dòng)作,基本上不難,甚至可以說(shuō)很簡(jiǎn)單呢.
如果你有大量需要重復(fù)套用的資料,你就可以拼了命的重新利用 bindParam 來(lái)指定,比如我的:str 及 :SN 如果有十筆資料,我也可以這樣子直接新增到資料庫(kù),代碼如下:
foreach ($array => $value )
{
$sth->bindParam(':str',$value[str],PDO::PARAM_STR,12);
$sth->bindParam(':SN',$value[SN]);
$sth->execute();
}
甚至強(qiáng)者如我朋友,把所有可能的 SQL 全寫(xiě)在一個(gè)檔案后面,后來(lái)的過(guò)程SQL的部份就變成全用變數(shù)帶進(jìn)去了,反正資料可以用現(xiàn)成的方式套用嘛.
那,如果利用 prepare 的方式來(lái) select,關(guān)鍵字當(dāng)然也可以像上面的方式利用:word 來(lái)指定,代碼如下:
$sth->bindParam(':SN',$value[SN]);
$sth->execute();
while($meta = $sth->fetch(PDO::FETCH_ASSOC))
{
echo $meta["name"];
}
這樣新出現(xiàn)的是 fetch,跟mysql_fetch_row() 的意思差不多,但是在 fetch() 中我們發(fā)現(xiàn)多了一個(gè) PDO::FETCH_ASSOC 這個(gè)東西.
fetch() 提供了許多獲取資料的方式,而 PDO::FETCH_ASSOC 指的就是傳回下一筆資料的欄位名及值啦
比如上例,利用 $meta 來(lái)取得 fetch 傳回的資料,此時(shí) $meta 的元素名稱就是資料庫(kù)的欄位名稱,而內(nèi)容當(dāng)然就是值本身這個(gè)跟你利用 mysql_fetch_row() 時(shí)不一樣,因?yàn)槌藱谖幻Q,mysql_fetch_row() 還會(huì)依照順利將元素名稱除了欄位外在多給予一個(gè)以序號(hào)的方式為基礎(chǔ)的元素,那難道 PDO 沒(méi)有嗎?
當(dāng)然有,只要將 PDO::FETCH_ASSOC 改為 PDO::FETCH_BOTH,那用法就跟 mysql_fetch_row() 沒(méi)什么兩樣了.
如何除錯(cuò)
除錯(cuò)是所有程式設(shè)計(jì)師中心中永遠(yuǎn)的痛,我們使用 PDO 要如何除錯(cuò)呢?
其實(shí) PDO 已經(jīng)提供了二個(gè)非常方便的函式 errorInfo() 及 errorCode()
用法也是世界簡(jiǎn)單,每當(dāng)我們利用 execute() 執(zhí)行后,如果有錯(cuò)誤,那 errorInfo() 及 errorCode() 中就會(huì)有內(nèi)容,我們就可以這樣子做,代碼如下:
$sth->bindParam(':SN',$value[SN]);
$sth->execute();
if ($sth->errorCode())
{
echo "有錯(cuò)誤!有錯(cuò)誤!";
print_r($sth->errorInfo());
}
而 $sth->errorInfo() 會(huì)是一個(gè)陣列,這個(gè)陣列有三個(gè)值:
0 為SQLSTATE error code
1 為你所使用的 Driver 所傳回的錯(cuò)誤碼
2 為你所使用的 Driver 所傳回的錯(cuò)誤訊息
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
- php中數(shù)據(jù)庫(kù)連接方式pdo和mysqli對(duì)比分析
- php使用mysqli和pdo擴(kuò)展,測(cè)試對(duì)比mysql數(shù)據(jù)庫(kù)的執(zhí)行效率完整示例
- php使用mysqli和pdo擴(kuò)展,測(cè)試對(duì)比連接mysql數(shù)據(jù)庫(kù)的效率完整示例
- PHP5中使用PDO連接數(shù)據(jù)庫(kù)的方法
- PHP PDO函數(shù)庫(kù)詳解
- php中mysql連接方式PDO使用詳解
- PHP PDO fetch 模式各種參數(shù)的輸出結(jié)果一覽
- PHP中PDO的錯(cuò)誤處理
- php中關(guān)于mysqli和mysql區(qū)別的一些知識(shí)點(diǎn)分析
- php開(kāi)啟mysqli擴(kuò)展之后如何連接數(shù)據(jù)庫(kù)
- php操作mysqli(示例代碼)
- PHP使用PDO、mysqli擴(kuò)展實(shí)現(xiàn)與數(shù)據(jù)庫(kù)交互操作詳解
相關(guān)文章
PHP中遇到BOM、<feff>編碼導(dǎo)致json_decode函數(shù)無(wú)法解析問(wèn)題
這篇文章主要介紹了PHP中遇到BOM、<feff>編碼導(dǎo)致json_decode函數(shù)無(wú)法解析問(wèn)題,json無(wú)法正常解析的同學(xué)可以看一下,是不是看不見(jiàn)的BOM編碼導(dǎo)致的問(wèn)題,需要的朋友可以參考下2014-07-07c#中的實(shí)現(xiàn)php中的preg_replace
最近在按照一個(gè)php項(xiàng)目用c#重寫(xiě),一邊學(xué)習(xí)同時(shí)發(fā)現(xiàn)了他們的神似神不似的很多地方2009-12-12深入解析fsockopen與pfsockopen的區(qū)別
本篇文章是對(duì)fsockopen與pfsockopen的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07PHP實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容html標(biāo)簽補(bǔ)全和過(guò)濾的方法小結(jié)【2種方法】
這篇文章主要介紹了PHP實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容html標(biāo)簽補(bǔ)全和過(guò)濾的方法,結(jié)合實(shí)例形式分析了php常見(jiàn)的標(biāo)簽檢查、補(bǔ)全、閉合、過(guò)濾等相關(guān)操作技巧,需要的朋友可以參考下2017-04-04php實(shí)現(xiàn)的簡(jiǎn)單日志寫(xiě)入函數(shù)
這篇文章主要介紹了php實(shí)現(xiàn)的簡(jiǎn)單日志寫(xiě)入函數(shù),涉及針對(duì)文件的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03php實(shí)現(xiàn)xml轉(zhuǎn)換數(shù)組的方法示例
這篇文章主要介紹了php實(shí)現(xiàn)xml轉(zhuǎn)換數(shù)組的方法,結(jié)合具體實(shí)例形式分析了php操作xml格式文件實(shí)現(xiàn)轉(zhuǎn)換數(shù)組的相關(guān)操作技巧,涉及xml格式數(shù)據(jù)的載入、遍歷、轉(zhuǎn)換等方法,需要的朋友可以參考下2017-02-02