代码之家  ›  专栏  ›  技术社区  ›  Imrul

php-pdo与普通mysql-connect

  •  46
  • Imrul  · 技术社区  · 15 年前

    我应该使用php-pdo还是普通的mysql-connect来执行php中的数据库查询?

    哪个更快?

    PDO的一大好处是接口在多个数据库中是一致的。 对于准备好的语句也有一些很酷的函数,这些函数可以避免转义所有查询字符串的麻烦。PDO的可移植性大于mysql-connect。

    那么,我应该出于这些原因使用PDO还是坚持使用传统的mysql-connect?

    12 回复  |  直到 9 年前
        1
  •  40
  •   Bhavik Ambani    12 年前

    PDO比MySQL慢一点_* 但它具有很好的可移植性。PDO提供了跨多个数据库的单一接口。这意味着您可以使用多个数据库,而不必使用MySQL查询、MS SQL的MSSQL查询等。只需始终使用$DB->查询(“insert into…”)。无论您使用的是什么DB驱动程序。

    因此,对于大型或便携式项目,PDO更可取。甚至Zend框架也使用PDO。

        2
  •  17
  •   gnud    15 年前

    一些快速计时表明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,要么使用 some other library .

        3
  •  11
  •   Pascal MARTIN    15 年前

    我不认为人们在使用PDO时所追求的是速度——我不知道是否有区别,我也确实不在乎:只要在生成页面时对数据库进行几次查询,PHP端的几毫秒就不会改变任何东西。

    相比之下,PDO有三分之二的优点 mysql_* 以下内容:

    • 或多或少的常量接口访问数据库;比使用 MyQuL** , pg_* ,请 oci_* ,…
    • 面向对象的API ( mysqli_* 有一个OO-API,但没有 MyQuL** )
    • 支持mysql的新功能>=4.1 (同) MyQuiLi* ,但不是 MySQL_* 再一次)

    顺便说一句:我通常使用PDO——要么“手动”,要么它集成在/使用于 Zend Framework 和/或 Doctrine .


    旁注:即使不打算使用PDO,也要注意,建议使用mysqli而不是mysql。

    this page of the PHP manual ,关于那个。

        4
  •  11
  •   Mikayla Maki    11 年前
    • 使用PDO,您可以使用绑定的参数,这将防止大多数SQL注入攻击。
    • 您可以使用PDO准备好的语句来提高速度。
    • 所有数据库后端的标准接口
    • 有很多有用的方法(比如fetch*系列)
        5
  •  6
  •   orrd    13 年前

    我做了一些性能测试,用准备好的语句和常规的直接查询(在mysqlnd和myisam表上使用select语句测试)来比较mysqli函数和pdo函数。

    我发现PDO查询比mysqli稍微慢一点,但也只是稍微慢一点。这是有意义的,因为PDO用于此目的的大多只是一个调用mysqli函数的包装器。使用PDO的好处在于,它使迁移到不同的数据库变得更加容易,因为函数名不是特定于MySQL的。

    真正的性能差异在于您是否使用准备好的查询。有一个巨大而显著的性能 处罚 使用准备好的查询。其他测试过他们的人也发现了同样的结果。

    准备查询的唯一时间更快的是,如果只准备一次查询,然后用不同的数据值提交它数千次。否则,使用mysqli::query()或pdo::query()总是更快。但要注意,这些函数不会为您转义数据值,因此您需要记住对数据变量使用mysqli::real_uuescape_u string()或pdo::quote()。

        6
  •  4
  •   Robert DeBoer    15 年前

    我通常建议使用PDO,除非有特定的原因您不能。如果两者之间没有什么区别,并且您没有理由不使用PDO,那么我相信在您的应用程序中使用DB抽象的实践比使用MySQL更好,因为它确实存在。我会说让最佳实践获胜。

        7
  •  3
  •   Thomas Decaux    14 年前

    在这两种情况下,您从同一个PHP服务器调用同一个MySQL服务器…所以你不会注意到很多不同。

    如果您想要好的性能,可以考虑缓存(memcache或简单的php文件…)并创建一个好的数据库结构(index…)

        8
  •  3
  •   Jamil Hneini    12 年前
    • PDO比SQL好
    • PDO和他的PREPARE语句提供了针对SQL注入的最佳安全代码
    • PDO是面向对象的;)
    • 如前所述,PDO与某些数据库引擎兼容
    • mysqll_*已弃用,将很快删除
    • PDO以更少的代码行提供更多的功能示例:

      PDO

      1. 连接
      2. 检查“<”和“>”和“”(此项检查用于全局用途)
      3. 准备
      4. 执行
      5. 关闭

    MySQL_*

    1. 连接
    2. 添加反斜杠
    3. X安全
    4. 检查“<”和“>”和“”(此项检查用于全局用途)
    5. 查询
    6. 关闭

    两个功能相同,但您比较代码 PDO更人性化地可读:) 你怎么想?

        9
  •  2
  •   yoda    15 年前

    如果性能对您来说不是一个“真正的问题”,您应该使用PDO。性能差别不大,PDO有一个非常好的、可移植的跨数据库接口,如果您需要使用多个数据库驱动程序,它可以为您节省一些麻烦。

        10
  •  2
  •   Czar Pino    12 年前

    这个 mysql_connect 从php 5.5.0开始,函数已被弃用,与大多数弃用的功能一样,将被删除。因此,更喜欢使用 PDO_MySQL (或其他替代方案) MySQLi ) MySQL连接 .

    来源: http://php.net/manual/en/function.mysql-connect.php

        11
  •  0
  •   Bowdzone coooold    10 年前

    PDO的一些优点:

    1. 可以访问多个数据库。
    2. 提供了许多数据库驱动程序来连接不同的数据库。
    3. 当您从一个数据库切换到另一个数据库时,不需要编写所有代码来连接新数据库,只需更改连接字符串和一些新数据库所需的查询。
    4. 它提供了Prepare语句,这是一种查询模板,只编译一次,可以根据需要执行任意多次,只需更改名为place holder的属性即可。
    5. 简单高效的常规操作,如插入、更新等。
        12
  •  -1
  •   Amranur Rahman    9 年前

    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有很多优点。