Formas de manipular os dados de uma busca MySQL
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:
E chamamos a função mysql_fetch_array() da seguinte maneira:
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:
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:
Ao fazer isto, cada linha terá uma chave na matriz $myarr, ou seja:
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.
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.
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()
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()
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!
Parabéns!
19/05/2005 12:58pm
(~19 anos atrás)
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.
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)
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
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
(~21 anos atrás)
Obrigado Bucaneiro... =)
É, com as imagens seria bem melhor... =(
--db
É, com as imagens seria bem melhor... =(
--db
10/12/2003 2:11pm
(~21 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.
Poxa galera consertem as imagens, este é um artigo de grande valor pros iniciantes.
10/12/2003 12:06pm
(~21 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!
Em relação ao artigo, muito bom MESMO, principalmente referente à dica do 'alias'.
Parabéns!
09/12/2003 2:12pm
(~21 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
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
(~21 anos atrás)