Как выбрать таблицу, используя переменную с помощью запроса к бд()?
Я пытаюсь найти записи из таблицы на основе переменной, полученной из представления пользователя. Это мой запрос:
$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 . '}');
Однако, как я понимаю, это было бы небезопасно.
Кто-нибудь знает, почему первый запрос не будет работать?
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()
документы для более подробных примеров, в том числе для добавления условия для динамического запроса.