在php使用PDO類查詢Mysql

在我的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);

You May Also Like