在我的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,首先寫一個腳本,內容是
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(); }
1) PDO有三種錯誤處理方式:
? PDO::ERrmODE_SILENT不顯示錯誤信息,只設置錯誤碼
可通過以下語句來設置錯誤處理方式為拋出異常
$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);