Comment obtenir un seul résultat en utilisant db_query ()

28

Je suis en mysql_fetch_array()train de passer des méthodes PHP MySQL «old school» d'utilisation , etc. et j'essaie d'être plus Drupally en utilisant l'API Database dans mes modules.

Je veux simplement retourner et imprimer une valeur. Par exemple:

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

Je sais que la valeur est là, je peux y accéder et l'imprimer en utilisant des méthodes traditionnelles en dehors de l'API de base de données.

print $query->zip ne fonctionne pas.

La documentation de l'API est aussi claire que de la boue.

Quelqu'un peut-il me dire comment accéder correctement à ces valeurs?

Y a-t-il un bon tutoriel que n'importe qui pourrait également recommander?

blue928
la source

Réponses:

38

Si vous souhaitez récupérer un seul résultat, vous pouvez utiliser fetchField avec db_querypour récupérer le résultat, par exemple:

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

Vous pouvez également récupérer les valeurs récupérées à partir de la source de résultats renvoyée par la requête en utilisant des options comme fetchObject () similaires aux méthodes de mysql_fetch_objectcodage PHP ( ) conventionnelles comme l'utilisation et l'obtention des résultats.

optimusprime619
la source
1
quelques critiques constructives sur le downvote seraient plutôt utiles
optimusprime619
Aucune des fonctions ou méthodes que vous décrivez n'est disponible dans Drupal 7. Votre exemple produira une erreur fatale. Vous semblez également mélanger le code Drupal 6 et Drupal 7, d'où le vote
négatif
2
@Clive oups .... ruée vers le sang ... bon de savoir la raison cependant..merci!
optimusprime619
1
Pas de soucis, si vous corrigez la réponse, je supprimerai volontiers le downvote
Clive
1
@Clive l'a fait maintenant ... :)
optimusprime619
15

Voici comment utiliser l'API de base de données dans Drupal 7 sans écrire de requête 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
la source
9

Vous devez boucler votre requête $, vous ne pouvez pas supposer que vous n'avez qu'un seul résultat avec la requête donnée ci-dessus.

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

Si vous savez que vous n'avez qu'un seul résultat, vous pouvez appeler fetchObject sur votre requête ->

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

print $ query-> zip devrait alors vous donner ce que vous voulez.

dysrama
la source
4
Remarque: Au lieu de coder en dur une limite, vous devez utiliser db_query_range ().
Berdir
3

je ferais

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

si vous voulez exactement une ligne de l'ensemble de résultats. Sinon, boucler avec foreach est la meilleure option, comme suggéré précédemment.

Valery Lourie
la source
2

Je sais que c'est vieux, mais vous pouvez et devez faire:

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

Eh bien, vous devez trouver des moyens de le faire correctement dans Drupa 7:

  1. db_select - dans Drupal, il existe une fonction qui retourne un objet que vous construisez avec lui la requête SQL - https://api.drupal.org/api/drupal/includes%21database%21database.inc/function/db_select/7 . Vous avez une méthode sur l'objet appelée plage. tu peux l'utiliser.

  2. Requête de champ d'entité qui est une classe qui construit une requête SQL sur des entites: https://www.drupal.org/node/1343708 . C'est aussi avoir la méthode range.

Roy Segall
la source
0

Drupal 7

Utilisez cette requête pour un résultat unique:

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

Au lieu d'utiliser cela

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

parce que cela génère un avertissement.

Rizwan Siddiquee
la source
-2

Drupal 6

$query sera votre résultat. Vous devez en extraire des valeurs. Dans votre cas, s'il ne récupère qu'une ligne et une colonne, c'est-à-dire zip, alors pour obtenir directement

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

$query->zipne fonctionnera pas car $ query est un jeu de résultats pas un objet chargé ou un tableau. Donc ça devrait faire

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

Remarque: db_fetch_arrayest une autre API pour récupérer des valeurs au format tableau

GoodSp33d
la source
1
db_result db_fetch_array et db_fetch_object sont pour Drupal 6 et versions antérieures.
jenlampton