PHP PDO 与普通 mysql_connect

Posted

技术标签:

【中文标题】PHP PDO 与普通 mysql_connect【英文标题】:PHP PDO vs normal mysql_connect 【发布时间】:2010-11-26 23:38:15 【问题描述】:

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

哪个更快?

PDO 的一大好处是接口在多个数据库之间是一致的。 准备好的语句也有一些很酷的功能,可以省去转义所有查询字符串的麻烦。 PDO的可移植性大于mysql_connect。

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

【问题讨论】:

最近,我读到一篇关于 PDO 的好文章。我希望你也会喜欢它。链接:: net.tutsplus.com/tutorials/php/… 比最初的问题发布晚了将近 4 年,现在您不应该使用 mysql_* 函数,因为它们已被弃用(请参阅 mysql_connect 顶部的红色框。 deprecation of mysql_* functions 上的另一篇好文章,如果您已经在使用 PDO,它还描述了如何实现它们。 【参考方案1】:

PDO 比 mysql_* 慢一点 但是它的便携性很好。 PDO 提供跨多个数据库的单一接口。这意味着您可以使用多个数据库,而无需对 mysql 使用 mysql_query,对 MS sql 使用 mssql_query 等。只需始终使用 $db->query("INSERT INTO...") 之类的东西。无论您使用什么数据库驱动程序。

因此,对于较大或可移植的项目,PDO 更可取。甚至 zend 框架也使用 PDO。

【讨论】:

另外,小的速度差异没有影响,因为使用 PHP 的无共享架构添加更多 Web 服务器很容易。无论您使用 PDO 还是 mysqli 驱动程序,数据库都会执行相同的操作。 只是想指出,PDO 在驱动程序级别提供了一个抽象级别,这对可移植性有很大帮助。但是,如果您最终为一个引擎编写 SQL 变体,您将需要修改您的代码以便能够将其移植到另一个数据库(例如,请参阅如何在 MS SQL Server 中实现 MySQL LIMIT 子句:***.com/questions/603724/… )【参考方案2】:

一些快速计时表明 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,要么使用someotherlibrary。

【讨论】:

有趣...但是每个 mysql_cnnect 都已使用 mysql_close 关闭;虽然没有一个 PDO 被关闭或取消设置......也许我们也应该关闭 PDO 或者不关闭 mysql_connect;只有这样我们才能得到更准确的结果。您需要一些额外的时间来关闭连接。 当 $db 设置为 null 时,会调用 PDO 对象析构函数(并断开连接)。查看 PDO 文档。 us2.php.net/manual/en/pdo.connections.php 我不确定在您为同一变量声明新连接时它是否已从内存中删除。 只是为了让您知道您的测试不公平,因为原始测试选择了一个数据库,而 PDO 测试没有选择。 与标准 odbc_connect 相比,我使用 PDO odbc 连接测试了相同的东西,并且 PDO 快了约 3 倍。但是,当我向每个循环(在关闭之前)添加一个简单的“SELECT 100”查询时,情况发生了很大变化。现在标准 odbc_connect+odbc_exec 比 PDO 版本快约 30%。我想说,仅考虑连接速度不太现实 - 无论数据库服务器有多远,您只需为许多查询执行一次。【参考方案3】: 借助 PDO,您可以使用绑定参数,这将防止大多数 sql 注入攻击。 您可以使用 PDO 准备语句获得更快的速度。 所有数据库后端的标准接口 有很多有用的方法(如 fetch* 系列)

【讨论】:

【参考方案4】:

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

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

跨数据库的或多或少不变的界面;比使用mysql_*pg_*oci_*、... 面向对象的 API mysqli_* 有 OO-API,但没有 mysql_* 支持 MySQL >= 4.1 的新功能 (与 mysqli_* 相同,但又不是 mysql_*

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

作为旁注:即使您不打算使用 PDO,请注意建议使用 mysqli 而不是 mysql。

请参阅this page of the PHP manual,了解相关内容。

【讨论】:

PDO 不允许我们使用最新版本的 MySQL 服务器中可用的所有高级功能。例如,PDO 不允许我们使用 MySQL 对 Multiple Statements 的支持。那么,我应该使用 PDO 吗? 但是当您需要可移植性或您的项目/站点足够大时,您应该使用 PDO 以获得更好的维护、更简洁的代码。虽然使用 mysql_* 可以编写干净的代码,但您可能很难更改驱动程序等。【参考方案5】:

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

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

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

如果您准备一次查询,然后使用不同的数据值提交数千次,则准备查询更快。否则,使用 mysqli::query() 或 PDO::query() 总是更快。但重要的是要知道这些函数不会为您转义数据值,因此您需要记住对数据变量使用 mysqli::real_escape_string() 或 PDO::quote()。

【讨论】:

你指的是 PDO 的模拟语句准备,MySQL 的原生准备语句,还是两者兼而有之?【参考方案6】:

我通常会推荐使用 PDO,除非有特定原因您不能这样做。如果两者之间没有什么区别,并且您没有理由不使用 PDO,我相信在您的应用程序中使用 DB 抽象比仅仅因为它就在那里而使用 mysql_* 更好。我想说让最佳实践获胜。

【讨论】:

【参考方案7】:

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

如果你想要好的性能,考虑缓存(memcache或者简单的Php文件...)并制作一个好的数据库结构(INDEX ...)

【讨论】:

我同意,因为如果您遇到 mysql 驱动程序与数据库语句本身相比消耗大量资源的情况……您应该真正考虑一下出了什么问题。【参考方案8】: PDO 优于 SQl PDO 和他的 Prepare 语句提供了针对 SQL 注入的最佳安全代码 PDO 是面向对象的 ;) PDO 与之前解释的某些数据库引擎兼容 MySQLl_* 已弃用,很快将被删除

PDO 以更少的代码行提供更多的功能示例:

Pdo

    连接 检查“”和“#”(这个检查全局使用) 准备 执行 关闭

MySQL_*

    连接 添加反斜杠 Xsafe 检查“”和“#”(这个检查全局使用) 查询 关闭

两者功能相同,但您比较代码 PDO 更易于阅读:) 那你怎么看?

【讨论】:

你忘记了最重要的事实,mysql_* 已被弃用。 感谢 hjpotter92 的有用提醒 :) 我很可能忘记了 ;) 我已经更新了帖子【参考方案9】:

如果性能对您来说不是“真正的问题”,您应该使用 PDO。性能差异很小,而且 PDO 有一个非常漂亮且可移植的跨数据库接口,如果您需要使用多个数据库驱动程序,可以为您省去一些麻烦。

【讨论】:

【参考方案10】:

mysql_connect 函数自 PHP 5.5.0 起已弃用,并且与大多数已弃用的功能一样,将被删除。因此,比起mysql_connect,更喜欢使用PDO_MySQL(或其他替代方案MySQLi)。

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

【讨论】:

【参考方案11】:

PDO 的一些优点:

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

【讨论】:

【参考方案12】:

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

【讨论】:

以上是关于PHP PDO 与普通 mysql_connect的主要内容,如果未能解决你的问题,请参考以下文章

转换为 mysql_connect 到 PDO

PHP / MySQL中的PDO和UTF-8特殊字符?

PHP数据库-Mysql

在 PHP 中使用 PDO 打开的 SQL 连接是不是必须关闭

php与mysql之间操作原理

PDO的基本操作