普通的mysql方法在安全性方面應該不是很好,每次須要考慮sql注入的問題,並且速度不是很贊。而mysqli是在mysql基礎上進行改進的一次,較好的解決了sql注入問題。
php
pdo則是最新的數據庫抽象方法,pdo高度抽象了數據庫操做,項目使用pdo方法能夠方便的進行遷移,在不一樣的數據庫之間進行遷移。mysql
在高負載的狀況下.PDO開啓長鏈接可以獲得一個相對穩定的負載「值」。可是效率卻不是最高的。
mysql最快。mysqli其次。只是mysql和mysqli在高併發、系統高負載的時候。其所承擔的負載也是很可觀的。PDO則不會。sql
書寫風格 | 面向對象 | 拋異常 | |
php_mysqli | 函數名用下劃線,好比fetch_all | 能夠oop,也能夠opp | 否,只能false |
pdo | 函數名用駝峯,好比fetchAll | oop | 能夠throw,也可false或false加warnnig |
php_pgsql | 函數名用下劃線,好比pg_fetch_all | opp | 否,只能false |
其次pdo是面向對象的,當有錯誤的時候能夠拋出異常,並且能夠自定義異常拋出。數據庫
php_mysqli 與 pdo 性能對比:(查找自互聯網)安全
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以上功能 | 是 | 大多數 | 否 |
PDO使用說明:併發
PDO::prepare()函數
官方文檔:http://www.php.net/manual/zh/pdo.prepare.php高併發
適用:屢次查詢使用相同的條件字段和結果字段。這時候比PDO::query()性能高。oop
轉義:value無需手動轉義,PDO會自動進行轉義,不用擔憂SQL注入。(開啓query log能夠看到語句的確已轉義)性能
缺點:因爲標識符(列名錶名)是手寫的SQL,要本身加引用符反勾號`。
PDO::prepare()模擬處理的時候不會經過數據庫,因此不知道語法錯誤,不會返回錯誤或拋異常。何時是真處理,何時是模擬處理, 官方手冊中未找到說明。輸入任意的SQL都不出錯……因此目前不要期望prepare返回錯誤,PDOStatement::execute()時纔會返 回錯誤。http://www.php.net/manual/zh/pdo.prepare.php
補充:這裏給出mysql、mysqli、pdo的基本用法
<?php //mysql方法 $dbname='db_pet'; $username='root'; $password='playboy'; mysql_connect('localhost',$username,$password); mysql_select_db($dbname); $res=mysql_query('select password from user where username="home"'); $row=mysql_fetch_row($res); echo $row[0] ; echo '<hr/>'; //mysqli方法 $con=new MySQLi('localhost',$username,$password,$dbname); $res2=$con->query('select email from user where username ="home"'); $row2=$res2->fetch_array(); echo $row2[0]; echo '<hr/>'; //pdo方法 try{ $pdo=new PDO('mysql:host=localhost;dbname=db_pet','root','playboy'); $sql='select email from user where username=?'; $stmt=$pdo->prepare($sql); $stmt->execute(array('home')); echo $stmt->rowCount(); }catch(PDOException $e){ echo $e->getMessage(); } ?>