PHP鏈接Mysql經常使用API(mysql,mysqli,pdo)的區別

什麼是API?
一 個應用程序接口(Application Programming Interface的縮寫),定義了類,方法,函數,變量等等一切 你的應用程序中爲了完成特定任務而須要調用的內容。在PHP應用程序須要和數據庫進行交互的時候所須要的API 一般是經過PHP擴展暴露出來(給終端PHP程序員調用)。
API能夠是面向 過程的,也能夠是面向對象的。對於面向過程的API,咱們經過調用函數來完成任務,而對於面向對象的API, 咱們實例化類,並在實例化後獲得的對象上調用方法。對於這兩種接口而言,後者一般是首選的,由於它更加現代化,而且 給咱們帶來了良好的代碼結構。
當構建一個須要鏈接到MySQL服務端的PHP應用的時候,有好幾種API可供選擇。此文檔就是討論這些可用的API並討論如何爲 你的應用選擇一個最佳的解決方案。

什麼是鏈接器?
在MySQL文檔中,術語connector解釋爲「一段容許你的應用鏈接到MySQL數據庫服務器的軟件代碼」。 MySQL提供了不少語言的鏈接器,其中包括PHP的。
在 你的PHP應用須要和一個數據庫服務器交互的時候,你須要書寫PHP代碼去完成「鏈接數據庫服務器」,「查詢數據庫「以及其餘數據庫相關功能 等一系列活動。你的PHP應用將會使用提供這些API的軟件,或者在須要的時候使用一些中間庫,來處理你的應用和數據庫服務器之間的交互。 這種軟件一般被認爲是鏈接器,它容許你的引用鏈接到數據庫服務器。

什麼是驅動?
驅動是一段設計用來於一種特定類型的數據庫服務器進行交互的軟件代碼。驅動可能會調用一些庫,好比MySQL客戶端庫或者MySQL Native驅動庫。 這些庫實現了用於和MySQL數據庫服務器進行交互的底層協議。
通 過一個例子php.net/manual/zh/mysqli.overview.php#mysqli.overview.pdo」 style=」COLOR: rgb(0,0,153); BACKGROUND-COLOR: transparent」>PDO(PHP Database Object的縮寫)數據庫抽象層能夠 使用多種特定數據庫的驅動。其中一種驅動就是PDO MYSQL驅動,它就是與MySQL服務器之間的接口。
有時你們會不加區分的使用鏈接器和驅動這兩個術語。在MySQL相關文檔中」driver」術語被做爲一個鏈接器包 中提供特定數據庫部分的軟件代碼。

什麼是擴展?
在PHP文檔中你還會發現不少其餘的擴展。PHP代碼是由一個核心,一些可選擴展組成了核心功能。PHP 的MySQL相關擴展,好比mysqli,mysql都是基於PHP擴展框架實現的。
擴展一個典型的做用就是暴露一個API給PHP程序員,容許擴展本身的功能能夠被程序員使用。固然,也有一部分基於PHP擴展框架 開發的擴展不會給PHP程序員暴露API接口。
好比說PDO MySQL驅動擴展,就沒有向PHP程序員暴露API接口,可是向它上層的PDO層提供了一個接口。
術語API和擴展描述的不是同一類事物,由於擴展可能並不須要暴露一個API接口給程序員。

PHP中提供的用於MySQL的主要API是什麼?
當考慮鏈接到MySQL數據庫服務器的時候,有三種主要的API可供選擇:
PHP的MySQL擴展
PHP的mysqli擴展
PHP數據對象(PDO)
三者都有各自的優缺點。下面的討論就是爲了對每種API的關鍵方面給出一個簡短的介紹。

什麼是PHP的MySQL擴展?
這 是設計開發容許PHP應用與MySQL數據庫交互的早期擴展。mysql擴展提供了一個面向過程 的接口,而且是針對MySQL4.1.3或更早版本設計的。所以,這個擴展雖然能夠與MySQL4.1.3或更新的數據庫服務端 進行交互,但並不支持後期MySQL服務端提供的一些特性。
Note:若是你是使用MySQL4.1.3或更新的服務端版本,強烈建議你使用mysqli 擴展替代它。
mysql擴展的源代碼在PHP擴展目錄ext/mysql下。
對於mysql擴展的更多信息,請參閱MySQL。

