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 中实现 MySQLLIMIT
子句:***.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的主要内容,如果未能解决你的问题,请参考以下文章