Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dexter Morgan

[Resolvido] Listar itens do mesmo pedido em uma tabela só

Recommended Posts

Seguinte pessoal, to montando uma loja virtual, onde tem a opção meu pedidos, que o usuario vizualiza seus pedidos, entretanto, se eu coloco para listar todos os pedidos do cliente sem limites, ele lista separado, vou mostrar para ficar mais facil ...

 

como tem que listar:

 

certo.png

 

como que está listando:

 

errado.png

 

vejam que mostra duas vezez pedido 4 e isso acontece por nao limito a quantidade na SQL, vou postar o código completo:

 

<?php

if(!isset($_COOKIE["id_cliente"])){
$logado = "N";
}
else{
$logado = "S";
}

?>

<?php

function escreveData($data){
$var = explode('-', $data);
$novadata = $var[2] . '/' . $var[1] . '/' . $var[0];
return $novadata;
}

?>

<?php

include "connection.php";

if($logado == "S"){
$sql = "SELECT pedidos.*, itens.*, compras.* FROM pedidos INNER JOIN itens ON pedidos.id_pedido = itens.id_pedido INNER JOIN compras ON pedidos.id_pedido = compras.id_pedido WHERE pedidos.id_cliente = ".$_COOKIE["id_cliente"]." ORDER BY pedidos.id_pedido DESC";
$resultado = mysql_query($sql) or die (mysql_error());
if(!$_COOKIE["id_cliente"]){
echo "";
}
else{
while($linha = mysql_fetch_array($resultado)){
$id_cliente = $linha["id_cliente"];
$id_pedido = $linha["id_pedido"];
$id_item = $linha["id_item"];
$id_compra = $linha["id_compra"];
$transacaoID = $linha["transacaoID"];
$id_produto = $linha["id_produto"];
$produto = $linha["produto"];
$quantidade = $linha["quantidade"];
$preco = $linha["preco"];
$cor = $linha["cor"];
$iluminaria = $linha["iluminaria"];
$data = $linha["data"];
$StatusTransacao = $linha["StatusTransacao"];
$TipoPagamento = $linha["TipoPagamento"];
$qtd = $linha["qtd"];
$valor = $linha["valor"];
$subtotal = $quantidade * $preco;

echo "<table cellSpacing=\"0\" cellPadding=\"0\" width=\"674\" border=\"0\">";
echo "<tbody>";
echo "<tr>";
echo "<td>";

echo "<table width=\"100%\" border=\"0\" cellpadding=\"2\" cellspacing=\"2\" bgcolor=\"#ffffff\">";

?>

<div class="title-gradient">Pedido <? echo "$transacaoID"; ?></div>

<table width="674">
<tr>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Data</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Status</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Forma de Pgt</strong></font></td>
<td class="table-list" width="6%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Qtde de Produtos</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Valor Total</strong></font></td>
</tr>

<tr>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? print escreveData("$data"); ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$StatusTransacao"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$TipoPagamento"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$qtd"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#000000" size="3"><font style="font-size:10px"><b>R$</b></font> <b><? echo number_format($valor, 2, ',', '.'); ?></b></font></td>
</tr>

</table>

<br />

<div class="title-gradient">Pedido Detalhado</div>

<table width="674">
<tr>
<td class="table-list" width="20%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Produto</strong></font></td>
<td class="table-list" width="20%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Cor</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Iluminaria</strong></font></td>
<td class="table-list" width="6%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Qtde</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Valor</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Subtotal</strong></font></td>
</tr>

<tr>
<td class="table-list"><a href="view.php?id_produto=<? echo "$id_produto"; ?>#pageview" style="outline:0; text-decoration:none;"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$produto"; ?></i></b></font></a></td>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$cor"; ?></i></b></font></td>

<?php if($iluminaria){ ?>

<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$iluminaria"; ?></i></b></font></td>

<?php

}
else{

?>

<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i>Não</i></b></font></td>

<?php } ?>

<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$quantidade"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#000000" size="3"><font style="font-size:10px"><b>R$</b></font> <b><? echo number_format($preco, 2, ',', '.'); ?></b></font></td>
<td class="table-list"><font face="helvetica" color="#000000" size="3"><font style="font-size:10px"><b>R$</b></font> <b><? echo number_format($subtotal, 2, ',', '.'); ?></b></font></td>
</tr>
</table>

<?php

echo "</table>";

echo "</td>";
echo "</tr>";
echo "</tbody>";
echo "</table>";

?>

<br clear="all" />

<div style="width:670px; border-bottom:2px solid #555555;"></div>

<br clear="all" />

<?php

}
}

}
else{
echo "<meta http-equiv=\"refresh\" content=\"0; url=account.php\">";
}

