Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

bioshock

Mostrar categorias {Resolvido}

Mensagens Recomendadas

bioshock

Boas. O problema é o seguinte:

Não estou a conseguir listar todas as categorias, só consigo listar uma categoria.

<?php
include ("connection.inc");

$query = mysql_query("SELECT id, nome, url FROM categorias")or die("Erro:" .mysql_error());
while($rows = mysql_fetch_array($query, MYSQL_ASSOC)or die(mysql_error())){
   echo "<h4 id=\"menu_".$rows["id"]."\">".$rows["nome"]."</h4>";
   echo "<ul>";
   $query2 = mysql_query("SELECT nome, categoria FROM produtos WHERE categoria IN (SELECT nome FROM categorias)")or die("Erro:" .mysql_error());
   echo "</ul>";			
   while($rows2 = mysql_fetch_array($query2, MYSQL_ASSOC)or die(mysql_error())){
       echo "<li><a href=\"".$rows2["nome"]."\">".$rows2["nome"]."</a></li>";
   //fopen($rows['url'], "w"); 
        }
   }
?>

Este é o codigo que utilizo para listar as categorias assim como para mostrar os produtos da mesma categoria.

Obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
softklin

Porque é que tens os "or die(...)" na condição? Pode ser isso que está a provocar a situação. E na parte de detnro do primeiro ciclo, está a fazer "<ul></ul>" que não faz muito sentido, que basicamente foi o que o Yoda disse: o "</ul>" está a ser despejado no sitio errado.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Oh, omg. Nem reparei no Die nos whiles. Desculpem!

O markup, tanto faz, neste caso não me está a fazer grande efeito.

Eu tirei os Die dentro dos whiles e funcionou de certa forma.

Mas acho que estou a fazer mal o SELECT, porque ele está-me a mostrar todos os produtos em todas as categorias, ou seja, não está a restringir os produtos às categorias.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Duas coisas em relação ao MySQL

1. não "ligues" tabelas por campos de texto. Reparei que as duas tabelas estão ligadas pelo campo "nome" das categorias - não faças isto. O MySQL é muito mais eficaz com números. Na tabela dos produtos crias um campo "categoria_id" e jogas com esse. Podes retirar o campo "categoria" da tabela produtos, que tem o nome da categoria. Para ficar ainda mais rápido, deves marcar esse campo "categoria_id" como índice;

2. Evita ao máximo expressões dentro de expressões. Ao fazer isso, o motor do MySQL não vai usar umas poucas de optimizações, e as queries vão ficar lentíssimas. Na dúvida, usa o comando EXPLAIN nas queries para veres onde é que estão lentas e por que ordem estão a fazer os joins.

Posto isto, e voltando ao teu problema em concreto, a tua segunda query está, como já te deves ter apercebido, mal feita. Só queres os registos da categoria em vigor no momento, pelo que tens de informar a query de qual é essa categoria:

<?php
// (...)
   $query2 = mysql_query("SELECT nome, categoria FROM produtos WHERE categoria = '" . $rows["nome"] . "'")or die("Erro:" .mysql_error());
// (...)

Mas considera não usar isto assim, pondera seriamente o meu ponto 1.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Ok, vou ter em conta isso, mas funciona da mesma maneira o SELECT com o que tu referiste no teu ponto 1? Ou seja, eu utilizo a função "WHERE IN" para apresentar numa combobox as categorias e para listar de acordo com os produtos.

De resto, era mesmo isso, só tinha que adicionar essa linha de código, funcionou perfeitamente. Eu só tinha aqui um problema, que era: Ele não me estava a criar a página URL, então por fim, fiquei com a seguinte resolução:

<?php
include ("connection.inc");

