Как выбрать таблицу, используя переменную с помощью запроса к бд()?


Я пытаюсь найти записи из таблицы на основе переменной, полученной из представления пользователя. Это мой запрос:

$field = t('field_data_' . variable_get('tabbed_content_field'));
$fieldValue = t(variable_get('tabbed_content_field') . '_value');
$query = db_query('SELECT :fieldValue FROM {:field}', array(':field' => $field, ':fieldValue' => $fieldValue));

Однако всякий раз, когда я запускаю этот запрос, я получаю следующую ошибку:

Исключение PDO: Состояние SQLSTATE[42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на наличие правильного синтаксиса для использования рядом с "field_data_field_news_release_date" по адресу строка 2: ВЫБЕРИТЕ :Значение поля ИЗ {:поле}; Массив ([:поле]=> field_data_field_news_релиз_дата [:Значение поля] => значение field_news_release_date_value)

Я могу успешно получить записи с помощью:

$query = db_query('SELECT ' . $fieldValue . ' FROM { ' . $field . '}');

Однако, как я понимаю, это было бы небезопасно.

Кто-нибудь знает, почему первый запрос не будет работать?

 7
Author: kiamlaluno, 2012-03-27

1 answers

Это одна из причин, по которой в Drupal 7 существует новый конструктор запросов, поэтому вы можете динамически заменять части запроса:

$table_name = 'the_table';
$field_name = 'a_field';
$query = db_select($table_name)->fields($table_name, array($field_name));

Используя db_query(), вы получаете только замену параметров, которая будет применима только к заменам в условиях WHERE. Это означает, что вы не можете использовать db_query() для замены имен таблиц, названий выбранных полей и т.д., только условия WHERE.

Взгляните на db_select() документы для более подробных примеров, в том числе для добавления условия для динамического запроса.

 6
Author: Clive, 2012-03-27 13:41:08