到目前为止,我读到的关于PDO(PHP数据对象)的所有内容都非常好,不可能成真。
我的意思是:
但是PDO的缺点是什么?
答案 0 :(得分:15)
到目前为止,我读到的关于PDO(PHP数据对象)的所有内容都非常好,不可能成真。
我每天都使用PDO,这是有原因的。我确实在它上面写了一个包装器,因为默认的PDO实例做了我不喜欢的事情(例如,无声地失败),并且API可能已经好多了。使用常量配置不是我的默认方法。另外,我已经创建了一些方便的方法。
是吗?我不知道你在哪里选择它,它可能是真的,但我没有听说过PDO比原生MySQL库更快。它比mysql或mysqli快。
它具有与多个数据库驱动程序相同的语法。
排序。我经常使用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的一个缺点是它需要更多的查询时间。 (对不起,我没有参考那篇文章),希望有些专家能说出来。