В Kohana 3 теперь можно связывать именованные параметры в запросах, но как мне избежать тех, которые я не могу связать?

StackOverflow https://stackoverflow.com/questions/2204149

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top