2015-12-31 50 views
2

我有一个查询,它不是一直都是......,实际上它会根据一些因素生成。它有时是这样的:如何将参数传递给动态查询?

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。每次我想在查询中使用它时,都需要传递一个单独的参数。像这样:

对于QUERY1:

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

对于QUERY2:

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

对于QUERY3:

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

所以因为我不知道有多少次我需要通过:id参数到查询(因为我的查询是动态的),我该如何解决这个问题?

+0

描述,您可以使用[PDOStatement对象:: debugDumpParams(http://php.net/manual/en/pdostatement.debugdumpparams.php)找到你的参数,正则表达式名称出来,并使用它们在bindValue – zedfoxus

+0

@zedfoxus老实说,我读了你连接了两次,但我仍然不明白那个函数做了什么...... – stack

+0

让我看看我是否可以用你的类似查询来构建一个例子来帮助你更好地理解它。 – zedfoxus

回答

1

您可以将所有的id值存储在数组中并遍历它。

只要所有的值都是同一类型(INT)和你的地方持有人的形式是这样的工作:的ID号:

$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

+0

恩,还不错...!不过,我想我也需要在查询中处理':ParameterName'。无论如何,好的谢谢:-) – stack

+1

看看我发布的链接。如果你可以组装一个数组来保存关于你的参数的名字,类型和值的信息,那么你可以根据你的需要采用代码。 – maxhb