【问题标题】:How to pass parameters to a dynamic query?如何将参数传递给动态查询?
【发布时间】:2015-12-31 12:41:59
【问题描述】:

我有一个不是一直不变的查询...,实际上它会根据某些因素生成。有时是这样的:

select * from table1 where id = :id

有时可能是这样的:

select * from table1 where id = :id
    union all
select * from table2 where id = :id

有时可能是这样的:

select * from table1 where id = :id
    union all
select * from table2 where id = :id
    union all
select * from table3 where id = :id

已经: 到目前为止,我使用的 PHP 版本是 5.2.6,它完全没问题。我的意思是,我只传递了一次:id 参数,我可以在查询中多次使用它。就是这样:

$stm->bindValue(':id', $id, PDO::PARAM_INT);

这个 ^ 对上述所有查询都有好处。


现在:我已经更新了我的 PHP 版本(我当前的 PHP 版本是 5.6.8)。好吧,如您所知,在新版本中,I cannot do that like former。每次我想在查询中使用它时,我都需要传递一个单独的参数。像这样:

对于查询1:

$stm->bindValue(':id', $id, PDO::PARAM_INT);

对于查询2:

$stm->bindValue(':id1', $id, PDO::PARAM_INT);
$stm->bindValue(':id2', $id, PDO::PARAM_INT);

对于查询3:

$stm->bindValue(':id1', $id, PDO::PARAM_INT);
$stm->bindValue(':id2', $id, PDO::PARAM_INT);
$stm->bindValue(':id3', $id, PDO::PARAM_INT);

所以鉴于我不知道需要将:id 参数传递给查询多少次(因为我的查询是动态的),我该如何解决这个问题?

【问题讨论】:

  • 您可以使用PDOStatement::debugDumpParams 来查找您的参数,输出正则表达式参数名称并在 bindValue 中使用它们
  • @zedfoxus 老实说,我阅读了您链接的内容两次,但我仍然无法理解该函数的作用......
  • 让我看看是否可以构建一个与您的查询类似的示例,以帮助更好地理解它。
  • 当我开始创建示例时,我意识到我对 debugDumpParams 的理解是错误的,它并不能解决您的问题。所以我很抱歉把你引向错误的方向。 maxhb 的回答很不错。您如何创建动态查询?您是循环变量还是执行 if..then 来构建查询?
  • @zedfoxus 啊我明白了,不用道歉......!是的,也许我使用 maxhb 的答案。无论如何,谢谢您的关注。

标签: php mysql pdo parameter-passing


【解决方案1】:

您可以将所有 id 值存储在一个数组中并对其进行迭代。

只要所有值都属于同一类型 (int) 并且您的占位符的格式为 :idNUMBER:

,这将起作用
$ids = array('what','ever');
for($c=0;$c<count($ids);$c++) {
  $stm->bindValue(':id' . ($c+1), $ids[$c], PDO::PARAM_INT);
}

不是很优雅,但可以胜任。

http://www.pontikis.net/blog/dynamically-bind_param-array-mysqli 描述了一种甚至处理不同类型的解决方案

【讨论】:

  • emm,还不错……!但是我认为我也需要在查询中处理那些:ParameterName。无论如何,好的,谢谢:-)
  • 看看我发布的链接。如果您可以组装一个包含有关参数名称、类型和值的信息的数组,那么您可以根据需要采用代码。
猜你喜欢
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2018-09-30
相关资源
最近更新 更多