您現在的位置: 365建站網 > 365學習 > php中使用mysql、mysqli、pdo連接數據庫的用法和比較

php中使用mysql、mysqli、pdo連接數據庫的用法和比較

文章來源:365jz.com     點擊數:521    更新時間:2019-05-22 00:19   參與評論

PHP與mySQL的連接有三種API接口,分別是:PHP的MySQL擴展 、PHP的mysqli擴展 、PHP數據對象(PDO) ,下面針對以上三種連接方式做下總結,以備在不同場景下選出最優方案。

 

一、特性及對比

PHP的MySQL擴展是設計開發允許PHP應用與MySQL數據庫交互的早期擴展。mysql擴展提供了一個面向過程 的接口,并且是針對MySQL4.1.3或更早版本設計的。因此,這個擴展雖然可以與MySQL4.1.3或更新的數據庫服務端 進行交互,但并不支持后期MySQL服務端提供的一些特性。由于太過古老,又不安全,所以已被后來的mysqli完全取代。

PHP的mysqli擴展,我們有時稱之為MySQL增強擴展,可以用于使用 MySQL4.1.3或更新版本中新的高級特性。其特點為:面向對象接口 、prepared語句支持、多語句執行支持、事務支持 、增強的調試能力、嵌入式服務支持 、預處理方式完全解決了sql注入的問題。不過其也有缺點, 就是只支持mysql數據庫。如果你要是不操作其他的數據庫,這無疑是最好的選擇。

PDO是PHP Data Objects的縮寫,其是PHP應用中的一個數據庫抽象層規范。PDO提供了一個統一的API接口可以使得你的PHP應用不去關心具體要 連接的數據庫服務器系統類型。也就是說,如果你使用PDO的API,可以在任何需要的時候無縫切換數據庫服務器,比如從oracle 到MySQL,僅僅需要修改很少的PHP代碼。其功能類似于JDBC、ODBC、DBI之類接口。同樣,其也解決了sql注入問題,有很好的安全性。不過 他也有缺點,某些多語句執行查詢不支持(不過該情況很少)。

為了與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有很大提升。非常希望你去嘗試這些提升。


特性比較

下表比較了PHP中三種主要的MySQL連接方式的功能:


 PHP的mysqli擴展PDO (使用PDO MySQL驅動和MySQL Native驅動)PHP的mysql擴展
引入的PHP版本5.05.03.0之前
PHP5.x是否包含
MySQL開發狀態活躍在PHP5.3中活躍僅維護
在MySQL新項目中的建議使用程度建議 - 首選建議不建議
API的字符集支持
服務端prepare語句的支持情況
客戶端prepare語句的支持情況
存儲過程支持情況
多語句執行支持情況大多數
是否支持所有MySQL4.1以上功能大多數

簡單來說就是 :  mysqli(首選) pdo_mysql(建議) mysql(不建議)


下面是我這個星期做過的幾種數據庫連接的方式:


Mysql連接:


<?php
 
$conn = @ mysql_connect("localhost", "root", "") or die("數據庫連接錯誤");
 
mysql_select_db("bbs", $conn);
 
mysql_query("set names 'utf8'");
 
echo "數據庫連接成功";
 
?>

Mysqli連接:


<?php

 

$conn = mysqli_connect('localhost', 'root', '', 'bbs');
 
if(!$conn){
 
die("數據庫連接錯誤" . mysqli_connect_error());
 
}else{
 
echo"數據庫連接成功";
 
}
 
?>

Pdo連接:


<?php
 
try{
 
$pdo=new pdo("mysql:host=localhost;dbname=bbs","root","");
 
}catch(PDDException $e){
 
echo"數據庫連接錯誤";
 
}
 
echo"數據庫連接成功";
 
?>

        普通的mysql方法在安全性方面應該不是很好,每次需要考慮sql注入的問題,而且速度不是很贊。而mysqli是在mysql基礎上進行改進的一次,較好的解決了sql注入問題。

        pdo則是最新的數據庫抽象方法,pdo高度抽象了數據庫操作,項目使用pdo方法可以方便的進行遷移,在不同的數據庫之間進行遷移。

        在高負載的情況下.PDO開啟長連接能夠得到一個相對穩定的負載“值”。但是效率卻不是最高的。 
mysql最快。mysqli其次。只是mysql和mysqli在高并發、系統高負載的時候。其所承擔的負載也是很可觀的。PDO則不會。


書寫風格面向對象拋異常
php_mysqli  函數名用下劃線,比如fetch_all 可以oop,也可以opp否,只能false
pdo函數名用駝峰,比如fetchAlloop可以throw,也可false或false加warnnig
php_pgsql函數名用下劃線,比如pg_fetch_allopp否,只能false

其次pdo是面向對象的,當有錯誤的時候可以拋出異常,而且可以自定義異常拋出。