$query = mysql_query("SELECT id, nome, url FROM categorias")or die("error:" .mysql_error());
while($row = mysql_fetch_array($query)) {
// Mostra os detalhas nas linhas
$id = $row['id'];
$nome = $row['nome'];
$url = $row['url'];
   echo "<h4 id=\"menu_"."\">".$nome."</h4>";
   
   $query2 = mysql_query("SELECT nome, categoria FROM produtos WHERE categoria = '" . $nome . "'")or die("error:" .mysql_error());
   		
   while($rows = mysql_fetch_array($query2)) {
// Mostra os detalhas nas linhas
$id = $rows['id'];
$nome = $rows['nome'];
$categoria = $rows['categoria'];
       echo "<li><a href=\"".$rows["nome"].".html"."\" id=\"link_".$rows["id"]."\">".$rows["nome"]."</a></li>";
  fopen($rows['nome'].".html", "w");
        }
   }

Obrigado mjamado, obrigado pessoal  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Ok, vou ter em conta isso, mas funciona da mesma maneira o SELECT com o que tu referiste no teu ponto 1? Ou seja, eu utilizo a função "WHERE IN" para apresentar numa combobox as categorias e para listar de acordo com os produtos.

Não, funciona igual ao que eu dei, só que em vez de ser  "... categoria = '" . $nome . "'" é "... categoria_id = '" . $id . "'".


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Não era a isso que me estava a referir.

Quando eu registo um produto, é-nos pedido para inserir a categoria do produto, e essa categoria é apresentado numa combobox, com o seguinte código:

<?php
include "connection.inc";
$result=mysql_query("SELECT nome FROM categorias");
if($result)
{ 
echo '<select name="categoria">'; 
while($myrow = mysql_fetch_array($result))
{
echo '<option value='.$myrow['nome'].'>'.$myrow['nome'].'</option>';  
}  
echo "</select>";
}
?>

Depois quando eu mostro os produtos, também mostro o nome da categoria em que este produto está inserido, utilizo:

 mysql_query( "SELECT * FROM produtos WHERE categoria IN (SELECT nome FROM categorias) ORDER BY id DESC LIMIT $startrow, 5")or die("SELECT Error: " .mysql_error());]

Aqui é onde faço aquele "WHERE IN" que te disse. E o que eu te estava a perguntar era se, no caso do id_categoria, também funciona da mesma maneira?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Não era a isso que me estava a referir.

Quando eu registo um produto, é-nos pedido para inserir a categoria do produto, e essa categoria é apresentado numa combobox, com o seguinte código:

<?php
include "connection.inc";
$result=mysql_query("SELECT nome FROM categorias");
if($result)
{ 
echo '<select name="categoria">'; 
while($myrow = mysql_fetch_array($result))
{
echo '<option value='.$myrow['nome'].'>'.$myrow['nome'].'</option>';  
}  
echo "</select>";
}
?>

Depois quando eu mostro os produtos, também mostro o nome da categoria em que este produto está inserido, utilizo:

 mysql_query( "SELECT * FROM produtos WHERE categoria IN (SELECT nome FROM categorias) ORDER BY id DESC LIMIT $startrow, 5")or die("SELECT Error: " .mysql_error());]

Aqui é onde faço aquele "WHERE IN" que te disse. E o que eu te estava a perguntar era se, no caso do id_categoria, também funciona da mesma maneira?

E a minha resposta é a mesma...  :biggrin:

Nas <option> do <select> o value vai passar a ser o id da categoria, em vez de ser o nome. Quando quiseres mostrar os produtos, tens duas opções: se forem os produtos duma categoria específica, fazes o WHERE tal como te disse antes. Se forem de todas, nem sequer tem WHERE.

Para trazeres o nome da categoria, é outra questão, e resolve-se com um JOIN, assim:

SELECT produtos.*,
       categorias.nome
FROM produtos
LEFT JOIN categorias ON (categoria.id = produtos.categoria_id)
/* aqui o teu WHERE, dependendo das circunstâncias */

P.S.: Parece-me que tens muitas limitação ao nível de bases de dados. É aconselhável tentares deitar as mãos a um livro sobre BD's, na generalidade, se possível com incidência no MySQL.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Eu estava habituado a fazer as relações todas pelo access..daí as minhas dúvidas.

Vou tentar arranjar isso, obrigado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.