程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> PDO和MySQLi連接區別

PDO和MySQLi連接區別

編輯:MYSQL入門知識
 

PHP5.5開始,傳統的mysql擴展已經廢棄,只能使用PHP提供的MySQLi擴展或PDO擴展,從mysql傳統接口移植到這兩種接口,改動工作都不小,尤其是使用pdo接口,基本大部分訪問語句都需要重寫,沒辦法誰讓新擴展更安全更高效呢。那麼它們之間的區別有哪些呢?本文匯總此兩種連接的各自特點,主要從數據庫支持、穩定性及性能等方面做個簡單比較,僅供設計參考。

MySQL PDO連接實例

PDO query和execute區別

申明:本文翻譯來源於文本鏈接地址,天緣在該文基礎上稍作補充修整,如有不明之處,請直接訪問文末原文鏈接。

一、PDO和MySQLi區別

下表列出PDO和MySQLi的幾個典型方面區別:

更多方面比較也可參考另一篇文章:

http://www.php.net/manual/zh/mysqlinfo.api.choosing.php

二、連接方式

PDO和mysqli創建連接方式如下:

// PDO
$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password');
 
// mysqli, procedural way
$mysqli = mysqli_connect('localhost','username','password','database');
 
// mysqli, object oriented way
$mysqli = new mysqli('localhost','username','password','database');

三、API和數據庫

PDO和MySQLi都提供面向對象API,MySQLi同時還提供面向過程API,從傳統的MySQL擴展接口移植到MySQLi接口非常簡單,但PDO則可提供對多種數據庫訪問支持,所以,從業務種類角度來講,PDO似乎應用更“廣泛”一些,但MySQLi則更“專用”。

PDO支持十幾種常見數據庫,常見的MySQL、PostgreSQL、MS SQL Server、SQLite等等全部可使用PDO對應擴展支持,而接口部分及查詢語句僅需要很少的改動,而PHP MySQLi擴展則只支持MySQL,要想支持別的數據改動會非常大。

當然,關於多數據庫支持問題,其實似乎用處不大,“多數據庫支持”就跟我們常說的“跨平台”一樣,很多時候只是個概念炒作,僅僅為了少部分用戶群體的需求就把架構做的冗大實質不值,任何程序皆為人設計,為人所用,最終目標都應該以易用、速度、效率和功耗作為追求目標。

四、命名參數

PDO綁定命名參數示例如下:

$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);
    
$pdo->prepare('
   SELECT * FROM users
   WHERE username = :username
   AND email = :email
   AND last_login > :last_login');
    
$pdo->execute($params);

MySQLi不支持命名參數,綁定變量方法如下:

$query = $mysqli->prepare('
   SELECT * FROM users
   WHERE username = ?
   AND email = ?
   AND last_login > ?');
    
$query->bind_param('sss', 'test', $mail, time() - 3600);
$query->execute();

六、對象映射(Object mapping)

PDO和MySQLi均支持對象映射,對象映射提供對數據庫記錄集的方法封裝(天緣自己賦的名稱,對象映射的執行效果看起來有點類似eval的感覺),參考示例如下:

對象類定義:

class User {
   public $id;
   public $first_name;
   public $last_name;
    
   public function info()
   {
      return '#'.$this->id.': '.$this->first_name.' '.$this->last_name;
   }
}

調用類方法:

$query = "SELECT id, first_name, last_name FROM users";
    
// PDO
$result = $pdo->query($query);
$result->setFetchMode(PDO::FETCH_CLASS, 'User');
 
while ($user = $result->fetch()) {
   echo $user->info()."\n";
}
// MySQLI, procedural way
if ($result = mysqli_query($mysqli, $query)) {
   while ($user = mysqli_fetch_object($result, 'User')) {
      echo $user->info()."\n";
   }
}
// MySQLi, object oriented way
if ($result = $mysqli->query($query)) {
   while ($user = $result->fetch_object('User')) {
      echo $user->info()."\n";
   }
}

七、安全性

PDO和MySQLi均提供SQL防注入安全(jnjection security)方法,比如quote、escape等等,

// PDO, "manual" escaping
$username = PDO::quote($_GET['username']);

$pdo->query("SELECT * FROM users WHERE username = $username");

// mysqli, "manual" escaping
$username = mysqli_real_escape_string($_GET['username']);

$mysqli->query("SELECT * FROM users WHERE username = '$username'");

PDO::quote()不但轉義字符串,還會引用它,而mysqli_real_escape_string()則只會轉義字符串,所以,原作者推薦大家使用下面方法,而盡量減少使用而盡量不要使用PDO::quote()和mysqli_real_escape_string()。

// PDO, prepared statement
$pdo->prepare('SELECT * FROM users WHERE username = :username');
$pdo->execute(array(':username' => $_GET['username']));

// mysqli, prepared statements
$query = $mysqli->prepare('SELECT * FROM users WHERE username = ?');
$query->bind_param('s', $_GET['username']);
$query->execute();

關於PDO::quote()可參考:http://php.net/manual/zh/pdo.quote.php

八、總結

另外,作者還從性能等方面做了描述,不過天緣認為性能指標只是相對的,任何的數據庫系統都應該從系統角度去衡量,都是整體權衡可用、效率、速度、擴展等方面需求下的結果。單從數據庫引擎角度,PDO似乎略有小勝,支持多種類型數據庫、名空間,PDO的運行效能則略低於MySQLi,這也很正常,MySQLi是定制的當然效率更高一些。 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved