php中link -MySQL資料庫伺服器時常用的三種主要的API:mysql,mysqli,pdo區別及聯繫

WBOY
發布: 2016-07-25 09:09:04
原創
1321 人瀏覽過
php連接到mysql資料庫伺服器時三種主要的API:mysql,mysqli,pdo區別及聯繫
也是常用的擴充 ,哪麼他們的效能孰優呢?

其實都好,只是相比較而言還有更好(我喜歡pdo)
  1. /**
  2. 看了很多相關資料庫連接和操作後對
  3. php中資料庫連接的一個自我小結吧
  4. ------------希望有所好處
  5. */
  6. //1 連接類型/
  7. /
  8. /
  9. /
  10. /
  11. /
  12. /
  13. /
  14. /
  15. /
  16. php中link -MySQL資料庫伺服器時常用的三種主要的API:mysql,mysqli,pdo區別及聯繫
  17. /********基本相關資訊** *******/
  18. a.API----------------Application Programming Interface
  19. 應用程式介面(Application Programming Interface的縮寫),定義了類別,方法,函數,
  20. 變數等等一切你的應用程式中為了完成特定任務而需要呼叫的內容。在PHP應用程式需要
  21. 和資料庫互動的時候所需的API 通常是透過PHP擴充功能暴露出來(給終端php程式設計師呼叫)。 API可以是過程導向的,也可以是物件導向的。對於過程導向的API,我們透過呼叫函數來完成任務,而對於物件導向的API, 我們實例化類別,並在實例化後得到的物件上呼叫方法。 對於這兩種介面而言,後者通常是首選的,因為它更加現代化,並且 為我們帶來了良好的程式碼結構。 b.connector -----「一段允許你的應用程式連接到MySQL資料庫伺服器的軟體程式碼」。
  22. 在你的PHP應用程式需要和一個資料庫伺服器互動的時候,你需要書寫php程式碼去完成“連接資料
  23. 函式庫伺服器”,“查詢資料庫“以及其他資料庫相關功能 等一系列活動。你的PHP應用程式將會使用提
  24. 供這些API的軟體,或是在需要的時候使用一些中間函式庫,來處理你的應用程式和資料庫伺服器之間
  25. 的互動。
  26. c.驅動程式
  27. 用來於一種特定類型的資料庫伺服器進行互動的軟體程式碼。驅動程式可能會呼叫一些函式庫,
  28. 例如MySQL客戶端函式庫或MySQL Native驅動程式庫。 這些函式庫實作了用於和MySQL資料庫服務
  29. 器進行互動的底層協定。
  30. 可能大家會不加區分的使用連接器和驅動這兩個術語。
  31. 在MySQL相關文件中"driver"術語被當作一個連接器套件
  32. 中提供特定資料庫部分的軟體程式碼。
  33. d.什麼是擴充?
  34. 在PHP文件中你還會發現很多其他的擴充。 PHP程式碼是由一個核心,一些可選擴充組成了核心功能。
  35. PHP 的MySQL相關擴展,例如mysqli,mysql都是基於PHP擴展框架實現的。
  36. 擴充一個典型的作用就是揭露一個API給PHP程式設計師,允許擴充自己的功能可以被程式設計師使用。
  37. 當然,也有一部分基於PHP擴充框架 開發的擴充功能不會給PHP程式設計師暴露API介面。
  38. 比如說PDO MySQL驅動擴展,就沒有向PHP程式設計師暴露API接口,但是向它上層的PDO層提供了一個介面。
  39. 術語API和擴充描述的不是同一類事物,因為擴充可能不需要暴露一個API介面給程式設計師。
  40. /*********重點*******/
  41. PHP中提供的用於MySQL的主要API:
  42. ■PHP的MySQL擴充
  43. (優缺點)
  44. 設計開發允許PHP應用與MySQL資料庫互動的早期擴充。 mysql擴充提供了一個面向過程 的接口,
  45. 並且是針對MySQL4.1.3或更早版本設計的。因此,這個擴充雖然可以與MySQL4.1.3或更新的數
  46. 據函式庫服務端 進行交互,但並不支援後期MySQL服務端提供的一些特性。
  47. ■PHP的mysqli擴展
  48. mysqli擴展,我們有時稱之為MySQL增強擴展,可以用於使用MySQL4.1.3或更新版本中新的高級特性。
  49. mysqli擴充在PHP 5及以後版本中包含。
  50. mysqli擴充有一系列的優勢,相對於mysql擴充的提升主要有:
  51. ■物件導向介面
  52. ■prepared語句支援(譯註:關於prepare請參閱mysql相關文件)
  53. ■多語句執行支援
  54. ■交易支援
  55. ■增強的調試能力
  56. ■嵌入式服務支援
  57. ■PHP資料對象(PDO)
  58. PHP資料對象,是PHP應用中的一個資料庫抽象層規範。 PDO提供了一個統一的API介面可以
  59. 讓你的PHP應用不關心具體要 連接的資料庫伺服器系統類型。也就是說,
  60. 如果你使用PDO的API,可以在任何需要的時候無縫切換資料庫伺服器
  61. /*******對比***********/
  62. PHP- MySQL 是PHP 操作MySQL 資料庫最原始的Extension ,PHP-MySQLi 的i 代表Improvement ,
  63. 提更了相對進階的功能,就Extension 而言,本身也增加了安全性。
  64. 而PDO (PHP Data Object) 則是提供了一個Abstraction Layer 來操作資料庫
  65. 詳細出處參考:http://www.jb51.net/article/28103.htm
  66. 1.mysql與mysqli
  67. mysqli是php5提供的新函數庫,(i)表示改進,其執行速度更快.當然也更安全
  68. 詳細出處參考:http://www .jb51.net/article/28103.htm
  69. mysql是非持繼連接函數而mysqli是永遠連接函數。也就是說
  70. mysql每次連結都會打開一個連接的進程而mysqli多次運行mysqli將使用同一連接進程,
  71. 從而減少了伺服器的開銷
  72. 有些朋友在編程的時候,使用new mysqli ('localhost', usenamer', 'password', 'databasename');總是報
  73. 錯,Fatal error: Class 'mysqli' not found in d:...
  74. mysqli類不是php自帶的嗎?
  75. 不是預設開啟的,win下要改php.ini,去掉php_mysqli.dll前的;,linux下要把mysqli編譯進去。
  76. 一:Mysqli.dll是一個允許以物件的方式或流程操作資料庫的,它的使用方式也很容易。這裡有幾個常
  77. 詳細出處參考:http://www.jb51.net/article/28103.htm
  78. 多做東西少說話:
  79. */
  80. mysql_connect($db_host, $db_user, $db_password);
  81. mysql_select_db($dn_name);
  82. $result = mysql_query("SELECT `name` FROM `users` WHERE `. location'");
  83. while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
  84. {
  85. echo $row['name'];
  86. }
  87. my_free_result($result);
  88. /**
  89. 其實背後有些學問…
  90. 這種方式不能Bind Column ,以前例的SQL 敘述來說,$location 的地方容易被SQL Injection。
  91. 後來於是發展出了mysql_escape_string() (備註:5.3.0之後棄用) 以及mysql_real_escape_string()
  92. 來解決這個問題,不過這麼一搞,整個敘述會變得複雜且醜陋,而且如果欄位多了,可以想見會是怎樣的情形…
  93. 詳細出處參考:http://www.jb51.net/article/28103.htm
  94. */
  95. $query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
  96. mysql_real_escape_string($user), mysql_query($query);
  97. /**
  98. 在PHP-MySQLi 中有了不少進步,除了透過Bind Column 來解決上述問題,而且也多援Transaction, Multi Query ,
  99. 並且同時提供了Object oriented style (下面這段PHP-MySQLi範例的寫法) 和Procedural style
  100. (上面PHP-MySQL 範例的寫法)兩種寫法…等等。
  101. 詳細出處參考:http://www.jb51.net/article/28103.htm
  102. */
  103. $myi = new mysqli ($ db_host, $db_user, $db_password, $db_name);
  104. $sql = "INSERT INTO `users` (id, name, gender, location) VALUES (?, ?, ?, ?)";
  105. $stmt = $mysqli->prepare($sql);
  106. $stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location);
  107. $stmt->execute ();
  108. $stmt->bind_result($id, $name, $gender, $location);
  109. while ($stmt->fetch())
  110. {
  111. echo $id . $name . $gender . $location;
  112. }
  113. $stmt->close();
  114. $mysqli->close();
  115. /**
  116. 但看到這邊又發現了一些缺點,例如得Bind Result,這個就有點多馀,不過這其實無關緊要,
  117. 因為最大的問題還是在於這不是一個抽象(Abstraction)的方法,所以當後端更換資料庫的時候,就是痛苦的開始…
  118. 於是PDO 就出現了
  119. 詳細出處參考:http://www.jb51.net/article/28103.htm
  120. */
  121. // 2.PDO與mysql
  122. /*
  123. PDO是PHP5.1之後才支援的,他為存取資料庫採用了一致性的介面。但國內眾多的開源程式都是
  124. 使用MySQL的extension所提供的function連接資料庫,進行查詢。 PDO功能強大為何國內成熟的PHP系統都不使用?
  125. 問過幾個朋友為啥用PDO,答案是“快”,PDO連接資料庫會快麼?為什麼要用PDO?
  126. 他們兩種方式有什麼差別?首先還是比較關心的效能問題.寫了1個腳本測試向MySQL插入100萬條資料。
  127. */
  128. $link = mysql_connect("localhost", "root", "root") or die('mysql connect error');
  129. $num = 100000;
  130. $
  131. $ dsn = "mysql:host=127.0.0.1;dbname=performace_test";
  132. $db = new PDO($dsn, 'root', 'root', array(PDO::ATTR_PERSISTENT => true));
  133. mysql_query('TRUNCATE TABLE `performace_test`.`myquery`',$link); //Truncate Table
  134. $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);
  135. for($i=0;$i{
  136. mysql_query($query,$link);
  137. }
  138. echo "USE MySQL extension: ". (microtime(true)-$start_time);
  139. mysql_query('TRUNCATE TABLE `performace_test`.`myquery`',$link); //Truncate Table
  140. $start_time = microtime (true);
  141. for($i=0;$i{
  142. $db->e​​xec($query);
  143. }
  144. echo "rnUSE PDO : ". (microtime(true)-$start_time);
  145. /**
  146. USE MySQL extension: 95.233189106s
  147. USE PDO : 99.1193888188連結MySQL上幾乎沒有差別。 PDO的效能損失完全可以忽略不計。
  148. 但是卻有非常多的操作卻是MySQL擴充函式庫所不具備的:
  149. 1:PDO真正的以底層實作的統一介面數庫操作介面
  150. 2:PDO支援更高階的DB特性操作,如:預存程序的調度等,mysql原生函式庫是不支援的.
  151. 3:PDO是PHP官方的PECL函式庫,相容性穩定性必然要高於MySQL Extension,可以直接使用pecl upgrade pdo 指令升級
  152. PHP6預設也是使用PDO進行資料庫鏈接,MySQL Extension會作為輔助。
  153. 所以我們在日常專案中,如果環境允許,盡可能去使用PDO來進行MySQL資料庫操作。
  154. ?>
  155. 複製程式碼
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板