在我的PHP開發過程中,資料庫的採用都是使用mysql資料庫,與資料庫有關的操作基本上都是使用php中的mysql擴充函數,例如mysql_query,mysql_connect等函數,使用這些傳統的方法來串連查詢資料庫時,個人覺得有兩個弊端,一是沒有擴充性,就是只能用在mysql資料庫中,如果要更換資料庫的之後,使用的PHP擴充函數不同,如果在開發過程中要更換資料庫,那麼所有與資料庫有關的操作都要重來了;第二個是如果過濾語句不嚴密,就會有SQL注入的風險,導致網站被惡意攻擊,失去控制。雖然用mysql_real_escape_string()函數過濾使用者提交的值,但是也有缺陷。而使用PHP的PDO擴充的 prepare 方法,就可以有效地避免sql injection 風險。
1、PDO介紹
PDO擴充為PHP訪問資料庫定義了一個輕量級的、一致性的介面,它提供了一個資料訪問抽象層,這樣,無論使用什麼資料庫,都可以通過一致的函數執行查詢和擷取資料。PDO隨PHP5.1發行,在PHP5.0的PECL擴充中也可以使用,無法運行於之前的PHP版本。與mysql和mysqli相比起來,PDO讓跨資料庫的使用更具有親和力。
2、PDO的安裝與配置
在php5.2.10中,php預設已經安裝了pdo。
開啟php.ini檔案,找到extension=php_pdo.dll這一句,去掉前面的注釋符號,然後重啟apache即可。如果沒有找到這句,可以自己添加一句或者查看系統在安裝的時候是否採用了動態連結程式庫檔案.so,如果是的話,可以在php目錄下找到一個conf.d的檔案夾,下面有一個pdo.ini的連結檔案,如果裡面有一句extension=pdo.so說明已經開啟了PDO。
驗證一下PHP是否已經開啟了PDO,首先寫一個指令碼,內容是
如果顯示的結果中有如下內容,說明已經開啟了PDO擴充。
3、建立一個PDO對象
__construct(string dsn[,string username [,string password [, array driver_options]]]);//pdo的構造方法
參數解析:第一個必選參數是資料來源名DSN,用來定義一個確定的資料庫和必須用到的驅動程式。
如,串連oracle伺服器和mysql伺服器的DSN格式分別如下所示:
ocl:dbname=//127.0.0.1:1521/mydb //串連oracle伺服器的dsn,oci:作為驅動首碼,主機127.0.0.1,連接埠1521,資料庫mydb
mysql:host=127.0.0.1;dbname=testdb //串連Mysql伺服器的dsn,mysql:作為驅動首碼,主機127.0.0.1,資料庫testdb
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';$user = 'root';$password = 'root';try {$dbh = new PDO($dsn, $user, $password);}catch(PDOException $e) {echo "connect failed: ".$e->getMessage();}
4、PDO設定屬性
1) PDO有三種錯誤處理方式:
? PDO::ERrmODE_SILENT不顯示錯誤資訊,只設定錯誤碼
? PDO::ERrmODE_WARNING顯示警告錯
? PDO::ERrmODE_EXCEPTION拋出異常
可通過以下語句來設定錯誤處理方式為拋出異常
$dbh->setAttribute(PDO::ATTR_ERrmODE, PDO::ERrmODE_EXCEPTION);
當設定為PDO::ERrmODE_SILENT時可以通過調用errorCode() 或errorInfo()來獲得錯誤資訊,當然其他情況下也可以。
2) 因為不同資料庫對返回的欄位名稱大小寫處理不同,所以PDO提供了PDO::ATTR_CASE設定項(包括PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER),來確定返回的欄位名稱的大小寫。
3) 通過設定PDO::ATTR_ORACLE_NULLS類型(包括PDO::NULL_NATURAL,PDO::NULL_EmpTY_STRING,PDO::NULL_TO_STRING)來指定資料庫返回的NULL值在php中對應的數值。
5、PDO常用方法及其應用
PDO::query() 主要是用於有記錄結果返回的操作,特別是SELECT操作
PDO::exec() 主要是針對沒有結果集合返回的操作,如INSERT、UPDATE等操作
PDO::prepare() 主要是預先處理操作,需要通過$rs->execute()來執行預先處理裡面的SQL語句,這個方法可以綁定參數,功能比較強大(防止sql注入就靠這個)
PDO::lastInsertId() 返回上次插入操作,主鍵列類型是自增的最後的自增ID
PDOStatement::fetch() 是用來擷取一條記錄
PDOStatement::fetchAll() 是擷取所有記錄集到一個集合
PDOStatement::fetchColumn() 是擷取結果指定第一條記錄的某個欄位,預設是第一個欄位
PDOStatement::rowCount() :主要是用於PDO::query()和PDO::prepare()進行DELETE、INSERT、UPDATE操作影響的結果集,對PDO::exec()方法和SELECT操作無效。
6、PDO操作MYSQL資料庫執行個體
$sql = "UPDATE article SET title="haha" WHERE id=1";$affected = $dbh->exec($query);if($affected) {echo "successed";}else {print_r($dbh->errorINdo());}
預先處理方式:
$SQLStatament = "INSERT INTO article VALUES(":title, :content")";$param = array(":title" => "something",":content" => "aaaa");//準備的參數,對應資料庫的欄位$stmt = $dbh->prepare($SQLStatement);$stmt->execute($param);
http://www.bkjia.com/PHPjc/621626.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/621626.htmlTechArticle在我的PHP開發過程中,資料庫的採用都是使用mysql資料庫,與資料庫有關的操作基本上都是使用php中的mysql擴充函數,例如mysql_query,mysql_co...