Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
bioshock

Querys produtos/categorias [resolvido]

Recommended Posts

bioshock

Olá pessoal!

Estou com alguma dificuldade em obter a query que desejo. O KingPito já me disse como fazer, e eu fiz da forma que ele disse, e pensei que tivesse funcionado. Contudo, testei mais a fundo e não funcionou como esperava.

Eu ando a criar páginas dinâmicas, um único ficheiro cria várias páginas.

Na página index, listo as categorias da base de dados e crio uma página para cada categoria.

<?php
include ("connection.inc");
$query2 = mysql_query("SELECT * FROM categorias")or die("error:" .mysql_error());
while($rows = mysql_fetch_array($query2)) {
        // Mostra os detalhas nas linhas
	$id = $rows['id'];
	$nome = $rows['nome'];
	echo "<li><a href=\"s-produtos".".php?cat=".$id."\" id=\"link_".$id."\">".$rows['nome']."</a></li>";
$myFile = "s-produtos".".php";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, '<?php include("insertPages.php")?>');
fclose($fh);
}
?>

Na página de listagem dos produtos, tenho:

<?php 
include ("connection.inc");
$query = mysql_query("SELECT * FROM produtos WHERE id = '" . $_GET['cat'] . "'")or die("Error: " .mysql_error());
while($rows = mysql_fetch_array($query)){
$id = $rows['id'];
    $nome = $rows['nome'];
$preco = $rows['preco'];
    $promocao = $rows['promocao'];
$descricao = $rows['descricao'];
    $imagem = $rows['imagem'];
$categoria = $rows['categoria'];

// cria as linhas
echo "<tr><td><b>Nome:</b></td> $nome<br></th>";
    echo "<input type='image' name='imageField' id='imageField' src='images/thumbs/$imagem'>";
echo "<b>Descrição:</b> $descricao<br>";
    echo "<b>Preço:</b> $preco €<br>";
echo "<b>Promoção:</b> $promocao %<br><br><br></tr>";
}
?>

Com estes códigos, eu tinha como pretendido que me aparecesse no url:

Produtos/s-produtos.php?cat=1

E aparece, mas não restringe os produtos às categorias (o problema tem que estar na query)

Mas eu consigo fazer com que dê para restringir os produtos, alterando as seguintes linhas de código:

index

echo "<li><a href=\"s-produtos".".php?cat=".$nome."\" id=\"link_".$id."\">".$rows['nome']."</a></li>";

listar produtos

$query = mysql_query("SELECT * FROM produtos WHERE categoria = '" . $_GET['cat'] . "'")or die("Error: " .mysql_error());

Mas assim, no url iria me aparecer:

http://localhost/Produtos/s-produtos.php?cat=Vinhos

E eu pretendo que me apareça o ID da categoria.

Já tentei com o SELECT IN, mas sem efeito.

Sugestões  ;)? Obrigado!

Share this post


Link to post
Share on other sites
mjamado

Por acaso até é melhor fazer pelo nome, por causa dos motores de busca, mas tens que garantir que os nomes são mesmo únicos. Além disso, isso bem feitinho era com mod_rewrite...

Mas adiante...

Para ir buscar os produtos por id da categoria tens de ter, na tabela dos produtos, o id da categoria (tipo, duh!). Vê lá se te lembras desta minha sugestão:

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;

Como tens, podes fazer a query da seguinte forma, mas lembra-te que comparações por string na BD são altamente ineficientes relativamente a comparações por inteiro indexado:

SELECT produtos.*
FROM produtos
LEFT JOIN categorias ON (categoria.nome = produtos.categoria)
WHERE categoria.id = $_GET['cat']

Olha, com tantos posts que tens para aí, já colocavas a estrutura da BD, sempre fica mais fácil... para nós.

P.S.: agora estava a olhar melhor para o teu código... Vê lá se consegues detectar onde é que está a idiotice nesta linha de código:

$query = mysql_query("SELECT * FROM produtos WHERE id = '" . $_GET['cat'] . "'")or die("Error: " .mysql_error());


"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.

Share this post


Link to post
Share on other sites
bioshock

Olá!

Acredites ou não eu já estava aqui a ler isto:

http://www.tizag.com/mysqlTutorial/mysqlleftjoin.php quando me mandaste a resposta ao tópico.

Já estava à espera que me dissesses isso, sobre utilizar inteiros em vez de strings  ;)

De resto, em relação ao código só tive que alterar dois pontos:

$query = mysql_query("SELECT * FROM produtos LEFT JOIN categorias ON (categorias.nome = produtos.categoria) WHERE categorias.id = '".$_GET['cat']."'") or die("Error: " .mysql_error());

Obrigado mjamado!

Share this post


Link to post
Share on other sites
bioshock

Consigo, está no SELECT, quando dizemos que o ID (do produto) é igual ao GET['cat'].

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.