【问题标题】:What are losses with binding all PDO params as PARAM_STR?将所有 PDO 参数绑定为 PARAM_STR 有什么损失?
【发布时间】:2011-07-13 23:39:34
【问题描述】:

我正在为 PHP PDO 创建一个简单的查询构建器,以更快地创建查询,而无需对条件/订单/限制根据某些条件组合在一起的部分进行大量绑定和拆分查询创建过程(如过滤引擎) ,您可以在其中选择一些标准)。我有这样的方法:

$query->addWhere( 'uid', '>' , 100 );

添加 where 条件并将 :uid 绑定到 100,我也可以像这样省略 bindig:

$query->addWhere( 'date', '>' , 'NOW()' , false );

但我不带 100 参数类型的信息。更深入地执行查询,我不做 bindParam 或 bindValue,而是传递我的绑定表来执行:

$stmt->execute( $query->getBinds() );

我的所有参数都被视为 PARAM_STR 还是从数组中的变量类型获取 PDO 类型?我能失去什么?只有性能/内存或可能有一些数据丢失或逻辑错误?

附: 我不想为 params 创建另一个类,因为我想保持简单,我的意思是:

$query->addWhere( new Field('uid') , '=' , new IntParam( 100 ) ); or something

【问题讨论】:

  • 我希望你正在清理输入。

标签: php mysql sql pdo


【解决方案1】:

虽然我在这样的查询构建器中看不到任何好处(你只需要省略几个单词,就会失去尽可能多的从宝贵的 SQL 中编写完全不可读的代码),答案是否定的:没有损失。
只需关闭仿真模式,PDO 就会自动检测必要的类型。

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

【讨论】:

  • 这不是几句话的问题,而是过滤器的问题(非常简化): if ( $_GET['cat'] ) add_category_condition; if ( $_GET['date'] ) add_date_condition; if ( $_GET['orderByPrice'] ) add_orderby_price;最后 $query-> 执行并显示商店中过滤(例如)产品的列表。因此,用户可以混合 N 个条件来查看 M >= N 个可能条件中的产品(排序列表和分页的含义相同)
  • @killer 我可以很好地支持自定义过滤器。但是对于其余的查询,我认为没有理由这样做。而且我认为使用 add_orderby_price 等单独的方法没有任何意义
  • @killer 我宁愿做add_order($field,$arr_allowed,$direction)
  • 我也是,我只是简化了这个。我只是找不到更简单的方法来处理自定义过滤+排序+分页。我不是为单个项目编写此解决方案,而是为内部公司框架编写此解决方案,其中使用(大量字段)CRUD+过滤器+顺序+分页创建模块的速度是最重要的。
猜你喜欢
  • 2012-12-02
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2016-06-29
相关资源
最近更新 更多