php_mysqli 與 pdo 性能對比:(查找自互聯網)

 PHP的mysqli擴展PDO (使用PDO MySQL驅動和MySQL Native驅動)PHP的mysql擴展
引入的PHP版本5.05.03.0之前
PHP5.x是否包含
MySQL開發狀態活躍在PHP5.3中活躍僅維護
在MySQL新項目中的建議使用程度建議 - 首選建議不建議
API的字符集支持
服務端prepare語句的支持情況
客戶端prepare語句的支持情況
存儲過程支持情況
多語句執行支持情況大多數
是否支持所有MySQL4.1以上功能大多數

PDO使用說明:

PDO::prepare()

官方文檔:http://www.php.net/manual/zh/pdo.prepare.php

適用:多次查詢使用相同的條件字段和結果字段。這時候比PDO::query()性能高。

轉義:value無需手動轉義,PDO會自動進行轉義,不用擔心SQL注入。(開啟query log可以看到語句的確已轉義)

缺點:由于標識符(列名表名)是手寫的SQL,要自己加引用符反勾號`。

PDO::prepare()模擬處理的時候不會通過數據庫,所以不知道語法錯誤,不會返回錯誤或拋異常。什么時候是真處理,什么時候是模擬處理, 官方手冊中未找到說明。輸入任意的SQL都不出錯……所以目前不要指望prepare返回錯誤,PDOStatement::execute()時才會返 回錯誤。

可以用以下代碼測試對比mysql數據庫的執行效率


<?php
/**
 * 測試pdo和mysqli的執行效率
 */
header("Content-type:text/HTML;charset=utf-8");
//通過pdo鏈接數據庫
$pdo_startTime = microtime(true);
$pdo = new PDO("mysql:host=localhost;dbname=test","root","1234",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES'utf8';"));
for($i=1;$i<=100;$i++){
  $title = "pdo標題".$i;
  $content = "pdo內容".$i;
  $addtime = time();
  $user_id = $i;
  $pdo_sql = "INSERT INTO `article`(`title`,`content`,`addtime`,`user_id`) VALUES(:title,:content,:addtime,:user_id)";
  $sth = $pdo->prepare($pdo_sql);
  $sth->bindParam(':title',$title);
  $sth->bindParam(':content',$content);
  $sth->bindParam(':addtime',$addtime);
  $sth->bindParam(':user_id',$user_id);
  $sth->execute();
}
$pdo_endTime = microtime(true);
$pdo_time = $pdo_endTime - $pdo_startTime;
echo $pdo_time;
echo "<hr/>";
//通過mysql鏈接數據庫
$mysqli_startTime = microtime(true);
$mysqli = mysqli_connect("localhost","root","1234","test") or die("數據連接失敗");
mysqli_query($mysqli,"set names utf8");
for($i=1;$i<=100;$i++){
  $title = "mysqli標題".$i;
  $content = "mysqli內容".$i;
  $addtime = time();
  $user_id = $i;
  $sql = "INSERT INTO `article`(`title`,`content`,`addtime`,`user_id`) VALUES('".$title."','".$content."',".$addtime.",".$user_id.")";
  mysqli_query($mysqli,$sql);
}
$mysqli_endTime = microtime(true);
$mysqli_time = $mysqli_endTime - $mysqli_startTime;
echo $mysqli_time;
echo "<hr/>";
if($pdo_time > $mysqli_time){
  echo "pdo的執行時間是mysqli的".round($pdo_time/$mysqli_time)."倍";
}else{
  echo "mysqli的執行時間是pdo的".round($mysqli_time/$pdo_time)."倍";
}


如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇


發表評論 (521人查看,0條評論)
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼: 點擊我更換圖片
最新評論
------分隔線----------------------------
自拍偷拍福力视频,偷拍国际精品,麻豆一区福利电影,国产网红视频午夜福利,se视频大全,久久国产AV影院 av天堂影院首页| 天天爱天天做视频| 人与人性恔配视频免费| 理论片| 两个吃奶一个下面| 日本乱理伦片在线观看a片| 亚洲人成视频免费视频| 日本免费一本天堂在线| 18禁黄网站禁片免费观看| 亚洲49vv在线观看| 亚洲开心婷婷中文字幕| 一本道dvd不卡一专区| 另类亚洲小说图片综合区| chinese农民工嫖妓videoos| 快穿肉文| 手机看片av永久免费| 公交车上拨开少妇内裤进入| 扒开双腿疯狂进出爽爽爽| tude8| cl2019地址更新| 免费网站看v片在线| 公么的粗大满足了我| 中文文字幕文字幕永久免费| 337p西西人体大胆瓣开下部| 福利天堂芒果| 被夫の上司持久侵犯酒井电影| 强行入侵女人a片| yy111111少妇影院免费观看| 办公室上司的又粗又大| 老司机带带我精品视频| 久久爱免费视顿在线观看| http://www.lancasterhorsefarm.com