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

來源:互聯網
上載者:User
php串連到mysql資料庫伺服器時三種主要的API:mysql,mysqli,pdo區別及聯絡
也是常用的擴充 ,哪麼他們的效能孰優呢?

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

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.