PDO的缺点(PHP数据对象)

时间:2011-07-08 07:01:59

标签: php pdo

到目前为止,我读到的关于PDO(PHP数据对象)的所有内容都非常好,不可能成真。

我的意思是:

  • 它比mysql或mysqli快。
  • 它具有与多个数据库驱动程序相同的语法。
  • 使用预处理语句,SQL注入是安全的。
  • 您可以直接将数据提取到对象中。

但是PDO的缺点是什么?

5 个答案:

答案 0 :(得分:15)

  

到目前为止,我读到的关于PDO(PHP数据对象)的所有内容都非常好,不可能成真。

我每天都使用PDO,这是有原因的。我确实在它上面写了一个包装器,因为默认的PDO实例做了我不喜欢的事情(例如,无声地失败),并且API可能已经好多了。使用常量配置不是我的默认方法。另外,我已经创建了一些方便的方法。

  

它比mysql或mysqli快。

是吗?我不知道你在哪里选择它,它可能是真的,但我没有听说过PDO比原生MySQL库更快。

  

它具有与多个数据库驱动程序相同的语法。

排序。我经常使用PostgreSQL,代码与您使用MySQL时的代码不同。这是有道理的,因为PostgreSQL使用命名序列,而MySQL使用“自动增量”,这是每个表的序列。 PDO无法抽象的数据库之间存在差异,即使它仅用于数据库访问

  

使用预准备语句,sql注入是安全的。

你也可以prepare statements with mysqli,所以我不认为这是一个明确的好处。我通常使用预处理语句,我喜欢PDO提供的:字段语法。

  

但PDO的缺点在哪里,有这么多专业人士的东西也必须有反对意见。

API对我来说不太直观,我认为mysqli的API更有意义。然而,如果你自己写一个包装器,它是一个非常体面的库。这里the wrapper I wrote使得使用PDO更加理智,但互联网上还有更多的例子在漂流。

编辑:哦,詹姆斯安德森是对的;它的Oracle支持很差。我不使用Oracle,所以我不认为这是一个巨大的缺点。

答案 1 :(得分:5)

绑定机制不适用于列名或表名。

简单示例:

CREATE TABLE :bar (rowId int)

SELECT :foo FROM :bar

从好的方面来说,这不是你经常需要或想做的事情。

但是当你这样做的时候...... PDO会让你停下来。解决方案是手动将查询字符串连接在一起,同时进行手动转义:

$foo = some_escape_logic( $dirtyFoo );
$bar = some_escape_logic( $dirtyBar );

$db->query( "SELECT {$foo} FROM {$bar}" );

SQL结果始终以字符串形式返回

fetch()返回一个字符串值数组,即使SQL表类型是数字。例如,具有bigint / string / bigint列的表返回:

array( 'rowId' => '1', 'name' => 'Fred', 'age' => '12' );

而不是:

array( 'rowId' => 1, 'name' => 'Fred', 'age' => 12 );

作为一个积极因素,您将永远不会因PHP和SQL类型之间的不匹配而失去精确性。 PHP中的类型杂乱也确保您很少会注意到数据最初被编码为字符串。

作为否定,将DB结果传递给类似json_encode()的东西可能会很痛苦,因为你最终会得到引用的数值:

{ "rowId": "1", "name": "Fred", "age": "12" }

而不是

{ "rowId": 1, "name": "Fred", "age": 12 }

在理想的世界中,来自fetch()的自动转换输出类型可通过可选参数进行控制。

答案 2 :(得分:5)

  

它比mysql或mysqli快。

错误。在现实生活中,它总体上较慢。

  

它具有与多个数据库驱动程序相同的语法。

用于API函数 - 是的,当然。但它不会帮助你使用不同的SQL方言。

  

使用预准备语句,sql注入是安全的。

要获得针对sql注入的保护,四个事项需要正确转义:

  • 字符串
  • 标识符
  • 运营商

虽然PDO仅涵盖前两个。

答案 3 :(得分:3)

我知道的两个缺点:

没有或者不好的Oracle支持!

大型结果集上的一些性能命中。

就我而言,第一个“缺点”是避免Oracle的另一个原因。第二个很少重要。

答案 4 :(得分:0)

我记得在某处读到PDO的一个缺点是它需要更多的查询时间。 (对不起,我没有参考那篇文章),希望有些专家能说出来。