Jak uzyskać tylko jeden wynik za pomocą db_query ()

28

mysql_fetch_array()Przechodzę ze „starej szkoły” metod PHP MySQL itp. I staram się być bardziej Drupally, używając API bazy danych w moich modułach.

Chcę po prostu zwrócić i wydrukować wartość. Na przykład:

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

Wiem, że wartość tam jest, mogę uzyskać do niej dostęp i wydrukować ją przy użyciu tradycyjnych metod poza interfejsem API bazy danych.

print $query->zip nie działa.

Dokumentacja API jest tak przejrzysta jak błoto.

Czy ktoś może mi powiedzieć, w jaki sposób uzyskać dostęp do tych wartości?

Czy jest też dobry samouczek, który ktoś mógłby polecić?

blue928
źródło

Odpowiedzi:

38

Jeśli chcesz pobrać tylko jeden wynik można użyć fetchField z db_queryprzynieść wynik, na przykład:

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

Możesz również pobrać wartości pobrane ze źródła wyników zapytania, używając opcji takich jak fetchObject () podobnych do metod tradycyjnego mysql_fetch_objectkodowania PHP ( ), takich jak używanie i uzyskiwanie wyników.

optimusprime619
źródło
1
użyteczne byłoby trochę konstruktywnej krytyki opinii negatywnej
optimusprime619
Żadna z opisanych tu funkcji ani metod nie jest dostępna w Drupal 7. Twój przykład spowoduje błąd krytyczny. Wygląda na to, że miksujesz kod Drupala 6 i Drupala 7, stąd głosowanie w dół
Clive
2
@Clive oops .... przypływ krwi ... dobrze znać powód ... dzięki!
optimusprime619
1
Nie martw się, jeśli naprawisz odpowiedź, chętnie usunę głos negatywny
Clive
1
@Clive zrobił to teraz ... :)
optimusprime619
15

Oto jak korzystać z interfejsu API bazy danych w Drupal 7 bez pisania zapytania MySQL:

$query = db_select('zipcodes', 'z')
  ->fields('z', array('zip'))
  ->condition('z.city', $city)
  ->range(0, 1)
  ->execute();
$result = $query->fetchObject();
print $result->zip;
tyler.frankenstein
źródło
9

Musisz zapętlić swoje zapytanie $, nie możesz przypuszczać, że masz tylko jeden wynik dla powyższego zapytania.

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

Jeśli wiesz, że masz tylko jeden wynik, możesz wywołać fetchObject w swoim zapytaniu ->

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

print $ query-> zip powinien dać ci to, czego chcesz.

dysrama
źródło
4
Uwaga: Zamiast sztywno kodować limit, powinieneś użyć db_query_range ().
Berdir
3

chciałbym zrobić

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

jeśli chcesz dokładnie jeden wiersz z zestawu wyników. W przeciwnym razie, jak sugerowano wcześniej, najlepszym rozwiązaniem jest zapętlenie z foreach.

Valery Lourie
źródło
2

Wiem, że to stare, ale możesz i powinieneś zrobić:

$zip_code = db_select('zipcodes', 'z')
    ->fields('z', array(
        'zip'
    ))
    ->condition('city', $city)
    ->range(0, 1)
    ->execute()
    ->fetchField();
Kartagis
źródło
0

Cóż, musisz dokładnie to zrobić w Drupa 7:

  1. db_select - w Drupal jest funkcja, która zwraca obiekt, który razem z nim budujesz, zapytanie SQL - https://api.drupal.org/api/drupal/includes%21database%21database.inc/function/db_select/7 . Masz metodę na obiekcie o nazwie range. możesz tego użyć.

  2. Kwerenda pola encji, która jest klasą, która konstruuje zapytanie SQL na entites: https://www.drupal.org/node/1343708 . Jest to również metoda zasięgu.

Roy Segall
źródło
0

Drupal 7

Użyj tego zapytania do pojedynczego wyniku:

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

Zamiast tego używać

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

ponieważ generuje ostrzeżenie.

Rizwan Siddiquee
źródło
-2

Drupal 6

$query będzie twój wynik Musisz pobrać z niego wartości, W twoim przypadku Jeśli pobierze tylko 1 wiersz i 1 kolumnę, tj. zip, to uzyskaj bezpośrednio

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

$query->zipnie będzie działać, ponieważ $ zapytanie jest zestawem wyników, a nie załadowanym obiektem lub tablicą. To powinno wystarczyć

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

Uwaga: db_fetch_arrayjest innym API do pobierania wartości w formacie tablicowym

GoodSp33d
źródło
1
db_result db_fetch_array i db_fetch_object są dla Drupal 6 i wcześniejszych.
jenlampton