一、特性及對比
- 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,因為其不擔有跨庫的優點,更有讀寫速度快的特點。
二、模組安裝及調用
以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通過設定檔進行查詢的樣本:
設定檔
代碼如下 |
複製代碼 |
/var/www/t$ cat config.ini.php <?php $dbhost ="localhost"; $dbuser = "root"; $dbpwd = "123456"; $dbname = "wish"; $charName = "utf8"; ?> |
查詢代碼
代碼如下 |
複製代碼 |
/var/www/t$ cat mysqlquery.php <?php require_once("config.ini.php"); $mysqliObj = new mysqli($dbhost,$dbuser,$dbpwd,$dbname); if(mysqli_connect_errno()){ echo "串連失敗".mysqli_connect_error(); //printf("Connect failed: %sn", mysqli_connect_error()); exit(); //www.111cn.net } $sql="select * from wp_wish"; $mysqliObj->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 '<br/>'; } //4、關閉資源 $res->free(); $mysqliObj->close(); ?> |
pdo方式進行的查詢
代碼如下 |
複製代碼 |
<?php $dsn = 'mysql:dbname=test;host=127.0.0.1'; $user = 'root'; $password = '1'; $dbh = new PDO($dsn, $user, $password); $dbh->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程式時,可以根據自己的情況而定