+6

Formas de manipular os dados de uma busca MySQL

criado por David Bittencourt em 05/12/2003 10:00am
MYSQL_FETCH_ARRAY()

O padrão desta função é buscar o resultado de uma linha e o colocar numa matriz associativa e numérica combinada. Eu digo que é o padrão, pois ela tem um segundo argumento opcional.

array mysql_fetch_array ( resource result [, int result_type])

O segundo argumento 'result_type' pode receber os valores das seguintes constantes:

MYSQL_ASSOC - retornará uma matriz associativa (o mesmo que executar mysql_fetch_assoc()).

MYSQL_NUM - retornará uma matriz numérica (o mesmo que executar mysql_fetch_row()).

MYSQL_BOTH - retornará ambas as matrizes, combinadas (é o padrão do argumento).

Neste caso, se executamos a seguinte busca:

<?php
$result = mysql_query("SELECT * FROM tabela1 WHERE id=1");
?>

E chamamos a função mysql_fetch_array() da seguinte maneira:

<?php
$arr = mysql_fetch_array($result); // padrão - MYSQL_BOTH

// $arr terá os seguintes valores
$arr = array(
    0 => 1,
    "id" => 1,
    1 => "Fulano",
    "nome" => "Fulano",
    2 => "fulano@prov.com.br",
    "email" => "fulano@prov.com.br",
    3 => "Campinas",
    "cidade" => "Campinas"
);

// se quisermos o nome da pessoa temos duas opções
echo $arr[1];

// ou 
echo $arr["nome"];

?>

Ela nos dá mais liberdade, mas lembre-se que o resultado virá em dobro. E ainda há o alerta com relação à repetição dos nomes dos campos. Neste caso basta utilizar, como foi explicado antes, o recurso de apelidos (alias).

Até agora não mostrei como guardar este resultado numa variável. Esta minha explicação servirá de base para mostrar um problema que pode ocorrer ao utilizar esta função.

Se executamos a seguinte busca:

<?php
$result = mysql_query("SELECT * FROM tabela1");
?>

Teremos as três linhas como resultado. Vamos então linha por linha para obtermos todos os dados e assim guardá-los na variável $myarr:

<?php

$myarr = array(); // vazia

while ($arr = mysql_fetch_array($result)) {
    $myarr[] = $arr;
}

?>

Ao fazer isto, cada linha terá uma chave na matriz $myarr, ou seja:

<?php

// $myarr terá os seguintes valores:
$myarr = array (
     0 => array (    // primeira linha     
         0 => 1,
         "id" => 1,
         1 => "Fulano",
         "nome" => "Fulano",
         2 => "fulano@prov.com.br",
         "email" => "fulano@prov.com.br",
         3 => "Campinas",
         "cidade" => "Campinas"
     ),
     
     1 => array (    // segunda linha 
         0 => 2,
         "id" => 2,
         1 => "Beltrano",
         "nome" => "Beltrano",
         // ... e assim sucessivamente...
     ),

     2 => array (    // terceira linha
         //...
     )                              
);

// se quisermos o nome da primeira pessoa
echo $myarr[0]["nome"];

// ou
echo $myarr[0][1];

// se quisermos o email da terceira pessoa
echo $myarr[2]["email"];

// ou
echo $myarr[2][2];

?>

Você já pode perceber um problema nesta última linha. É necessário muito controle para utilizar somente chaves numéricas.

Veja como você pode exibir este resultado após guardá-lo na variável $myarr.

<?php

for ($a = 0; $a < count($myarr); $a++) {
    echo $myarr[$a]["nome"];
    echo "<BR>";
}

?>

Exibirá na tela:

Fulano
Beltrano
Siclano

E ainda continuaremos com os dados disponíveis para utiliza-los novamente.

O problema reside no seguinte caso: queremos exibir todas as colunas do resultado independente de quais sejam eles.

<?php

for ($a = 0; $a < count($myarr); $a++) {

    echo "LINHA: " . ($a+1) . "<BR>";

    foreach ($myarr[$a] as $coluna => $valor) {
        echo $coluna . " = " . $valor . "<BR>";
    }

    echo "<BR>";

}
?>

Este código exibirá na tela o seguinte:

LINHA: 1
0 = 1
id = 1
1 = Fulano
nome = Fulano
2 = fulano@prov.com.br
email = fulano@prov.com.br
3 = Campinas
cidade = Campinas

LINHA: 2
0 = 2
id = 2
1 = Beltrano
nome = Beltrano
2 = beltrano@prov.com.br
...

Veja a confusão que pode acontecer. Neste caso é melhor utilizar uma matriz associativa (se quiser os nomes das colunas) ou uma matriz numérica (se quiser somente os valores dos campos).

Por último, vejamos a função: mysql_fetch_object()

Comentários:

Mostrando 1 - 10 de 18 comentários
foi de grande ajuda!!! Valeu!
11/07/2005 12:47pm (~19 anos atrás)

Estou desenvolvendo um sistema para faculdades, e para exibir os nomes dos alunos utilizei os informações do David Bittencourt, foi de grande ajuda!!!

Parabéns!
19/05/2005 12:58pm (~19 anos atrás)

E se caso fosse alterar via página,um nome do campo da tabela?
13/10/2004 4:42pm (~19 anos atrás)

Gustavo Villa disse:
David, parabéns pelo artigo.
Gostei da dica de atribuir os resultados da consulta a uma outra array para depois usar assim: $myarr[3]['nome'];

Gostei também do esclarecimento a respeito do uso de mysql_fetcha_array, como o segundo argumento para economizarmos espaço na memória.

Parabéns mesmo.
24/07/2004 9:45am (~20 anos atrás)

blz, funcionou legal sem as imagens..
10/03/2004 2:02pm (~20 anos atrás)

Perdão, as imagens não apareceram por causa de um bug no codigo do site que eu consertei semana passada.

O David enviou para mim as imagens novamente para eu consertar o artigo, mas só agora tive tempo para isso.

--Joao
14/12/2003 4:12pm (~20 anos atrás)

Obrigado Bucaneiro... =)

É, com as imagens seria bem melhor... =(

--db
10/12/2003 2:11pm (~20 anos atrás)

cara formidavel, com exemplos práticos, abordagem simples e de uso comum.

Poxa galera consertem as imagens, este é um artigo de grande valor pros iniciantes.
10/12/2003 12:06pm (~20 anos atrás)

Prefiro a função mysql_fetch_row(), pois é a mais rápida de todas.
Em relação ao artigo, muito bom MESMO, principalmente referente à dica do 'alias'.

Parabéns!
09/12/2003 2:12pm (~20 anos atrás)

No início eu também usava mysql_fetch_object() pois era como eu tinha aprendido.

Quando meus scripts começaram a ficar mais complicados eu vi a vantagem em usar mysql_fetch_array() como expliquei na última página do artigo.

Hoje, como minhas buscas no MySQL exigem diversas tabelas e grande número de campos, usar mysql_fetch_assoc() é a melhor opção pra mim.

Cada um precisa analisar a sua necessidade =)

--db
08/12/2003 7:57pm (~20 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)