Як отримати лише один результат за допомогою db_query ()


28

Я mysql_fetch_array()переходжу від «старої школи» методів використання PHP MySQL тощо, і я намагаюся бути більше Drupally, використовуючи 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
деяка конструктивна критика на низовій дорозі була б досить корисною
optimusprime619

Жодна з описаних вами функцій або методів не доступна в Drupal 7. Ваш приклад призведе до фатальної помилки. Також вам здається, що ви змішуєте код Drupal 6 та Drupal 7, отже, голос вниз
Клайв

2
@Clive oops .... кров приплив ... добре знати причину, хоча ... дякую!
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 . У вас є метод на об'єкті, який називається діапазон. ви можете використовувати його.

  2. Запит поля entity - клас, який будує 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

Друпал 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.