![](/img/trans.png)
[英]PHP mysql_connect fails, PDO connection to MySQL works fine
[英]PHP PDO vs normal mysql_connect
我應該使用PHP PDO或普通的mysql_connect在PHP中執行數據庫查詢嗎?
哪一個更快?
PDO的一大好處是界面在多個數據庫中是一致的。 對於預處理語句也有一些很酷的函數,它們可以省去一些逃避所有查詢字符串的麻煩。 PDO的可移植性大於mysql_connect。
那么,我應該因為這些原因使用PDO還是堅持使用傳統的mysql_connect?
PDO比mysql_ *慢一點但它具有很好的可移植性。 PDO提供跨多個數據庫的單一界面。 這意味着你可以使用多個數據庫而不使用mysql的mysql_query,MS sql的mssql_query等。只需使用類似$ db-> query(“INSERT INTO ...”)的東西。 無論您使用什么數據庫驅動程序。
因此,對於大型或便攜式項目,PDO更可取。 甚至zend框架也使用PDO。
一些快速計時表明PDO連接速度稍快。
$start = microtime(true);
for($i=0; $i<10000; ++$i) {
try {
$db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage()."\n";
}
$db = null;
}
$pdotime = microtime(true) - $start;
echo "PDO time: ".$pdotime."\n";
$start = microtime(true);
for($i=0; $i<10000; ++$i) {
$db = mysql_connect($host, $user, $password);
if(!$db) {
echo "Connection failed\n";
}
if(!mysql_select_db($schema, $db)) {
echo "Error: ".mysql_error()."\n";
}
mysql_close($db);
}
$rawtime = microtime(true) - $start;
echo "Raw time: ".$rawtime."\n";
得到的結果就像
PDO time: 0.77983117103577
Raw time: 0.8918719291687
PDO time: 0.7866849899292
Raw time: 0.8954758644104
PDO time: 0.77420806884766
Raw time: 0.90708494186401
PDO time: 0.77484893798828
Raw time: 0.90069103240967
無論如何,速度差異可以忽略不計; 建立網絡連接可能比PDO產生的任何開銷要長很多,特別是如果mysql服務器在另一台主機上。
您提到了自己使用PDO的所有原因。 說真的,永遠不要直接使用mysql_ *功能,或者使用PDO,或者使用一些 其他 的庫 。
我不認為速度是人們在使用PDO時所尋求的 - 我不知道是否存在差異,我真誠地不關心:只要我做了幾個查詢生成頁面時的數據庫,PHP端的幾毫秒不會改變任何東西。
與mysql_*
相比,PDO有兩個/三個好東西:
mysql_*
, pg_*
, oci_*
,...更好 mysqli_*
有一個OO-API,但不是mysql_*
) mysqli_*
相同,但不再是mysql_*
) 順便說一句:我一般都在使用PDO - “手工”,或者是Zend Framework和/或Doctrine集成/使用的。
作為旁注:即使你不打算使用PDO,也要注意使用mysqli而不是mysql。
請參閱PHP手冊的此頁面 。
我做了一些性能測試,使用預處理語句和常規直接查詢(使用Mysqlnd和MyISAM表上的select語句測試)將Mysqli函數與PDO函數進行比較。
我發現PDO查詢比Mysqli略慢,但只是略微。 這是有道理的,因為用於此目的的PDO主要只是一個調用Mysqli函數的包裝器。 使用PDO的優點是,它使遷移到不同的數據庫更容易,因為函數名稱不是特定於MySQL的。
真正的性能差異在於您是否使用准備好的查詢。 使用准備好的查詢會產生巨大而顯着的性能損失 。 其他測試過它們的人也發現了相同的結果。
准備查詢的唯一時間是更快,如果您准備一次查詢然后使用不同的數據值提交數千次。 否則,使用mysqli :: query()或PDO :: query()總是更快。 但重要的是要注意這些函數不會為您轉義數據值,因此您需要記住在數據變量上使用mysqli :: real_ escape_ string()或PDO :: quote()。
我通常建議使用PDO,除非有特殊原因你不能。 如果兩者之間沒有什么差別,你沒有理由不使用PDO,我相信在你的應用程序中使用數據庫抽象的做法比使用mysql_ *更簡單,因為它就在那里。 我會說讓最佳實踐獲勝。
PDO以更少的代碼行提供更多功能示例:
兩個相同的功能,但你比較代碼PDO更人性化可讀:)所以你怎么想?
在這兩種情況下,你從同一個Php服務器調用相同的mySQL服務器...所以你不會注意到很多不同。
如果你想要良好的性能,請考慮緩存(memcache或簡單的Php文件......)並建立一個良好的數據庫結構(INDEX ...)
如果性能對您來說不是“真正的問題”,則應使用PDO。 性能差異很小,PDO有一個非常好的便攜式跨數據庫接口,如果您需要使用多個數據庫驅動程序,可以省去一些麻煩。
PDO的一些優點:
PDO數據庫連接代碼:
<?php
$dbhost = 'localhost';
$dbname = 'clsrepair';
$dbuser = 'root';
$dbpass = '';
try {
$db = new PDO("mysql:host={$dbhost};dbname={$dbname}",$dbuser,$dbpass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo "Connection error: ".$e->getMessage();
}
?>
正常的MySQL數據庫連接代碼:
<?php
mysql_connect("localhost","root", "");
mysql_select_db ("clsrepair");
?>
要么
<?php
$dbHost = 'localhost'; // usually localhost
$dbUsername = 'root';
$dbPassword = '';
$dbDatabase = 'clsrepair';
$db = mysql_connect($dbHost, $dbUsername, $dbPassword) or die ("Unable to connect to Database Server.");
mysql_select_db ($dbDatabase, $db) or die ("Could not select database.");
?>
MySQL數據庫連接代碼容易,但PDO有很多優點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.