一、特性及對比
PHP的MySQL擴充是設計開發允許PHP應用與MySQL資料庫互動的早期擴充。mysql擴充提供了一個面向過程 的介面,並且是針對MySQL4.1.3或更早版本設計的。因此,這個擴充雖然可以與MySQL4.1.3或更新的資料庫服務端 進行互動,但並不支援後期MySQL服務端提供的一些特性。由於太過古老,又不安全,所以已被後來的mysqli完全取代。
PHP的mysqli擴充,我們有時稱之為MySQL增強擴充,可以用於使用 MySQL4.1.3或更新版本中新的進階特性。其特點為:物件導向介面 、prepared語句支援、多語句執行支援、事務支援 、增強調試能力、嵌入式服務支援 、預先處理方式完全解決了sql注入的問題。不過其也有缺點, 就是只支援mysql資料庫。如果你要是不操作其他的資料庫,這無疑是最好的選擇。
PDO是PHP Data Objects的縮寫,其是PHP應用中的一個資料庫抽象層規範。PDO提供了一個統一的API介面可以使得你的PHP應用不去關心具體要 串連的資料庫伺服器系統類別型。也就是說,如果你使用PDO的API,可以在任何需要的時候無縫切換資料庫伺服器,比如從oracle 到MySQL,僅僅需要修改很少的PHP代碼。其功能類似於JDBC、ODBC、DBI之類介面。同樣,其也解決了sql注入問題,有很好的安全性。不過他也有缺點,某些多語句執行查詢不支援(不過該情況很少)。
官文對於三者之間也做了列表性的比較:
PHP的mysqli擴充 |
PDO (使用PDO MySQL驅動和MySQL Native驅動) |
PHP的mysql擴充 |
|
| 引入的PHP版本 |
5.0 |
5.0 |
3.0之前 |
| PHP5.x是否包含 |
是 |
是 |
是 |
| MySQL開發狀態 |
活躍 |
在PHP5.3中活躍 |
僅維護 |
| 在MySQL新項目中的建議使用程度 |
建議 - 首選 |
建議 |
不建議 |
| API的字元集支援 |
是 |
是 |
否 |
| 服務端prepare語句的支援情況 |
是 |
是 |
否 |
| 用戶端prepare語句的支援情況 |
否 |
是 |
否 |
| 預存程序支援情況 |
是 |
是 |
否 |
| 多語句執行支援情況 |
是 |
大多數 |
否 |
| 是否支援所有MySQL4.1以上功能 |
是 |
大多數 |
否 |
從官方給出的這份結果上來看,優先推薦msqli,其次是pdo 。而“民間”給出的結果很多是傾向於使用PDO,因為其不擔有跨庫的優點,更有讀寫速度快的特點。
51cto上的給出了相關的測試結果(有點老,2011年的測試結果)。
二、模組安裝及調用
以ubuntu及其衍生版為例,通過sudo apt-get install mysqlnd 即可增加php對pdo和mysqli的支援(源碼安裝的可以選擇phpize程式進行動態擴充)。具體可以通過phpinfo頁面開啟查看,其中在mysqlnd項下,可以看到如下內容:
API Extensions mysql,mysqli,pdo_mysql
mysqli和PDO串連方法
// PDO
$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password');
// mysqli, 面向過程方式
$mysqli = mysqli_connect('localhost','username','password','database');
// mysqli, 物件導向
$mysqli = new mysqli('localhost','username','password','database');
mysqli通過設定檔進行查詢的樣本:
設定檔
yang@crunchbang:/var/www/t$ cat config.ini.php
查詢代碼
yang@crunchbang:/var/www/t$ cat mysqlquery.php
query("set names $charName");
//3、處理結果
$res= $mysqliObj->query($sql);
//var_dump($res);
//fetch_assoc \fetch_array \fetch_object
while($row=$res->fetch_row()){
// print_r($row);
foreach($row as $val){
echo '--'.$val;
}
echo ' '
}
//4、關閉資源
$res->free();
$mysqliObj->close();
?>
pdo方式進行的查詢
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$r = $dbh->query('SELECT * FROM user');
var_dump($r);
foreach($r as $v) {
var_dump($v);
}
?>
總結:
像discuz、phpcms、akcms等程式一般都會提供兩種串連方式mysqli或pdo-mysql(前提是你的部署環境要支援),具體在使用到類以於以上的php程式時,可以根據自己的情況而定。