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

    1. 检查“<”和“>”和“#”(这是全球使用的检查)
    2. 准备
    3. 执行

MySQL_ *

  1. 添加反斜杠
  2. Xsafe
  3. 检查“<”和“>”和“#”(这是全球使用的检查)
  4. 询问

两个相同的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的一些优点:

  1. 可以访问多个数据库。
  2. 提供了许多数据库驱动程序来连接不同的数据库。
  3. 当你从一个数据库切换到另一个数据库时,你不需要编写所有的代码来连接新的数据库,只需要改变连接string和一些新数据库所需的查询。
  4. 它提供了准备语句,它是一种只编译一次的查询模板,只要改变被称为占位符的属性就可以随意多次执行。
  5. 简单高效的一般操作,如插入,更新…等。

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