我使用参数化查询,如下所示:
SELECT * FROM foo WHERE bar = :p0 AND baz = :p1
我的参数名称采用以下形式:
^:[a-z]'d+$
我目前正在扩展PDOStatement
,以提供一种转储完全构造的查询的方法,因为PDOStatement::queryString
没有替换绑定参数值。
将查询中的这些参数与正则表达式进行匹配的最准确方法是什么
一个不那么准确的初始尝试:
$sql = "SELECT * FROM foo WHERE bar = 'bar:a0bar :u2 barbar :w4' AND baz = :q2 AND boz IN (:z6, :yy1, :q, :r22, :b7)";
$matches = array();
preg_match_all('/(:[a-z]'d+)'b/', $sql, $matches);
$params = $matches[1];
这失败了,因为字符串中的参数是匹配的,但我不确定避免这种情况是否可行。
请记住,我非常清楚,没有任何方法是100%准确的,这只是为了将构建的查询转储到日志文件中以帮助调试,因此生成的查询不会发送到数据库中执行
当我使用PDO时,我会传递一个绑定参数数组,然后我可以将SQL语句和数组记录在一起。
如果尝试将参数替换到SQL语句中,结果将不会考虑PDO将对参数执行的任何转义操作。
我相信我目前使用的解决方案可能是最实用的。任何超出这个范围的事情似乎都会增加不必要的复杂性。