?>

 

se alguém souber como resolver isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você terá que separar em dois SELECT's.

 

Gabriel, tentei assim com mais selects:

 

<?php

if(!isset($_COOKIE["id_cliente"])){
$logado = "N";
}
else{
$logado = "S";
}

?>

<?php

function escreveData($data){
$var = explode('-', $data);
$novadata = $var[2] . '/' . $var[1] . '/' . $var[0];
return $novadata;
}

?>

<?php

include "connection.php";

if($logado == "S"){
$sql = "SELECT * FROM pedidos WHERE id_cliente = '".$_COOKIE["id_cliente"]."' ORDER BY id_pedido DESC";
$resultado = mysql_query($sql) or die (mysql_error());
if(!$_COOKIE["id_cliente"]){
echo "";
}
else{
while($linha = mysql_fetch_array($resultado)){
$id_pedido = $linha["id_pedido"];
$id_cliente = $linha["id_cliente"];
$transacaoID = $linha["transacaoID"];

?>

<div class="title-gradient">Pedido <? echo "$transacaoID"; ?></div>

<table width="674">
<tr>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Data</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Status</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Forma de Pgt</strong></font></td>
<td class="table-list" width="6%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Qtde de Produtos</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Valor Total</strong></font></td>
</tr>

<?php

include "connection.php";

$sql = "SELECT * FROM compras WHERE id_pedido = '$id_pedido' ORDER BY id_pedido DESC";
$resultado = mysql_query($sql) or die (mysql_error());
if(!$_COOKIE["id_cliente"]){
echo "";
}
else{
while($linha = mysql_fetch_array($resultado)){
$id_compra = $linha["id_compra"];
$id_pedido = $linha["id_pedido"];
$data = $linha["data"];
$StatusTransacao = $linha["StatusTransacao"];
$TipoPagamento = $linha["TipoPagamento"];
$qtd = $linha["qtd"];
$valor = $linha["valor"];

?>

<tr>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? print escreveData("$data"); ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$StatusTransacao"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$TipoPagamento"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$qtd"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#000000" size="3"><font style="font-size:10px"><b>R$</b></font> <b><? echo number_format($valor, 2, ',', '.'); ?></b></font></td>
</tr>

<?php

}
}

?>

</table>

<br />

<div class="title-gradient">Pedido Detalhado</div>

<table width="674">
<tr>
<td class="table-list" width="20%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Produto</strong></font></td>
<td class="table-list" width="20%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Cor</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Iluminaria</strong></font></td>
<td class="table-list" width="6%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Qtde</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Valor</strong></font></td>
<td class="table-list" width="15%"><font face="helvetica" color="#333333" style="font-size:12px"><strong>Subtotal</strong></font></td>
</tr>

<?php

include "connection.php";

$sql = "SELECT pedidos.*, itens.*, compras.* FROM pedidos INNER JOIN itens ON pedidos.id_pedido = itens.id_pedido INNER JOIN compras ON pedidos.id_pedido = compras.id_pedido WHERE pedidos.id_pedido = '$id_pedido' ORDER BY pedidos.id_pedido DESC";
$resultado = mysql_query($sql) or die (mysql_error());
if(!$_COOKIE["id_cliente"]){
echo "";
}
else{
while($linha = mysql_fetch_array($resultado)){
$id_cliente = $linha["id_cliente"];
$id_pedido = $linha["id_pedido"];
$id_item = $linha["id_item"];
$id_compra = $linha["id_compra"];
$transacaoID = $linha["transacaoID"];
$id_produto = $linha["id_produto"];
$produto = $linha["produto"];
$quantidade = $linha["quantidade"];
$preco = $linha["preco"];
$cor = $linha["cor"];
$iluminaria = $linha["iluminaria"];
$data = $linha["data"];
$StatusTransacao = $linha["StatusTransacao"];
$TipoPagamento = $linha["TipoPagamento"];
$qtd = $linha["qtd"];
$valor = $linha["valor"];
$subtotal = $quantidade * $preco;

?>

<tr>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$produto"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$cor"; ?></i></b></font></td>

<?php if($iluminaria){ ?>

<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$iluminaria"; ?></i></b></font></td>

<?php

}
else{

?>

<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i>Não</i></b></font></td>

<?php } ?>

<td class="table-list"><font face="helvetica" color="#999999" style="font-size:12px"><b><i><? echo "$quantidade"; ?></i></b></font></td>
<td class="table-list"><font face="helvetica" color="#000000" size="3"><font style="font-size:10px"><b>R$</b></font> <b><? echo number_format($preco, 2, ',', '.'); ?></b></font></td>
<td class="table-list"><font face="helvetica" color="#000000" size="3"><font style="font-size:10px"><b>R$</b></font> <b><? echo number_format($subtotal, 2, ',', '.'); ?></b></font></td>
</tr>

<?php

}
}

?>

</table>

<?php

echo "</table>";

echo "</td>";
echo "</tr>";
echo "</tbody>";
echo "</table>";

?>

<br clear="all" />

<div style="width:670px; border-bottom:2px solid #555555;"></div>

<br clear="all" />

<?php

}
}

}
else{
echo "<meta http-equiv=\"refresh\" content=\"0; url=account.php\">";
}

