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?

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.


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;

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.


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.


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();

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.


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.


-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


1
db_result db_fetch_array et db_fetch_object sont pour Drupal 6 et versions antérieures.
jenlampton
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.