-
php連接到mysql資料庫伺服器時三種主要的API:mysql,mysqli,pdo區別及聯繫
也是常用的擴充 ,哪麼他們的效能孰優呢?
其實都好,只是相比較而言還有更好(我喜歡pdo)
-
/**
- 看了很多相關資料庫連接和操作後對
- 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
-
- 多做東西少說話:
-
- */
- mysql_connect($db_host, $db_user, $db_password);
- mysql_select_db($dn_name);
- $result = mysql_query("SELECT `name` FROM `users` WHERE `. location'");
- while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
- {
- echo $row['name'];
- }
- my_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_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
- */
-
-
-
- $myi = 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_id`,` click `,`goods_number`,`goods_weight`,`goods_sn`,`goods_name`,`goods_reason`,`brand_name`,`goods_thumb`,`brand_id`,`is_on_sale`,`wap_cod`,`wap_ti`wa,`wap_ti`wa,`wap_ti`wah,`wap_ti`wa,`wap_ti`wa,`wap_title,`wa `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′,'07,'′′,'70,'100. ,NULL,NULL,NULL,'0′,'2980.00′,'0.00′,'1.250000′,'1′,'1271612064′,'0′,'1297624384′,'12936495120830g; $start_time = microtime(true);
- for($i=0;$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{
- $db->exec($query);
- }
- echo "rnUSE PDO : ". (microtime(true)-$start_time);
-
- /**
- USE MySQL extension: 95.233189106s
-
- USE PDO : 99.1193888188連結MySQL上幾乎沒有差別。 PDO的效能損失完全可以忽略不計。
-
- 但是卻有非常多的操作卻是MySQL擴充函式庫所不具備的:
-
- 1:PDO真正的以底層實作的統一介面數庫操作介面
- 2:PDO支援更高階的DB特性操作,如:預存程序的調度等,mysql原生函式庫是不支援的.
- 3:PDO是PHP官方的PECL函式庫,相容性穩定性必然要高於MySQL Extension,可以直接使用pecl upgrade pdo 指令升級
-
- PHP6預設也是使用PDO進行資料庫鏈接,MySQL Extension會作為輔助。
-
- 所以我們在日常專案中,如果環境允許,盡可能去使用PDO來進行MySQL資料庫操作。
-
-
-
-
-
- ?>
-
-
- 複製程式碼
|