Wie erhalte ich mit db_query () nur ein Ergebnis?

28

Ich mysql_fetch_array()wechsle von "alten" PHP-MySQL-Methoden usw. und versuche, durch die Verwendung der Datenbank-API in meinen Modulen mehr Drupalität zu erreichen.

Ich möchte einfach einen Wert zurückgeben und ausdrucken. Beispielsweise:

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

Ich weiß, dass der Wert vorhanden ist. Ich kann auf ihn zugreifen und ihn ausdrucken, indem ich traditionelle Methoden außerhalb der Datenbank-API verwende.

print $query->zip funktioniert nicht.

Die API-Dokumentation ist so klar wie Schlamm.

Kann mir jemand sagen, wie ich richtig auf diese Werte zugreifen kann?

Gibt es ein gutes Tutorial, das jeder empfehlen kann?

blue928
quelle

Antworten:

38

Wenn Sie nur ein Ergebnis holen wollen könnten Sie fetchField mit db_querydem Ergebnis zu holen, zum Beispiel:

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

Sie können auch die Werte abrufen, die aus der zurückgegebenen Ergebnisquelle der Abfrage abgerufen wurden, indem Sie Optionen wie fetchObject () verwenden , die den Methoden herkömmlicher PHP ( mysql_fetch_object) - Codierung wie using and get results ähneln .

optimusprime619
quelle
1
eine konstruktive kritik an der downvote wäre eher nützlich
optimusprime619
Keine der von Ihnen beschriebenen Funktionen oder Methoden ist in Drupal 7 verfügbar. Ihr Beispiel führt zu einem schwerwiegenden Fehler. Außerdem scheinen Sie Drupal 6- und Drupal 7-Code zu mischen, daher die Abstimmung nach unten
Clive
2
@Clive oops .... Blutrausch ... gut zu wissen, den Grund aber .. danke!
Optimusprime619
1
Keine Sorge, wenn Sie die Antwort korrigieren, entferne ich gerne die Ablehnung
Clive
1
@Clive es jetzt getan ... :)
optimusprime619
15

So verwenden Sie die Datenbank-API in Drupal 7, ohne eine MySQL-Abfrage zu schreiben:

$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
quelle
9

Sie müssen Ihre $ -Abfrage in einer Schleife ausführen. Sie können jedoch nicht davon ausgehen, dass Sie mit der oben angegebenen Abfrage nur ein Ergebnis haben.

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

Wenn Sie wissen, dass Sie nur ein Ergebnis haben, können Sie fetchObject für Ihre Abfrage aufrufen ->

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

print $ query-> zip sollte dir dann geben, was du willst.

Dysrama
quelle
4
Hinweis: Anstatt ein Limit fest zu codieren, sollten Sie db_query_range () verwenden.
Berdir
3

Würde ich tun

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

wenn Sie genau eine Zeile aus der Ergebnismenge wollen. Andernfalls ist eine Schleife mit foreach die beste Option, wie zuvor vorgeschlagen.

Valery Lourie
quelle
2

Ich weiß, dass dies alt ist, aber Sie können und sollten Folgendes tun:

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

Nun, in Drupa 7 müssen Sie Möglichkeiten haben, dies richtig zu tun:

  1. db_select - In Drupal gibt es eine Funktion, die ein Objekt zurückgibt, das Sie mit der SQL-Abfrage zusammen erstellen . Sie haben eine Methode für das Objekt namens range. du kannst es benutzen.

  2. Entitätsfeldabfrage, die eine Klasse ist, die eine SQL-Abfrage nach Entitäten erstellt: https://www.drupal.org/node/1343708 . Dies ist auch die Range-Methode.

Roy Segall
quelle
0

Drupal 7

Verwenden Sie diese Abfrage für ein einzelnes Ergebnis:

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

Anstatt dies zu benutzen

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

weil seine Warnung erzeugen.

Rizwan Siddiquee
quelle
-2

Drupal 6

$query wird Ihr Ergebnis sein. Sie müssen Werte davon abrufen. In Ihrem Fall. Wenn es nur 1 Zeile und 1 Spalte abruft, dh zip, dann, um direkt zu erhalten

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

$query->zipfunktioniert nicht, da $ query keine Ergebnismenge, kein geladenes Objekt oder Array ist. Das sollte also reichen

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

Hinweis: db_fetch_arrayist eine weitere API zum Abrufen von Werten im Array-Format

GoodSp33d
quelle
1
db_result db_fetch_array und db_fetch_object sind für Drupal 6 und früher.
Jenlampton