php中使用mysql、mysqli、pdo的比較

        普通的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();
    }    

?>
相關文章
相關標籤/搜索