Como obtenho apenas um resultado usando db_query ()

28

Estou fazendo a transição dos métodos MySQL 'old school' do PHP mysql_fetch_array(), etc., e estou tentando ser mais drupalizado usando a API do banco de dados em meus módulos.

Eu simplesmente quero retornar e imprimir um valor. Por exemplo:

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

Sei que o valor existe, posso acessá-lo e imprimi-lo usando métodos tradicionais fora da API do banco de dados.

print $query->zip não está funcionando.

A documentação da API é tão clara quanto a lama.

Alguém pode me dizer a maneira correta de acessar esses valores?

Existe um bom tutorial que alguém possa recomendar também?

blue928
fonte

Respostas:

38

Se você deseja obter um único resultado que você poderia usar fetchField com db_querypara buscar o resultado, por exemplo:

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

Você também pode buscar os valores recuperados da fonte de resultados retornada da consulta usando opções como fetchObject () semelhantes aos métodos de mysql_fetch_objectcodificação PHP ( ) convencional, como usar e obter resultados.

optimusprime619
fonte
1
algumas críticas construtivas sobre o downvote seria bastante útil
optimusprime619
Nenhuma das funções ou métodos que você descreve está disponível no Drupal 7. Seu exemplo produzirá um erro fatal. Além disso, você parece estar misturando os códigos Drupal 6 e Drupal 7, daí o voto negativo
Clive
2
@ Clive oops .... corrida do sangue ... bom saber o motivo ... obrigado!
Optimusprime619
1
Não se preocupe, se você resolver a resposta, terei o prazer de remover o voto negativo
Clive
1
@Clive feito isso agora ... :)
optimusprime619
15

Veja como usar a API do banco de dados no Drupal 7 sem escrever uma 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
fonte
9

Você precisa fazer um loop da sua consulta $, não é possível supor que você tenha apenas um resultado com a consulta fornecida acima.

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

Se você souber que possui apenas um resultado, poderá chamar fetchObject na sua consulta ->

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

print $ query-> zip deve então dar o que você deseja.

disrama
fonte
4
Nota: Em vez de codificar um limite, você deve usar db_query_range ().
Berdir
3

eu faria

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

se você deseja exatamente uma linha do conjunto de resultados. Caso contrário, fazer loop com foreach é a melhor opção, conforme sugerido anteriormente.

Valery Lourie
fonte
2

Sei que isso é antigo, mas você pode e deve fazer:

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

Bem, você tem maneiras de fazer isso corretamente na Drupa 7:

  1. db_select - no Drupal, existe uma função que retorna um objeto que você constrói com ele a consulta SQL - https://api.drupal.org/api/drupal/includes%21database%21database.inc/function/db_select/7 . Você tem um método no objeto chamado range. você pode usar isso.

  2. A consulta ao campo de entidade, que é uma classe que constrói uma consulta SQL, inclui: https://www.drupal.org/node/1343708 . Este também é o método range.

Roy Segall
fonte
0

Drupal 7

Use esta consulta para um único resultado:

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

Em vez de usar isso

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

porque gera um aviso.

Rizwan Siddiquee
fonte
-2

Drupal 6

$query será o seu resultado Você precisa buscar valores a partir dele, no seu caso, se buscar apenas 1 linha e 1 coluna, ou seja, zip e, em seguida, obter diretamente

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

$query->zipnão funcionará, pois $ query é o conjunto de resultados, não um objeto carregado ou uma matriz. Então isso deve fazer

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

Nota: db_fetch_arrayé outra API para buscar valores no formato de matriz

GoodSp33d
fonte
1
db_result db_fetch_array e db_fetch_object são para o Drupal 6 e versões anteriores.
Jenlampton 19/05