什麼是PHP的mysqli擴展?
mysqli擴展,咱們有時稱之爲MySQL加強擴展,能夠用於使用 MySQL4.1.3或更新版本中新的高級特性。mysqli擴展在PHP 5及之後版本中包含。
mysqli擴展有一系列的優點,相對於mysql擴展的提高主要有:
面向對象接口
prepared語句支持(譯註:關於prepare請參閱mysql相關文檔)
多語句執行支持
事務支持
加強的調試能力
嵌入式服務支持
Note:若是你使用MySQL4.1.3或更新版本,強烈建議你使用這個擴展。
在提供了面向對象接口的同時也提供了一個面向過程的接口。
mysqli擴展是使用PHP擴展框架構建的,它的源代碼在PHP源碼目錄下的ext/mysqli中。
對於mysqli擴展的更多信息,請參閱Mysqli。

什麼是PDO?
PHP 數據對象,是PHP應用中的一個數據庫抽象層規範。PDO提供了一個統一的API接口可使得你的PHP應用不去關心具體要 鏈接的數據庫服務器系統類型。也就是說,若是你使用PDO的API,能夠在任何須要的時候無縫切換數據庫服務器,好比從Firebird 到MySQL,僅僅須要修改不多的PHP代碼。
其餘數據庫抽象層的例子包括Java應用中的JDBC以及Perl中的DBI。
固然,PDO也有它本身的先進性,好比一個乾淨的,簡單的,可移植的API,它最主要的缺點是會限制讓你不能使用 後期MySQL服務端提供全部的數據庫高級特性。好比,PDO不容許使用MySQL支持的多語句執行。
PDO是基於PHP擴展框架實現的,它的源碼在PHP源碼目錄的ext/pdo下。
PDO的更多信息,請參閱PDO。

什麼是PDO的MySQL驅動器?
PDO 的MySQL驅動並非一套API,至少從PHP程序員的角度來看是這樣的。實際上,PDO的MySQL驅動處於PDO本身的下層, 提供了特定的Mysql功能。程序員直接調用PDO的API,而PDO使用了PDO的MySQL驅動完成與MySQL服務器端的交互。
PDO的MySQL驅動是衆多PDO驅動中的一個。其餘可用的PDO驅動包括Firebird,PostgreSQL等等。
PDO的MySQL驅動是基於PHP擴展框架實現的。它的源碼在PHP源碼目錄下的ext/pdo_mysql。 它沒有向PHP程序員暴露API。
PDO的MySQL擴展的更多信息請參閱MySQL (PDO)。

什麼是PHP的MySQL Native 驅動?
爲了與MySQL數據庫服務端進行交互,mysql擴展,mysqli擴展, PDO MySQL驅動都使用了實現了必要的協議的底層庫。之前,可用的庫只有MySQL客戶端庫和libmysql。
然而,libmysql包含的接口沒有針對與PHP的應用交互進行優化,libmysql 是早期爲C應用程序設計的。基於這個緣由,MySQL Native驅動mysqlnd,做爲libmysql的一個 針對PHP應用的修改版本被開發。
mysql,mysqli以及PDO Mysql驅動均可以各自配置使用 libmysql或者mysqlnd。mysqlnd做爲一個專門設計 用於PHP系統的庫,它在內存和速度上都比libmysql有很大提高。很是但願你去嘗試這些提高。
Note:MySQL Native驅動僅僅能夠在MySQL服務端版本爲4.1.3及之後版本纔可使用。

MySQL Native驅動是基於PHP擴展框架實現的。源代碼位於PHP源碼目錄的ext/mysqlnd下。 它沒有向PHP程序員暴露接口。

php

轉載來自:http://holyrain1314.blog.163.com/blog/static/10011413520122414811921/


mysql

<?php
/**
看了不少相關數據庫鏈接和操做後對
php中數據庫鏈接的一個自我小結吧
------------但願有所益處

*/

//1 鏈接類型
/**

php中link -MySQL數據庫服務器時經常使用的三種主要的API:mysql,mysqli,pdo區別及聯繫

/********基本相關信息*********/
  a.API----------------Application Programming Interface
應用程序接口(Application Programming Interface的縮寫),定義了類,方法,函數,
變量等等一切 你的應用程序中爲了完成特定任務而須要調用的內容。在PHP應用程序須要
和數據庫進行交互的時候所須要的API 一般是經過PHP擴展暴露出來(給終端PHP程序員調用)。

