如何使用PHP PDO枚举/计算查询中的所有参数?

时间:2014-04-25 18:43:00

标签: php sql pdo

我有以下查询:

$query = "SELECT * FROM a_table WHERE col1=:param1 AND col2=:param2 OR col3=:param3"

PHP PDO(或任何其他东西/库)是否有一些函数列出了此查询中显示的所有参数名称,写出如下内容:

print_r(list_query_parameters($query));

生成如下输出:

Array ( [0] => :param1 [1] => :param2 [2] => :param3 )

1 个答案:

答案 0 :(得分:3)

编辑:答案的最终解决方案(见下文其他替代方案)

<强>功能

function list_query_parameters($query) {
    preg_match_all('/=(:\w+)/', $query, $params, PREG_PATTERN_ORDER);
    return $params[1]
}

用法:

$query = "SELECT * FROM a_table WHERE col1=:param1 AND col2=:param2 OR col3=:param3"
print_r(list_query_parameters($query));

节目输出

Array
(
    [0] => :param1
    [1] => :param2
    [2] => :param3
)

<强> DEMO


您也可以使用debugDumpParams()来获取

$stmt->debugDumpParams();
  

说明

     

public void PDOStatement :: debugDumpParams(void)转储   准备好的声明中直接包含在输出中的信息。   它将提供正在使用的SQL查询,使用的参数数量   (参数),参数列表,其名称,类型(paramtype)为   一个整数,它们的键名或位置,以及查询中的位置   (如果这是PDO驱动程序支持的,否则,它将为-1)。


需要注意的事项:

您只能在运行execute()后获取转储,因此您的代码将如下所示:

$stmt = $pdo->prepare($query)
$stmt->execute($params);
$stmt->debugDumpParams();

debugDumpParams()没有做你真正想要的事。

我刚写了这个应该做你想做的功能。

请注意它快速而且脏:

<强>功能

function list_query_parameters($query) {
$params = explode(":", $query);
unset($params[0]);
foreach ($params as $param) {
    $param = split(" ", $param);
    $result[] = $param[0];
}

return $result;
}

<强>用法:

$query = "SELECT * FROM a_table WHERE col1=:param1 AND col2=:param2 OR col3=:param3"
print_r(list_query_parameters($query));

<强>输出

Array ( [0] => param1 [1] => param2 [2] => param3 ) 

<强> DEMO


使用Regex:

这是ReGex

preg_match_all('/\s*\w+\s*[=<>]\s*\:(\w+)/', $subject, $matches); 
print_r($matches[1]);