簡體   English   中英

PHP PDO與普通的mysql_connect

[英]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_* ,...更好
  • 面向對象的API mysqli_*有一個OO-API,但不是mysql_*
  • 支持MySQL> = 4.1的新功能(與mysqli_*相同,但不再是mysql_*

順便說一句:我一般都在使用PDO - “手工”,或者是Zend Framework和/或Doctrine集成/使用的。


作為旁注:即使你不打算使用PDO,也要注意使用mysqli而不是mysql。

請參閱PHP手冊的此頁面

  • 使用PDO,您可以使用綁定參數,這將防止大多數SQL注入攻擊。
  • 使用PDO預處理語句可以獲得更快的速度。
  • 所有數據庫后端的標准接口
  • 有很多有用的方法(比如fetch *系列)

我做了一些性能測試,使用預處理語句和常規直接查詢(使用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優於SQl
  • PDO和他的准備語句提供針對SQL注入的最佳安全代碼
  • PDO是面向對象的;)
  • PDO與之前解釋的某些數據庫引擎兼容
  • MySQLl_ *已棄用,很快就會被刪除
  • PDO以更少的代碼行提供更多功能示例:

    PDO

    1. 檢查“<”和“>”和“#”(此檢查全局用途)
    2. 准備
    3. 執行

MySQL_ *

  1. 添加反斜杠
  2. Xsafe
  3. 檢查“<”和“>”和“#”(此檢查全局用途)
  4. 詢問

兩個相同的功能,但你比較代碼PDO更人性化可讀:)所以你怎么想?

在這兩種情況下,你從同一個Php服務器調用相同的mySQL服務器...所以你不會注意到很多不同。

如果你想要良好的性能,請考慮緩存(memcache或簡單的Php文件......)並建立一個良好的數據庫結構(INDEX ...)

從PHP 5.5.0開始,不推薦使用mysql_connect函數,並且與大多數已棄用的功能一樣,將刪除它。 因此,更喜歡使用PDO_MySQL (或另一種替代MySQLi )而不是mysql_connect

資料來源: http//php.net/manual/en/function.mysql-connect.php

如果性能對您來說不是“真正的問題”,則應使用PDO。 性能差異很小,PDO有一個非常好的便攜式跨數據庫接口,如果您需要使用多個數據庫驅動程序,可以省去一些麻煩。

PDO的一些優點:

  1. 可以訪問多個數據庫。
  2. 提供了許多數據庫驅動程序來連接不同的數據庫。
  3. 當您從一個數據庫切換到另一個數據庫時,您不需要編寫所有代碼來連接新數據庫,只需更改新數據庫所需的連接字符串和一些查詢。
  4. 它提供了一個prepare語句,它是一種查詢模板,它只編譯一次,可以根據需要執行多次,只需更改名為place-holder的屬性即可。
  5. 簡單高效的一般操作如插入,更新......等。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM