我有以下查询:
$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 )
答案 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]);