Во многих системах используется функционал автодополнения имен таблиц префиксами в тексте запросов к с базе данных. Предполагается, что работать это должно примерно так: если нам нужно выполнить запрос и автоматически дополнить имена таблиц в нём префиксами используемыми в системе, то мы в тексте запроса просто специальным образом обрамляем имя таблицы в тексте запроса. Чаще всего используется синтаксис
{имя_таблицы}.
Собственно, всё бы хорошо, только мне не даёт покоя такой вопрос: если в тексте запроса встретятся символы обрамления не связанные с именем таблицы, то как избежать их замены?
Может быть я просто некорректно понял работу функций дополнения, но возьмём например функцию
db_prefix_tables из распространённой
CMS Drupal:
function db_prefix_tables($sql) {
global $db_prefix;
if (is_array($db_prefix)) {
if (array_key_exists('default', $db_prefix)) {
$tmp = $db_prefix;
unset($tmp['default']);
foreach ($tmp as $key => $val) {
$sql = strtr($sql, array('{'. $key .'}' => $val . $key));
}
return strtr($sql, array('{' => $db_prefix['default'], '}' => ''));
}
else {
foreach ($db_prefix as $key => $val) {
$sql = strtr($sql, array('{'. $key .'}' => $val . $key));
}
return strtr($sql, array('{' => '', '}' => ''));
}
}
else {
return strtr($sql, array('{' => $db_prefix, '}' => ''));
}
}
Допустим на вход подаётся запрос добавления строки вида:
INSERT INTO {table} VALUES(1, 'username', '}{aKeP')
На выходе получим:
INSERT INTO PREFIX_table VALUES(1, 'username', 'PREFIX_aKeP')
В чём загвоздка? Как этого избежать?