?>

 

ele até mostra correto, mas mostra apenas o ultimo pedido ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Particularmente, não gosto de fazer muitos select's.

Sempre que possível, prefiro separar os dados que serão exibidos pelo próprio PHP. No seu caso, acho que seria viável.

 

 

 

<?php 

$pdo = new PDO('mysql:dbname=banco;host=127.0.0.1','user','pass');

// consulta a ser realizada
$sql = 'SELECT pedidos.*, itens.*, compras.*
FROM pedidos
INNER JOIN itens ON pedidos.id_pedido = itens.id_pedido
INNER JOIN compras ON pedidos.id_pedido = compras.id_pedido
WHERE pedidos.id_cliente = ?
ORDER BY pedidos.id_pedido DESC';

// substituindo valores
$stm = $pdo->prepare($sql);
$stm->bindValue(1, $_COOKIE["id_cliente"], PDO::PARAM_INT);
$stm->execute();

// lista de pedidos
$pedidos = array();

// para cada linha, separamos por pedido
while( $row = $stm->fetch(PDO::FETCH_ASSOC) ){
if(!array_key_exists($row['id_pedido'], $pedidos)){
	$pedidos[ $row['id_pedido'] ] = $row;
}

$pedidos[ $row['id_pedido'] ]['itens'] = $row;
}


// exibindo os dados dos pedidos
foreach($pedidos as $id_pedido => $pedido){
echo 'Pedido: ' , $id_pedido, '<br>';
echo 'Itens: <br>';

foreach($pedido['itens'] as $item){
	printf('Produto: %s<br>
		Cor: %s<br>
		Iluminaria: %s<br>
		Quantidade: %s<br>
		Valor: %s',
		$item['produto'],
		$item['cor'],
		$item['iluminaria'],
		$item['qtd'],
		number_format($item['produto'], 2, '.',',')
	);
}
echo '<hr>';
}

 

 

 

Porém, uma coisa que eu mudaria urgentemente nesta consulta, é tirar este monte de asteriscos.

Você, definitivamente, não está usando todos os dados de todas estas tabelas ao mesmo tempo nesta exibição. Então, porque selecionar todos eles? Você só está aumentando o processamento de forma desnecessária, inclusive o consumo de memória, pois o PHP tem que pegar os dados do banco e armazenar em memória antes de exibir. Quer performance? Então selecione somente os dados que você vai usar. Não adianta fazer centenas de melhorias no PHP se sua consulta trás o universo com ela :)

 

Notas sobre este exemplo:

