在我的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,
首先寫乙個指令碼,內容是
<?php
phpinfo();
?>
如果顯示的結果中有如下內容,說明已經開啟了pdo擴充套件。
3、建立乙個pdo物件
__construct(string dsn[,string username [,string password [, array driver_options]]]);//pdo的構造方法
引數解析:第乙個必選引數是資料來源名dsn,用來定義乙個確定的資料庫和必須用到的驅動程式。
如,連線oracle伺服器和mysql伺服器的dsn格式分別如下所示:
ocl:dbname= //連線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 catch(pdoexception $e)
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) else
預處理方式:
$sqlstatament = "insert into article values(":title, :content")";
$param = array(":title" => "something",
":content" => "aaaa");
//準備的引數,對應資料庫的字段
$stmt = $dbh->prepare($sqlstatement);
$stmt->execute($param);
mysql pdo手冊 使用PDO操作MySQL
pdo擴充套件為php訪問資料庫定義了乙個輕量級的 一致性的介面,它提供了乙個資料訪問抽象層,這樣,無論使用什麼資料庫,都可以通過一致的函式執行查詢和獲取資料。pdo支援的php版本為php5.1以及更高的版本,而且在php5.2下pdo預設為開啟狀態,下面是在php.ini中pdo的配置 exte...
使用PHP的PDO類操作MySQL
mysql new pdo mysql host localhost sort 3306 dbname foo user,psd 值得一提的是,如果連線資料庫失敗,會丟擲乙個pdoexception異常,這樣我們就可以直接用try catch 來處理異常,不僅如此,還可以通過pdo setattri...
php中pdo的使用
執行如下 如果提示引數錯誤,說明pdo已經安裝,如果說明物件不存在,則修改php配置檔案php.ini,取消php pdo yourssqlserverhere.extis前面的注釋。test new pdo given in d wamp64 www test test.php on line 以...