PHP PDO与普通的mysql_connect

时间:2009-09-09 20:52:06

标签: php mysql pdo

我应该使用php PDO还是普通的mysql_connect来在PHP中执行数据库查询?

哪一个更快?

PDO的一大好处是界面在多个数据库中是一致的。 对于预处理语句也有一些很酷的函数,它们可以省去一些逃避所有查询字符串的麻烦。 PDO的可移植性大于mysql_connect。

那么,我应该因为这些原因使用PDO还是坚持使用传统的mysql_connect?

12 个答案:

答案 0 :(得分:40)

PDO比mysql_ *慢一点 但它具有很好的便携性。 PDO提供跨多个数据库的单一界面。这意味着你可以使用多个数据库而不使用mysql的mysql_query,MS sql的mssql_query等。只需使用类似$ db-> query(“INSERT INTO ...”)的东西。无论您使用什么数据库驱动程序。

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

答案 1 :(得分:17)

一些快速时间表明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

答案 2 :(得分:11)

我不认为速度是人们在使用PDO时所寻求的 - 我不知道是否存在差异,我真诚地不在乎:只要我在做一对夫妇在生成页面时对数据库的查询,PHP端的几毫秒不会改变任何内容。

mysql_*相比,PDO有两件好事:

  • 或多或少的数据库连接;比使用mysql_*pg_*oci_*,...
  • 更好
  • 面向对象的API mysqli_*有一个OO-API,但没有mysql_*
  • 支持MySQL的新功能&gt; = 4.1 (与mysqli_*相同,但不再支持mysql_*
顺便说一句:我通常使用PDO - “手动”,或者Zend Framework和/或Doctrine集成/使用PDO。


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

请参阅this page of the PHP manual,关于此事。

答案 3 :(得分:11)

  • 使用PDO,您可以使用绑定参数,这将防止大多数SQL注入攻击。
  • 使用PDO预处理语句可以获得更快的速度。
  • 所有数据库后端的标准接口
  • 有许多有用的方法(如fetch *系列)

答案 4 :(得分:6)

我做了一些性能测试,使用预处理语句和常规直接查询(使用Mysqlnd和MyISAM表上的select语句测试)将Mysqli函数与PDO函数进行比较。

我发现PDO查询比Mysqli略慢,但只是略微。这是有道理的,因为用于此目的的PDO主要只是一个调用Mysqli函数的包装器。使用PDO的优点是,它使迁移到不同的数据库更容易,因为函数名称不是特定于MySQL。

真正的性能差异在于您是否使用准备好的查询。使用准备好的查询存在大量且重要的性能惩罚。其他测试过它们的人也发现了相同的结果。

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

答案 5 :(得分:4)

我通常建议使用PDO,除非有特殊原因你不能。如果两者之间没有什么差别,你没有理由不使用PDO,我相信在你的应用程序中使用数据库抽象的做法比使用mysql_ *更简单,因为它就在那里。我会说让最佳实践获胜。

答案 6 :(得分:3)

在这两种情况下,你从同一个Php服务器调用相同的mySQL服务器...所以你不会注意到很多不同。

如果您想获得良好的性能,请考虑缓存(memcache或简单的Php文件......)并建立一个良好的数据库结构(INDEX ...)

答案 7 :(得分:3)

  • PDO优于SQl
  • PDO和他的准备语句提供针对SQL注入的最佳安全代码
  • PDO是面向对象的;)
  • PDO与之前解释的某些数据库引擎兼容
  • MySQLl_ *已弃用,将很快删除
  • PDO以更少的代码行提供更多功能示例:

    PDO

    1. 连接
    2. 检查“&lt;”并且“&gt;”和“#”(此检查全球使用)
    3. 准备
    4. 执行
    5. 关闭

的MySQL _ *

  1. 连接
  2. 添加反斜杠
  3. Xsafe
  4. 检查“&lt;”并且“&gt;”和“#”(此检查全球使用)
  5. 查询
  6. 关闭
  7. 两个相同的功能,但您比较代码 PDO更人性化可读:) 那么你的想法是什么?

答案 8 :(得分:2)

如果性能对您来说不是“真正的问题”,则应使用PDO。性能差异很小,PDO有一个非常好的便携式跨数据库接口,可以在您需要使用多个数据库驱动程序时节省一些麻烦。

答案 9 :(得分:2)

自PHP 5.5.0起,mysql_connect函数已弃用,并且与大多数已弃用的功能一样,将被删除。因此,请优先使用PDO_MySQL(或其他替代MySQLi)而不是mysql_connect

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

答案 10 :(得分:0)

PDO的一些优点:

  1. 可以访问多个数据库。
  2. 提供了许多数据库驱动程序来连接不同的不同数据库。
  3. 当您从一个数据库切换到另一个数据库时,您无需编写所有代码来连接新数据库,只需更改新数据库所需的连接字符串和一些查询。
  4. 它提供了一个查询模板,它是一种只编译一次的查询模板,可以根据需要执行多次,只需更改名为占位符的属性即可。
  5. 简单有效的一般操作,如插入,更新......等。

答案 11 :(得分:-1)

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