Я работаю над простым отладчиком SQL, который будет принимать параметризованные переменные и попытаться их заменить соответственно, чтобы, если у части SQL возникла проблема, я могу скопировать + вставить ее прямо в мою RDBMS для работы с запросом и, надеюсь, быстрее отладить проблему.preg_replace() заменяет слишком много
До сих пор я по существу есть, но это меняет слишком много:
<?php
$sql = "select *
from table_name
where comment like :a and
email = :b and
status = :c";
$patterns = array();
$patterns[0] = '/:a/';
$patterns[1] = '/:b/';
$patterns[2] = '/:c/';
$replacements = array();
$replacements[0] = "'%that is a nice :b but this one%'";
$replacements[1] = "'[email protected]'";
$replacements[2] = "'active'";
echo preg_replace($patterns, $replacements, $sql);
Результирующее в
select *
from table_name
where comment like '%that is a nice '[email protected]' but this one%' and
email = '[email protected]' and
status = 'active'
Обратите внимание, что '[email protected]'
от позиции 1 делает его в :b
из положения 0.
Я нашел этот вопрос, Can preg_replace make multiple search and replace operations in one shot?, но я не могу сделать головы или хвосты, потому что я уверен y no regex expert.
Обновление. Просто хотел поделиться конечный продукт:
function debug_sql($sql = NULL, $params = NULL)
{
return (
$sql !== NULL && is_array($params) && $params ? // $sql and $params is required
strtr(// Feed this function the sql and the params which need to be replaced
$sql,
array_map(// Replace single-quotes within the param items with two single-quotes and surround param in single-quotes
function($p)
{
return "'".str_replace("'", "''", $p)."'"; // Basic Oracle escaping
},
$params
)
) :
$sql
);
}
Вопрос, который вы нашли, также использует несколько раундов замены, один за другим, так что это вам не поможет. Возможным решением было бы сделать это в 2 раундах: сначала замените заполнители каким-то хеш-заполнителем, который никогда не появится, а затем замените их вашими новыми строками. Обратите внимание, что вам понадобятся также разрывы слов вокруг строк шаблонов, поскольку заполнители могут быть ': b',': bb' и т. Д. – jeroen
@jeroen Это фантастическое звучащее решение моей проблемы; двойная замена с помощью хэш-раунда. К счастью, я на шаг впереди с проблемой ': b' и': bb', о которой вы указали. Я сортирую параметры с помощью 'strlen()' их ключа, чтобы они всегда были заменены в следующем порядке: '$ patterns [0] = '/: bb /'; $ patterns [1] = '/: b /'; ' – MonkeyZeus
@jeroen Благодарим вас за отличное предложение. Я написал ответ ниже. Если у вас есть какая-то минута, я, конечно же, буду рад получить ваши отзывы о любых проблемах, которые вы могли бы обнаружить, чего я не знаю. В частности, будет ли мой «хеш» уникальным для обозримого будущего. – MonkeyZeus