API能夠是面向過程的,也能夠是面向對象的。對於面向過程的API,咱們經過調用函數來完
成任務,而對於面向對象的API, 咱們實例化類,並在實例化後獲得的對象上調用方法。
對於這兩種接口而言,後者一般是首選的,由於它更加現代化,而且 給咱們帶來了良好的
代碼結構。


  b.connector  -----「一段容許你的應用鏈接到MySQL數據庫服務器的軟件代碼」。 
 在你的PHP應用須要和一個數據庫服務器交互的時候,你須要書寫PHP代碼去完成「鏈接數據
 庫服務器」,「查詢數據庫「以及其餘數據庫相關功能 等一系列活動。你的PHP應用將會使用提
 供這些API的軟件,或者在須要的時候使用一些中間庫,來處理你的應用和數據庫服務器之間
 的交互。

  c.驅動
  用來於一種特定類型的數據庫服務器進行交互的軟件代碼。驅動可能會調用一些庫,
  好比MySQL客戶端庫或者MySQL Native驅動庫。 這些庫實現了用於和MySQL數據庫服務
  器進行交互的底層協議。
  
  可能你們會不加區分的使用鏈接器和驅動這兩個術語。
  在MySQL相關文檔中"driver"術語被做爲一個鏈接器包 
  中提供特定數據庫部分的軟件代碼。

  d.什麼是擴展?

  在PHP文檔中你還會發現不少其餘的擴展。PHP代碼是由一個核心,一些可選擴展組成了核心功能。
  PHP 的MySQL相關擴展,好比mysqli,mysql都是基於PHP擴展框架實現的。
  擴展一個典型的做用就是暴露一個API給PHP程序員,容許擴展本身的功能能夠被程序員使用。
  固然,也有一部分基於PHP擴展框架 開發的擴展不會給PHP程序員暴露API接口。

好比說PDO MySQL驅動擴展,就沒有向PHP程序員暴露API接口,可是向它上層的PDO層提供了一個接口。

術語API和擴展描述的不是同一類事物,由於擴展可能並不須要暴露一個API接口給程序員。


/*********重點*******/
PHP中提供的用於MySQL的主要API:

■PHP的MySQL擴展
	(優缺點)

	【

	設計開發容許PHP應用與MySQL數據庫交互的早期擴展。mysql擴展提供了一個面向過程 的接口,
	而且是針對MySQL4.1.3或更早版本設計的。所以,這個擴展雖然能夠與MySQL4.1.3或更新的數
	據庫服務端 進行交互,但並不支持後期MySQL服務端提供的一些特性。

	】


■PHP的mysqli擴展
	mysqli擴展,咱們有時稱之爲MySQL加強擴展,能夠用於使用 MySQL4.1.3或更新版本中新的高級特性。
	mysqli擴展在PHP 5及之後版本中包含。

	mysqli擴展有一系列的優點,相對於mysql擴展的提高主要有:

	■面向對象接口

	■prepared語句支持(譯註:關於prepare請參閱mysql相關文檔)

	■多語句執行支持

	■事務支持

	■加強的調試能力

	■嵌入式服務支持

■PHP數據對象(PDO)

PHP數據對象,是PHP應用中的一個數據庫抽象層規範。PDO提供了一個統一的API接口能夠
使得你的PHP應用不去關心具體要 鏈接的數據庫服務器系統類型。也就是說,
若是你使用PDO的API,能夠在任何須要的時候無縫切換數據庫服務器


/*******對比***********/

PHP-MySQL 是 PHP 操做 MySQL 資料庫最原始的 Extension ,PHP-MySQLi 的 i 表明 Improvement ,
提更了相對進階的功能,就 Extension 而言,自己也增長了安全性。
而 PDO (PHP Data Object) 則是提供了一個 Abstraction Layer 來操做資料庫


詳細出處參考:http://www.jb51.net/article/28103.htm

1.mysql與mysqli
mysqli是php5提供的新函數庫,(i)表示改進,其執行速度更快.固然也更安全 
詳細出處參考:http://www.jb51.net/article/28103.htm

mysql是非持繼鏈接函數而mysqli是永遠鏈接函數。也就是說 
mysql每次連接都會打開一個鏈接的進程而mysqli屢次運行mysqli將使用同一鏈接進程,
從而減小了服務器的開銷 
有些朋友在編程的時候,使用new mysqli('localhost', usenamer', 'password', 'databasename');老是報 
錯,Fatal error: Class 'mysqli' not found in d:\... 
mysqli類不是php自帶的嗎? 
不是默認開啓的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli編譯進去。 
一:Mysqli.dll是一個容許以對象的方式或者過程操做數據庫的,它的使用方式也很容易。這裏就幾個常
詳細出處參考:http://www.jb51.net/article/28103.htm

多作事少說話:

*/
<?php 
mysql_connect($db_host, $db_user, $db_password); 
mysql_select_db($dn_name); 
$result = mysql_query("SELECT `name` FROM `users` WHERE `location` = '$location'"); 
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
{ 
echo $row['name']; 
} 
mysql_free_result($result); 
 

/**
其實背後有些學問… 
這種方式不能 Bind Column ,之前例的 SQL 敘述來講,$location 的地方容易被 SQL Injection。
後來因而發展出了 mysql_escape_string() (備註:5.3.0以後棄用) 以及 mysql_real_escape_string()
來解決這個問題,不過這麼一搞,整個敘述會變得複雜且醜陋,並且若是欄位多了,能夠想見會是怎樣的情形… 

詳細出處參考:http://www.jb51.net/article/28103.htm

*/




$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", 
mysql_real_escape_string($user), 
mysql_real_escape_string($password)); 
mysql_query($query); 


