В Kohana 3 теперь вы можете связывать именованные параметры в запросах, но как мне избежать тех, которые я не могу связать? - PullRequest
0 голосов
/ 05 февраля 2010

В Kohana 3 я могу связать параметр в запросе так:

$query = 'SELECT name FROM users WHERE id = :id';

Это аккуратно, но иногда я хочу, чтобы другие вещи можно было настраивать, например, имя таблицы. Когда я использую именованный параметр для имени таблицы, происходит сбой. Я только что строил нить в этих обстоятельствах.

У меня вопрос, как я могу избежать потенциально плохих символов при построении строк такого типа? В Kohana 2.x вы могли бы сделать $this->db->escape(), но, поскольку Kohana 3 радикально отличается, я мог бы представить, что есть новый способ?

Ответы [ 2 ]

5 голосов
/ 05 февраля 2010

Просто чтобы добавить к ответу Марка Байерса, причина неудачной параметризации имени таблицы состоит в том, что параметры экранируются как значения , а имя таблицы - идентификатор . Вероятно, происходит то, что имя таблицы заключено в кавычки, а вместо этого оно должно быть заключено в обратные кавычки.

Однако, как говорит Марк, необходимость избегать имен таблиц предполагает плохой дизайн. Они должны быть либо жестко запрограммированы, либо сохранены в каком-либо файле конфигурации, содержимому которого можно доверять, чтобы в любом случае не требовалось экранирования. Попытка охватить все ваши базы до такой степени, чтобы вы не доверяли своей конфигурации, скорее всего, пустая трата времени.

4 голосов
/ 05 февраля 2010

Я никогда не использовал кохану, поэтому извиняюсь, если этот комментарий совершенно не имеет значения, но у меня есть несколько комментариев о том, что вы пытаетесь сделать:

Когда я использую именованный параметр для имени таблицы, происходит сбой.

Я предполагаю, что это потому, что он основан на механизме параметров базовой базы данных, и я не знаю ни одной базы данных, которая позволяла бы указывать имя таблицы как параметр в запросе. Так что да, скорее всего вам придется самим строить строку.

как я могу избежать потенциально плохих символов при построении строк такого типа?

Этот вопрос кажется странным ... либо у вас есть потенциально плохие символы в некоторых именах таблиц ... если так, то почему? Или же вы получаете имя таблицы из ненадежного источника (пользователя?). Это звучит как плохая идея для меня. Что если они попытаются прочитать из таблицы, к которой у них не должно было быть доступа? Не лучше ли иметь четко определенный список допустимых имен таблиц и проверить, что таблица существует в этом списке, вместо того, чтобы избегать потенциально неправильных имен таблиц?

И у меня есть одно последнее замечание: если вы можете изменить имя таблицы в запросе, и оно все еще работает, это, возможно, признак того, что ваша база данных не нормализована правильно. Возможно, вы могли бы объединить свои таблицы и добавить дополнительный столбец с информацией о группировке и использовать предложение WHERE для выбора нужных данных? Мне нужно знать больше о вашей модели, чтобы предложить что-то более конкретное.

Я не уверен, поможет ли это вообще ответить на ваш вопрос, но это были мои мысли при чтении вашего вопроса. Я надеюсь, что вы можете использовать некоторые из них.

...