PHP的PDO与普通的mysql_connect
我应该使用PHP的PDO或正常的mysql_connect在PHP中执行数据库查询?
哪一个更快?
PDO的一大优点是界面在多个数据库中是一致的。 准备好的语句也有一些很酷的function,从而避免了所有查询string的麻烦。 PDO的可移植性大于mysql_connect。
那么,我应该使用PDO的原因还是坚持传统的mysql_connect?
PDO比mysql_ *慢一点,但它具有很好的可移植性。 PDO提供跨多个数据库的单一界面。 这意味着你可以使用多个数据库,而不使用mysql的mysql_query,MS sql的mssql_query等。总是使用类似于$ db-> query(“INSERT INTO …”)的东西。 不pipe你使用的是什么数据库驱动程序。
所以,对于大型或便携式项目PDO是最好的。 甚至zend框架使用PDO。
一些快速的时间表明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
无论如何,速度差异可以忽略不计。 build立一个networking连接可能要比PDO产生的开销要长很多,特别是如果mysql服务器在另一个主机上。
你提到了所有使用PDO的原因。 真的,不要直接使用mysql_ *函数,要么使用PDO,要么使用其他 库 。
我不认为速度是人们在使用PDO时所要求的速度 – 我不知道是否有差异,而且我也不在意:只要我正在做几个查询一个数据库生成一个页面时,PHP端的几毫秒不会改变任何东西。
与mysql_*
相比,PDO有两个/三个mysql_*
:
- 跨数据库的界面或多或less一致; 比使用
mysql_*
,pg_*
,oci_*
,…更好 - 面向对象的API (
mysqli_*
有一个OO-API,但不是mysql_*
) - 支持MySQL> = 4.1的新特性(与
mysqli_*
相同,但不是mysql_*
)
顺便说一句:我通常使用PDO – “手工”,或者因为它集成在Zend Framework和/或Doctrine中使用/使用。
作为一个旁注:即使你不打算使用PDO,注意使用mysqli而不是mysql被推荐。
请参阅PHP手册的这个页面 。
- 随着PDO你可以使用绑定参数,这将防止大多数SQL注入攻击。
- 您可以使用PDO准备的语句获得更多的速度。
- 标准接口到所有数据库后端
- 有一堆有用的方法(如fetch *系列)
我做了一些性能testing,使用准备语句和常规直接查询(使用Mysqlnd和MyISAM表上的select语句进行testing),将Mysqli函数与PDO函数进行比较。
我发现PDO查询只比Mysqli稍慢,但只是稍微。 这是有道理的,因为PDO用于这个目的大多只是一个调用Mysqli函数的包装。 使用PDO的好处在于,它使得迁移到不同的数据库变得容易一些,因为函数名称不是特定于MySQL的。
真正的性能差异在于您是否使用准备好的查询。 使用准备的查询有一个巨大和显着的性能损失 。 其他testing他们的人也发现了相同的结果。
准备查询的时间只有一次,如果您准备查询一次,然后用不同的数据值提交数千次。 否则,使用mysqli :: query()或PDO :: query()会更快。 但重要的是要知道这些函数不会为您跳过数据值,因此您需要记住在数据variables上使用mysqli :: real_ escape_ string()或PDO :: quote()。
我通常会build议使用PDO,除非有一个特定的原因,你不能。 如果两者之间没有什么区别,而且您没有理由不使用PDO,那么我认为在应用程序中使用数据库抽象的做法要比使用mysql_ *更简单 – 因为它在那里。 我会说让最佳实践取胜。
在这两种情况下,你都从相同的Php服务器调用同一个mySQL服务器…所以你不能注意到很多的不同。
如果你想要很好的性能,可以考虑caching(memcache或者简单的PHP文件…)并且创build一个好的数据库结构(INDEX …)
- PDO比SQ1好
- PDO和他的准备语句提供最佳的安全代码对SQL注入
- PDO是面向对象的;)
- PDO与之前解释的某些数据库引擎兼容
- MySQLl_ *已被弃用,并将很快被删除
-
PDO使用较less的代码行提供更多function示例:
PDO
- 连
- 检查“<”和“>”和“#”(这是全球使用的检查)
- 准备
- 执行
- 关
MySQL_ *
- 连
- 添加反斜杠
- Xsafe
- 检查“<”和“>”和“#”(这是全球使用的检查)
- 询问
- 关
两个相同的function,但你比较的代码PDO是更人性化的可读性:)所以你的想法?
如果你的performance不是“真正的问题”,你应该使用PDO。 性能差距小,PDO有一个非常好的和可移植的跨数据库接口,这可以为您节省一些头痛的情况下,你需要使用多个数据库驱动程序。
从PHP 5.5.0开始, mysql_connect
函数已被弃用,并且与大多数弃用的function一样,将被删除。 因此,更喜欢通过mysql_connect
使用PDO_MySQL (或另一种替代MySQLi )。
资料来源: http : //php.net/manual/en/function.mysql-connect.php
PDO的一些优点:
- 可以访问多个数据库。
- 提供了许多数据库驱动程序来连接不同的数据库。
- 当你从一个数据库切换到另一个数据库时,你不需要编写所有的代码来连接新的数据库,只需要改变连接string和一些新数据库所需的查询。
- 它提供了准备语句,它是一种只编译一次的查询模板,只要改变被称为占位符的属性就可以随意多次执行。
- 简单高效的一般操作,如插入,更新…等。
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有很多优点。