¿Cómo obtengo solo un resultado usando db_query ()

28

mysql_fetch_array()Estoy haciendo la transición de los métodos de uso de MySQL PHP de la 'vieja escuela' , etc. y estoy tratando de ser más Drupally usando la API de base de datos en mis módulos.

Simplemente quiero regresar e imprimir un valor. Por ejemplo:

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

Sé que el valor está ahí, puedo acceder e imprimirlo utilizando métodos tradicionales fuera de la API de la base de datos.

print $query->zip no está trabajando.

La documentación API es tan clara como el barro.

¿Alguien puede decirme la forma correcta de acceder a estos valores?

¿Hay algún buen tutorial que alguien pueda recomendar también?

blue928
fuente

Respuestas:

38

Si desea obtener solo un resultado, puede usar fetchField con db_querypara obtener el resultado, por ejemplo:

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

También puede obtener los valores recuperados de la fuente de resultados devueltos de la consulta utilizando opciones como fetchObject () similares a los métodos de mysql_fetch_objectcodificación PHP ( ) convencional como el uso y obtener resultados.

optimusprime619
fuente
1
algunas críticas constructivas sobre el voto a favor serían bastante útiles
optimusprime619
Ninguna de las funciones o métodos que describe están disponibles en Drupal 7. Su ejemplo producirá un error fatal. También parece que estás mezclando el código Drupal 6 y Drupal 7, de ahí el voto
negativo
2
@Clive Uy ... la fiebre de la sangre ... aunque es bueno saber la razón ... ¡Gracias!
optimusprime619
1
No se preocupe, si arregla la respuesta, con mucho gusto eliminaré el voto negativo
Clive
1
@Clive lo hizo ahora ... :)
optimusprime619
15

Aquí le mostramos cómo usar la API de base de datos en Drupal 7 sin escribir una consulta 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
fuente
9

Tiene que repetir su consulta $, no puede suponer que solo tiene un resultado con la consulta dada anteriormente.

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

Si sabe que solo tiene un resultado, puede llamar a fetchObject en su consulta ->

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

print $ query-> zip debería darte lo que quieres.

disrama
fuente
44
Nota: en lugar de codificar un límite, debe usar db_query_range ().
Berdir
3

yo lo haría

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

si desea exactamente una fila del conjunto de resultados. De lo contrario, recorrer con foreach es la mejor opción, como se sugirió anteriormente.

Valery Lourie
fuente
2

Sé que esto es viejo, pero puedes y debes hacer:

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

Bueno, tienes formas de hacer esto correctamente en Drupa 7:

  1. db_select: en Drupal hay una función que devuelve un objeto que construye con él la consulta SQL: https://api.drupal.org/api/drupal/includes%21database%21database.inc/function/db_select/7 . Tiene un método en el objeto llamado rango. puedes usarlo.

  2. Consulta de campo de entidad que es una clase que construye una consulta SQL sobre entidades: https://www.drupal.org/node/1343708 . Esto también tiene el método de rango.

Roy Segall
fuente
0

Drupal 7

Utilice esta consulta para un solo resultado:

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

En lugar de usar esto

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

porque genera advertencia.

Rizwan Siddiquee
fuente
-2

Drupal 6

$query será su resultado. Debe obtener valores de él. En su caso, si obtiene solo 1 fila y 1 columna, es decir, zip, para obtener directamente

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

$query->zipno funcionará ya que $ query es un conjunto de resultados, no un objeto cargado o una matriz. Entonces esto debería hacer

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

Nota: db_fetch_arrayes otra API para recuperar valores en formato de matriz

GoodSp33d
fuente
1
db_result db_fetch_array y db_fetch_object son para Drupal 6 y versiones anteriores.
jenlampton