- estou utilizando PDO, porque as funções mysql_* foram depreciadas;

- estou usando prepared statements para colocar o valor na consulta, evitando SQL Injection;

- faço uma unica consulta para recuperar os dados necessários. Porém, avalie se no seu banco de dados, uma consulta com INNER JOIN é mais rápida ou não do que fazer 2 ou mais consultas;

- e pelamordedeuspaitodopoderoso: tire esse monte de asteriscos da consulta, ou você terá sérios problemas de performance futuramente. Selecione somente o que precisa para exibir os dados.

 

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Particularmente, não gosto de fazer muitos select's.

Sempre que possível, prefiro separar os dados que serão exibidos pelo próprio PHP. No seu caso, acho que seria viável.

 

 

 

<?php 

$pdo = new PDO('mysql:dbname=banco;host=127.0.0.1','user','pass');

// consulta a ser realizada
$sql = 'SELECT pedidos.*, itens.*, compras.*
FROM pedidos
INNER JOIN itens ON pedidos.id_pedido = itens.id_pedido
INNER JOIN compras ON pedidos.id_pedido = compras.id_pedido
WHERE pedidos.id_cliente = ?
ORDER BY pedidos.id_pedido DESC';

// substituindo valores
$stm = $pdo->prepare($sql);
$stm->bindValue(1, $_COOKIE["id_cliente"], PDO::PARAM_INT);
$stm->execute();

// lista de pedidos
$pedidos = array();

// para cada linha, separamos por pedido
while( $row = $stm->fetch(PDO::FETCH_ASSOC) ){
if(!array_key_exists($row['id_pedido'], $pedidos)){
	$pedidos[ $row['id_pedido'] ] = $row;
}

$pedidos[ $row['id_pedido'] ]['itens'] = $row;
}


// exibindo os dados dos pedidos
foreach($pedidos as $id_pedido => $pedido){
echo 'Pedido: ' , $id_pedido, '<br>';
echo 'Itens: <br>';

foreach($pedido['itens'] as $item){
	printf('Produto: %s<br>
		Cor: %s<br>
		Iluminaria: %s<br>
		Quantidade: %s<br>
		Valor: %s',
		$item['produto'],
		$item['cor'],
		$item['iluminaria'],
		$item['qtd'],
		number_format($item['produto'], 2, '.',',')
	);
}
echo '<hr>';
}

 

 

 

Porém, uma coisa que eu mudaria urgentemente nesta consulta, é tirar este monte de asteriscos.

Você, definitivamente, não está usando todos os dados de todas estas tabelas ao mesmo tempo nesta exibição. Então, porque selecionar todos eles? Você só está aumentando o processamento de forma desnecessária, inclusive o consumo de memória, pois o PHP tem que pegar os dados do banco e armazenar em memória antes de exibir. Quer performance? Então selecione somente os dados que você vai usar. Não adianta fazer centenas de melhorias no PHP se sua consulta trás o universo com ela :)

 

Notas sobre este exemplo:

- estou utilizando PDO, porque as funções mysql_* foram depreciadas;

- estou usando prepared statements para colocar o valor na consulta, evitando SQL Injection;

- faço uma unica consulta para recuperar os dados necessários. Porém, avalie se no seu banco de dados, uma consulta com INNER JOIN é mais rápida ou não do que fazer 2 ou mais consultas;

- e pelamordedeuspaitodopoderoso: tire esse monte de asteriscos da consulta, ou você terá sérios problemas de performance futuramente. Selecione somente o que precisa para exibir os dados.

 

@braços e fique com Deus!

 

realmente depois vou tirar os * mas não funcionou, ele listou "tudo" tipo vou explicar ...

 

igual tem a cor escolhida, ai ele listou no pedido todas as cores, ficou estranho, e fez isso com as demais consultas tbm, e mostrava tipo assim cor A cor B ... nunca utilizei PDO, ai to meio perdido aqui, nao sei pq ficou assim ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai já é problema na sua consulta.

Você notou que a consulta que usei no meu exemplo, é a mesma que você postou?

 

Execute a consulta em um terminal MySQL para ver se os resultados vêm de acordo com o esperado.

 

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.