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?

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.


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;

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.


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.


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

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.


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.


-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


1
db_result db_fetch_array e db_fetch_object são para o Drupal 6 e versões anteriores.
— Jenlampton 19/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.