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.