PHP PDO与普通的mysql_connect

Imr*_*rul 46 php mysql pdo

我应该使用PHP PDO或普通的mysql_connect在PHP中执行数据库查询吗?

哪一个更快?

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

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

Sad*_*adi 40

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

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

  • 只是想要注意PDO在驱动程序级别提供了一定程度的抽象,这有助于实现可移植性.但是如果您最终为一个引擎编写SQL变体,则需要修改代码才能将其移植到另一个DB(例如,请参阅如何在MS SQL Server中实现MySQL`LIMIT`子句:http:/ /stackoverflow.com/questions/603724/how-to-implement-limit-with-microsoft-sql-server) (2认同)

gnu*_*nud 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";
Run Code Online (Sandbox Code Playgroud)

得到的结果就像

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
Run Code Online (Sandbox Code Playgroud)

无论如何,速度差异可以忽略不计; 建立网络连接可能比PDO产生的任何开销要长很多,特别是如果mysql服务器在另一台主机上.

您提到了自己使用PDO的所有原因.说真的,永远不要直接使用mysql_*功能,或者使用PDO,或者使用一些 其他 的库.

  • 只是为了让您知道您的测试不公平,因为原始测试选择数据库而PDO测试没有. (6认同)
  • ...?你得到了什么? (5认同)
  • 有意思......但是每个mysql_cnnect都已使用mysql_close关闭; 虽然没有一个PDO被关闭或未设置...可能我们应该关闭PDO或者不关闭mysql_connect; 只有这样我们才能得到更准确的结果.您需要一些额外的时间来关闭连接. (4认同)
  • 我觉得你的意思可以忽略不计 (2认同)
  • 当$ db设置为null时,将调用(并断开连接)PDO对象析构函数.看一下PDO文档. (2认同)

Pas*_*TIN 11

我不认为速度是人们在使用PDO时所寻求的 - 我不知道是否存在差异,我真诚地不关心:只要我做了几个查询生成页面时的数据库,PHP端的几毫秒不会改变任何东西.

PDO有两个/三个很棒的东西,相比之下mysql_*:

  • 数据库或多或少地保持不变的界面; 比使用更好mysql_*,pg_*,oci_*,...
  • 面向对象的API (mysqli_*有一个OO-API,但没有mysql_*)
  • 支持MySQL的新功能> = 4.1 (同样mysqli_*但不是mysql_*,再次)

顺便说一句:我一般都在使用PDO - "手工",或者是Zend Framework和/或Doctrine集成/使用的.


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

请参阅PHP手册的此页面.

  • 但是,无论何时您需要可移植性或项目/站点足够大,您都应该使用PDO来实现更好的维护,更清晰的代码.虽然可以使用mysql_*创建干净的代码,但您可能很难更改驱动程序等. (4认同)
  • PDO不允许我们使用最新版MySQL服务器中提供的所有高级功能.例如,PDO不允许我们使用MySQL对多语句的支持.那么,我应该使用PDO吗? (2认同)

小智 11

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


orr*_*rrd 6

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

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

真正的性能差异在于您是否使用准备好的查询.使用准备好的查询会产生巨大而显着的性能损失.其他测试过它们的人也发现了相同的结果.

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