题
我应该使用 php PDO 还是普通的 mysql_connect 在 PHP 中执行数据库查询?
哪一个更快?
PDO 的一大好处是接口在多个数据库之间保持一致。对于准备好的语句也有一些很酷的函数,它们可以消除转义所有查询字符串的一些麻烦。PDO的可移植性大于mysql_connect。
那么,出于这些原因我应该使用 PDO 还是坚持传统的 mysql_connect?
解决方案
PDO比mysql_ *慢一点 但它具有很好的便携性。 PDO提供跨多个数据库的单一界面。这意味着您可以使用多个数据库,而无需使用mysql_query用于mysql,mssql_query用于MS sql等。只需使用类似$ db - <!> gt; query(<!> quot; INSERT INTO ... <!> quot;)的内容。无论您使用什么数据库驱动程序。
因此,对于大型或便携式项目,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
无论如何,速度差异可以忽略不计;建立网络连接可能比PDO产生的任何开销要长很多,特别是如果mysql服务器在另一台主机上。
您提到了自己使用PDO的所有原因。真的,永远不要直接使用mysql_ *函数,要么使用PDO,要么使用 some 其他 库。
我不认为人们在使用 PDO 时追求的是速度——我不知道是否有区别,而且老实说我不在乎:只要我在生成页面时对数据库进行几次查询,PHP 端的几毫秒就不会改变任何内容。
与 mysql_*
:
- 跨数据库的接口或多或少是恒定的;比使用更好
mysql_*
,pg_*
,oci_*
, ... - 面向对象的API (
mysqli_*
有 OO-API,但没有mysql_*
) - 支持MySQL >= 4.1的新特性 (与...一样
mysqli_*
, , 但不是mysql_*
, , 再次)
顺便提一句 :我通常使用 PDO——要么“手动”,要么因为它集成在/被使用 Zend框架 和/或 教义.
作为旁注:即使您不打算使用 PDO,请注意,建议使用 mysqli 而不是 mysql。
看 PHP 手册的这一页, , 关于那个。
- 使用 PDO,您可以使用绑定参数,这将防止大多数 sql 注入攻击。
- 使用 PDO 准备好的语句可以获得更快的速度。
- 所有数据库后端的标准接口
- 有很多有用的方法(例如 fetch* 系列)
我做了一些性能测试,使用预处理语句和常规直接查询(使用Mysqlnd和MyISAM表上的select语句测试)将Mysqli函数与PDO函数进行比较。
我发现PDO查询比Mysqli略慢,但只是略微。这是有道理的,因为用于此目的的PDO主要只是一个调用Mysqli函数的包装器。使用PDO的优点是,它使迁移到不同的数据库更容易,因为函数名称不是特定于MySQL。
真正的性能差异在于您是否使用准备好的查询。使用准备好的查询存在大量且重要的性能惩罚。其他测试过它们的人也发现了相同的结果。
准备查询的唯一时间是更快,如果您准备一次查询,然后使用不同的数据值提交数千次。否则,使用mysqli :: query()或PDO :: query()总是更快。但重要的是要注意这些函数不会为您转义数据值,因此您需要记住在数据变量上使用mysqli :: real_ escape_ string()或PDO :: quote()。
我通常建议使用PDO,除非有特殊原因你不能。如果两者之间没有什么差别,你没有理由不使用PDO,我相信在你的应用程序中使用数据库抽象的做法比使用mysql_ *更简单,因为它就在那里。我会说让最佳实践获胜。
在这两种情况下,你从同一个Php服务器调用相同的mySQL服务器...所以你不会注意到很多不同。
如果您想获得良好的性能,请考虑缓存(memcache或简单的Php文件......)并建立一个良好的数据库结构(INDEX ...)
- PDO 优于 SQl
- PDO 和他的Prepare 语句提供了针对SQL 注入的最佳安全代码
- PDO 是面向对象的;)
- PDO 与某些数据库引擎兼容,如前所述
- MySQLl_* 已弃用并将很快被删除
PDO 以更少的代码行提供更多功能示例:
普多
- 连接
- 检查“<”和“>”和“#”(此检查用于全局使用)
- 准备
- 执行
- 关闭
MySQL_*
- 连接
- 添加反斜杠
- X安全
- 检查“<”和“>”和“#”(此检查用于全局使用)
- 询问
- 关闭
两者的功能相同,但您可以比较代码 PDO更具人性化:) 那么你怎么看?
如果表现不是<!>“真正的问题<!>”;对你来说,你应该使用PDO。性能差异很小,PDO有一个非常好的便携式跨数据库接口,可以在您需要使用多个数据库驱动程序时节省一些麻烦。
PDO的一些优点:
- 可以访问多个数据库。
- 提供了许多数据库驱动程序来连接不同的不同数据库。
- 当您从一个数据库切换到另一个数据库时,您无需编写所有代码来连接新数据库,只需更改新数据库所需的连接字符串和一些查询。
- 它提供了一个查询模板,它是一种只编译一次的查询模板,可以根据需要执行多次,只需更改名为占位符的属性即可。
- 简单有效的一般操作,如插入,更新......等。 醇>
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有很多优点。