/**
在 PHP-MySQLi 中有了很多進步,除了透過 Bind Column 來解決上述問題,並且也多援 Transaction, Multi Query ,
而且同時提供了 Object oriented style (下面這段 PHP-MySQLi 範例的寫法) 和 Procedural style 
(上面 PHP-MySQL 範例的寫法)兩種寫法…等等。 

詳細出處參考:http://www.jb51.net/article/28103.htm
*/



$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name); 
$sql = "INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?)"; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location); 
$stmt->execute(); 
$stmt->bind_result($id, $name, $gender, $location); 
while ($stmt->fetch()) 
{ 
echo $id . $name . $gender . $location; 
} 
$stmt->close(); 
$mysqli->close(); 

/**
但看到這邊又發現了一些缺點,例如得 Bind Result,這個就有點多餘,不過這其實可有可無,
由於最大的問題仍是在於這不是一個抽象(Abstraction)的方法,因此當後端更換資料庫的時候,就是痛苦的開始… 
因而 PDO 就出現了
詳細出處參考:http://www.jb51.net/article/28103.htm

*/


// 2.PDO與mysql
/*
PDO是PHP5.1以後才支持的,他爲訪問數據庫採用了一致性的接口。可是國內衆多的開源程序都是
使用MySQL的extension所提供的function鏈接數據庫,進行查詢。PDO功能強大爲什麼國內成熟的PHP系統都不使用呢?
問過幾個朋友爲啥用PDO,答案是「快」,PDO鏈接數據庫會快麼?爲何使用PDO?

他們兩種方式有什麼區別?首先仍是比較關心的性能問題.寫了1個腳本測試向MySQL插入100萬條數據。
*/

$link = mysql_connect("localhost", "root", "root") or die('mysql connect error');
$num = 100000;
$dsn = "mysql:host=127.0.0.1;dbname=performace_test";
$db = new PDO($dsn, 'root', 'root', array(PDO::ATTR_PERSISTENT => true));
mysql_query('TRUNCATE TABLE `performace_test`.`myquery`',$link);  //Truncate Table
$query = "INSERT INTO `performace_test`.`myquery`(`goods_id`,`cat_id`,`click_count`,`goods_number`,`goods_weight`,`goods_sn`,`goods_name`,`goods_reason`,`brand_name`,`goods_thumb`,`brand_id`,`is_on_sale`,`wap_cod`,`wap_title`,`wap_detail`,`wap_flag`,`wap_onsale`,`shop_price`,`cost_price`,`channel_rate`,`channel_onsale`,`add_time`,`is_main`,`last_update`,`brand_logo`) VALUES ( ’80′,’298′,’65′,’100′,’0.125′,’SMT000080′,’健康′,」,’健康120’,'images/201004/thumb_img/80_thumb_G_1272071721054.jpg’,’1′,’0′,’0′,NULL,NULL,NULL,’0′,’2980.00′,’0.00′,’1.250000′,’1′,’1271612064′,’0′,’1297624384′,’1293649512083026412.jpg’)";
$start_time = microtime(true);
for($i=0;$i<$num;$i++)
{
mysql_query($query,$link);
}
echo "USE MySQL extension: ". (microtime(true)-$start_time);
mysql_query(‘TRUNCATE TABLE `performace_test`.`myquery`’,$link);  //Truncate Table
$start_time = microtime(true);
for($i=0;$i<$num;$i++)
{
$db->exec($query);
}
echo "\r\nUSE PDO : ". (microtime(true)-$start_time);

/**
USE MySQL extension: 95.233189106s

USE PDO : 99.1193888187s

在連接MySQL上幾乎沒有區別。PDO的性能損失徹底能夠忽略不計。

可是卻有很是多的操做倒是MySQL擴展庫所不具有的:

1:PDO真正的以底層實現的統一接口數庫操做接口
2:PDO支持更高級的DB特性操做,如:存儲過程的調度等,mysql原生庫是不支持的.
3:PDO是PHP官方的PECL庫,兼容性穩定性必然要高於MySQL Extension,能夠直接使用 pecl upgrade pdo 命令升級

PHP6默認也是使用PDO進行數據庫連接,MySQL Extension會做爲輔助。

因此咱們在平常項目中,若是環境容許,儘量去使用PDO來進行MySQL數據庫操做。


?>

轉載來自:http://www.oschina.net/code/snippet_170919_6661
相關文章
相關標籤/搜索