Как получить только один результат, используя db_query ()


28

Я перехожу из старых методов использования PHP MySQL mysql_fetch_array()и т. Д., И я пытаюсь быть более дружественным, используя Database API в своих модулях.

Я просто хочу вернуть и распечатать значение. Например:

$query = db_query("SELECT zip FROM {zipcodes} WHERE city = :city LIMIT 1", array(":city" => $city));

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

print $query->zip не работает.

Документация по API ясна как грязь.

Может кто-нибудь сказать мне правильный способ доступа к этим значениям?

Есть ли хороший учебник, который кто-нибудь может порекомендовать?

Ответы:


38

Если вы хотите , чтобы принести только один результат , который вы могли бы использовать fetchField с , db_queryчтобы получить результат, например:

$zip_code = db_query("SELECT zip from {zipcodes} WHERE city = :city LIMIT 1", array(":city" => $city))->fetchField();

Вы также можете получить значения, полученные из возвращенного источника результатов запроса, используя такие параметры, как fetchObject (), аналогичные методам обычного mysql_fetch_objectкодирования PHP ( ), например использование и получение результатов.


1
некоторая конструктивная критика в отношении downvote была бы весьма полезна
optimusprime619

Ни одна из описанных вами функций или методов не доступна в Drupal 7. Ваш пример приведет к фатальной ошибке. Кроме того, вы , кажется, смешивания Drupal 6 и Drupal 7 кода, отсюда вниз голосование
Clive

2
@ Клайв ой .... кровавый прилив ... хорошо знать причину, хотя .. спасибо!
optimusprime619

1
Не беспокойтесь, если вы исправите ответ, я с удовольствием уберу это понижение
Клайв

1
@Clive сделал это сейчас ... :)
optimusprime619

15

Вот как использовать API базы данных в Drupal 7 без написания запроса MySQL:

$query = db_select('zipcodes', 'z')
  ->fields('z', array('zip'))
  ->condition('z.city', $city)
  ->range(0, 1)
  ->execute();
$result = $query->fetchObject();
print $result->zip;

9

Вы должны зациклить свой запрос $, вы не можете предполагать, что у вас есть только один результат с вышеуказанным запросом.

foreach ($query as $row) {
  print $row->zip;
}

Если вы знаете, что у вас есть только один результат, вы можете вызвать fetchObject для вашего запроса ->

$query = db_query("select zip from {zipcodes} where city = :city limit 1", array(":city" => $city))->fetchObject();

print $ query-> zip должен затем дать вам то, что вы хотите.


4
Примечание. Вместо жесткого ограничения предела вы должны использовать db_query_range ().
Бердир

3

я бы сделал

$row = (object)db_query('Your SQL here')->fetchAssoc();

если вы хотите ровно одну строку из набора результатов. В противном случае цикл с foreach является лучшим вариантом, как предлагалось ранее.


2

Я знаю, что это старый, но вы можете и должны сделать:

$zip_code = db_select('zipcodes', 'z')
    ->fields('z', array(
        'zip'
    ))
    ->condition('city', $city)
    ->range(0, 1)
    ->execute()
    ->fetchField();

0

Ну, у вас есть способы сделать это правильно в Drupa 7:

  1. db_select - в Drupal есть функция, которая возвращает объект, который вы создаете с его помощью SQL-запроса - https://api.drupal.org/api/drupal/includes%21database%21database.inc/function/db_select/7 . У вас есть метод для объекта под названием range. Вы можете использовать это.

  2. Запрос поля сущности, представляющий собой класс, который создает запрос SQL на объектах: https://www.drupal.org/node/1343708 . Это также есть метод диапазона.


0

Drupal 7

Используйте этот запрос для одного результата:

$zip_code = db_query("SELECT zip from {zipcodes} WHERE city = :city", array(":city" => $city))->fetchField();

Вместо того, чтобы использовать это

$zip_code = db_query("SELECT zip from {zipcodes} WHERE city = :city LIMIT 1", array(":city" => $city))->fetchField();

потому что его генерируют предупреждение.


-2

Drupal 6

$query будет вашим результатом Вам нужно извлечь значения из него, в вашем случае, если он выбирает только 1 строку и 1 столбец, т.е. zip, то получить напрямую

$zip = db_result(db_query("YOUR SQL QUERY"));

$query->zipне будет работать, так как $ query - это набор результатов, а не загруженный объект или массив. Так что это должно сделать

while($row = db_fetch_object($res)){
  $row->zip ; // etc
}

Примечание: db_fetch_arrayэто еще один API для извлечения значений в формате массива


1
db_result db_fetch_array и db_fetch_object предназначены для Drupal 6 и более ранних версий.
Дженламптон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.