PDO的缺点(PHP数据对象)

Mar*_*rio 19 php pdo

到目前为止我所读到的关于PDO(PHP数据对象)的所有内容实在太好了.

我的意思是:

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

但是PDO的缺点是什么?

Ber*_*rak 15

到目前为止我所读到的关于PDO(PHP数据对象)的所有内容实在太好了.

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

它比mysql或mysqli更快.

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

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

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

使用预处理语句,sql注入是安全的.

您也可以使用mysqli准备语句,因此我认为这不是一个明确的优势.我通常使用预处理语句,我喜欢PDO提供的:field语法.

但PDO的缺点在哪里,有这么多专业人士的东西也必须具有矛盾性.

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

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


nsa*_*ers 5

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

简单的例子:

CREATE TABLE :bar (rowId int)

SELECT :foo FROM :bar
Run Code Online (Sandbox Code Playgroud)

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

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

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

$db->query( "SELECT {$foo} FROM {$bar}" );
Run Code Online (Sandbox Code Playgroud)

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

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

array( 'rowId' => '1', 'name' => 'Fred', 'age' => '12' );
Run Code Online (Sandbox Code Playgroud)

代替:

array( 'rowId' => 1, 'name' => 'Fred', 'age' => 12 );
Run Code Online (Sandbox Code Playgroud)

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

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

{ "rowId": "1", "name": "Fred", "age": "12" }
Run Code Online (Sandbox Code Playgroud)

代替

{ "rowId": 1, "name": "Fred", "age": 12 }
Run Code Online (Sandbox Code Playgroud)

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


You*_*nse 5

它比mysql或mysqli更快.

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

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

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

使用预处理语句,sql注入是安全的.

为了防止sql注入,需要正确转义四个问题:

  • 字符串
  • 数字
  • 身份标识
  • 运营商

而PDO仅涵盖前两个.