2014-11-05 103 views
3

我使用一个循环来处理一些查询和所有查询都是一样的,除了一个不使用参数的其他人:是否可以统计PDO准备语句中的参数数量?

$queries = array(
    'query1' = "SELECT * FROM table_1 WHERE id=:id", 
    'query2' = "SELECT * FROM table_2 WHERE id=:id", 
    'query3' = "SELECT * FROM table_3" 
); 

$params = array(':id',1); 

foreach($queries as $q) { 
    $st = $pdo->prepare($q); 
    if($st->execute($params)) { 
    // do stuff with results 
    } else { 
    echo json_encode($st->errorInfo()); 
    } 
} 

这里的问题是,$ ST->执行($ params)在没有定义参数的查询上不起作用,这就是为什么我想知道在发送之前是否可以分析查询的原因。

这是假代码,只要有一个参数(:id)或none,它应该工作而不管查询结构如何。

更新,解决了:

我如何申请通过@ Jonast92给出了解决方案:

foreach($queries as $q) { 
    $st = $pdo->prepare($q); 
    if($st->execute(substr_count($q,":") > 0 ? $params : null)) { 
    // do stuff with results 
    } else { 
    echo json_encode($st->errorInfo()); 
    } 
} 
+0

你正在写这些查询在数组中提前,对吧?为什么不制作另一个包含params数量的数组?因此,您只需根据您尝试运行哪个查询来查找数组。 – 2014-11-05 22:01:24

+0

这应该是有点动态的,但这个和下面的答案的组合应该工作。谢谢。 – vcanales 2014-11-05 22:03:19

+1

另一种方法是指定'where 1:= id or 1 = 1',基本上颠覆参数。 – 2014-11-05 22:07:36

回答

3

您可以使用substr_count来算的:数量发生,且是参数的个数执行到准备好的声明。

$itemInArray = "SELECT * FROM table_1 WHERE id=:id"; 
$count = substr_count($itemInArray, ':'); // 1 
+0

我不知道为什么我没有想到这一点。漫长的一天,我猜。我会在10分钟过去后接受答案。谢谢。 – vcanales 2014-11-05 22:04:07

+0

@devJunk享受。 – Jonast92 2014-11-05 22:04:41