Работа функционала автодополнения имен таблиц префиксами в тексте запросов к базе данных?

Во многих системах используется функционал автодополнения имен таблиц префиксами в тексте запросов к с базе данных. Предполагается, что работать это должно примерно так: если нам нужно выполнить запрос и автоматически дополнить имена таблиц в нём префиксами используемыми в системе, то мы в тексте запроса просто специальным образом обрамляем имя таблицы в тексте запроса. Чаще всего используется синтаксис {имя_таблицы}.

Собственно, всё бы хорошо, только мне не даёт покоя такой вопрос: если в тексте запроса встретятся символы обрамления не связанные с именем таблицы, то как избежать их замены?
Может быть я просто некорректно понял работу функций дополнения, но возьмём например функцию 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')


В чём загвоздка? Как этого избежать?
  • Вопрос задан
  • 2688 просмотров
Пригласить эксперта
Ответы на вопрос 1
Snickersmix
@Snickersmix
Web-разработчик
дополнительно обрабатывать передаваемые данные функцией htmlspecialchars.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы