Ir para conteúdo

Arquivado

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

Marcello Ruoppolo

while dentro de outro while

Recommended Posts

E ai galera tudo bem??

 

Galera eu tenho no meu sistema um cadastro com todos os eventos culturais que acontecem em todas as cidades de todos os estados brasileiros, ai eu vendo assinaturas para que o usuário compre um número limitado de estados para ele trabalhar, então eu preciso criar um loop que busque na tb_estados_escolhidos e mostre para o usuário somente os eventos que acontecem nas cidades que estão nos estados que ele escolheu.

 

Para isso eu tenho que ter um loop dentro de outro, um para buscar e retornar todos os ids dos estados escolhidos e outro para puxar todos os eventos das cidades cujo estado seja o mesmo da id do estado escolhido, esse segundo loop mostra as informações dentro deu uma tr e eu não estou conseguindo ter ideia de como fazer isso.

 

Alguém ai pode dar uma luz??

 

Valew

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu costumo fazer tudo no banco de dados MySQL, faço os JOINs e depois filtro, se eu quero selecionar um estado, a mesma consulta traz as informações, assim não faço vários SELECTs.

 

Por exemplo:

SELECT estado.id, estado.abreviacao, cidade.id, cidade.nome
FROM estado
INNER JOIN cidade ON cidade.estado_id = estado.id
WHERE 1
# caso queira filtrar o estado com id = 1 uso " AND estado.id = 1"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa de buscar os dados em um loop, pode fazer isso com inner join.

Dai em um loop você mostra os dados da seguinte forma:

foreach ($estados as $estado)
{
  $eventos = $estado['eventos'];
  echo "<tr><th>".$estado['sigla']."</th></tr>";
  echo "<tr>";
  foreach ($eventos as $evento)
  {
    echo "<td>".$evento['xxxx']."</td>";
  }
echo "</tr>";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não estou conseguindo logar com a minha conta do facebook, mas sou o Marcello ai em cima, eu tentei também com o foreach, eu estou até conseguindo entender mais ou menos a lógica, mas não consigo executar, eu coloquei inclusive um if dentro do while pra tentar também de outra forma, mas não estou conseguindo de jeito nenhum, eu vou postar aqui o código pra ver se vcs conseguem me dar uma luz.

 

Bom é o seguinte, na verdade o meu sistema tem 6 planos de assinatura:

 

1) Ele tem direito a escolher 5 estados e não tem acesso aos dados cadastrados como publicos do sistema

2) Acesso a 15 estados, mas não tem acesso aos dados cadastrados como públicos

3) Acesso a todos os estados, mas sem os dados públicos

4) 5 estados e tem acesso aos dados públicos destes estados

5) 15 estados com os dados públicos destes estados

6) Todos os estados e todos os dados públicos

 

Ai eu criei dentro de cada dado um campo strPublic do tipo ENUM que se o valor dele for 's' significa que ele é público e se for 'n' significa que ele é privado, cadastrado por um usuário do sistema, por isso, deve aparecer apenas para este usuário.

 

Criei e variáveis de sessão $_SESSION['user_plano'] e $_SESSION['user_banco'] a user plano informa o id do plano e a user_banco informa se o usuário tem acesso aos dados públicos s = sim - n=não.

 

Bom o código é esse aqui:

if($_SESSION['user_banco'] == 's' && $_SESSION['user_plano'] != '6'){
$estados_escolhidos = mysql_query("SELECT intEstadoID FROM tb_estados_escolhidos WHERE intUserID = '$id'");
$ee = mysql_fetch_assoc($estados_escolhidos);
$sql_eventos = mysql_query("SELECT e.intEventoID, e.strEventoNome, e.intEstadoID, e.intCidadeID, e.strEventoData, e.intEventoCategoriaID, es.intEstadoID, es.strEstadoUF, ci.intCidadeID, ci.strCidadeNome, ec.intEventoCategoriaID, ec.strEventoCategoriaNome FROM tb_eventos AS e INNER JOIN tb_estados AS es ON e.intEstadoID = es.intEstadoID INNER JOIN tb_cidades AS ci ON e.intCidadeID = ci.intCidadeID INNER JOIN tb_eventos_categoria AS ec ON e.intEventoCategoriaID = ec.intEventoCategoriaID WHERE e.intUserID = '$id' OR e.strPublic = 's' LIMIT 5") or die(mysql_error());
$contar_eventos = mysql_num_rows($sql_eventos);
if($contar_eventos >= 1){
while($e=mysql_fetch_assoc($sql_eventos)){
if($e['intEstadoID'] == $ee['intEstadoID']){
?>
<tr>	
<td><?php echo $e['strEventoNome']; ?></td>
<td><?php echo $e['strEventoCategoriaNome']; ?></td>
<td><?php echo $e['strCidadeNome']."/".$e['strEstadoUF']; ?></td>
<td><?php echo mostraData($e['strEventoData']); ?></td>				        </tr>
<?php
}}}else{ 
echo "<tr><td colspan='4'>Ainda não existem eventos cadastrados em sua conta!</td></tr>";
}
}

Com esse if ele até tras os dados do primeiro estado escolhido, porém não tras dos outros justamente porque o laço de repetição esta apenas na query que tras os dados e não na que tras os estados escolhidos.

 

Entendem??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem que ter uma query para cada tipo de plano, e essa query já tem que buscar os estados e eventos.
Depois disso só obter em um foreach os estados e em outro foreach aninhado obter os eventos do estado e mostrar como no meu exemplo anterior.

Compartilhar este post


Link para o post
Compartilhar em outros sites

CL4nG desculpa a minha lerdeza, kk, mas não consigo entender como eu posso montar um foreach que obtenha os estados, pois, o que eu li na documentação do foreach é que ele funciona com arrays e não estou conseguindo entender como usar isso.

 

Eu tentei o seguinte:

$buscar_estados = mysql_query("SELECT intEstadoID FROM tb_estados_escolhidos WHERE intUserID = '$id'") or die(mysql_error());
$ee = mysql_fetch_assoc($buscar_estados);

foreach($ee as $ee){
   $estado_id = $ee['intEstadoID'];
   $sql_eventos = mysql_query("SELECT e.intEventoID, e.strEventoNome, e.intEstadoID, e.intCidadeID, e.strEventoData, e.intEventoCategoriaID, es.intEstadoID, es.strEstadoUF, ci.intCidadeID, ci.strCidadeNome, ec.intEventoCategoriaID, ec.strEventoCategoriaNome FROM tb_eventos AS e INNER JOIN tb_estados AS es ON e.intEstadoID = es.intEstadoID INNER JOIN tb_cidades AS ci ON e.intCidadeID = ci.intCidadeID INNER JOIN tb_eventos_categoria AS ec ON e.intEventoCategoriaID = ec.intEventoCategoriaID WHERE (e.intEstadoID = '$estado_id') AND (e.intUserID = '$id' OR e.strPublic = 's') LIMIT 5") or die(mysql_error());			                	
   $e=mysql_fetch_assoc($sql_eventos);
   foreach($e as $e){
   ?>
	<tr>	
	   <td><?php echo $e['strEventoNome']; ?></td>
	   <td><?php echo $e['strEventoCategoriaNome']; ?></td>
	   <td><?php echo $e['strCidadeNome']."/".$e['strEstadoUF']; ?></td>
	   <td><?php echo mostraData($e['strEventoData']); ?></td>				</tr>
   <?php
	}}
    }
   ?>

Desculpa, é que eu nunca utilizei o foreach eu sempre fiz laços com o while e estou tendo mtas dificuldades para entender o funcionamento agora, eu até dei uma lida na internet, mas ainda não ta mto claro pra mim

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dê uma olhada:

<?php

	$resultados[] = array("intEstado" => 1, "eventos" => array( array("strEventoNome" => "Evento 1")) );
	$resultados[] = array("intEstado" => 2, "eventos" => array( array("strEventoNome" => "Evento 2")) );
	$resultados[] = array("intEstado" => 3, "eventos" => array( array("strEventoNome" => "Evento 3")) );
	$resultados[] = array("intEstado" => 4, "eventos" => array( array("strEventoNome" => "Evento 4")) );

	/*
	 * Supondo que $resultados seja um array com estados e seus eventos (array de eventos),
	 * basta varrer o array de $resultados, obter os eventos do estado atual e em um foreach
	 * aninhado, mostrar os eventos.
	 */

	echo "<table>";
	foreach ($resultados as $resultado) {
		# code...
		$intEstado  = $resultado['intEstado'];
		$eventos 	= $resultado['eventos'];

		echo "<th>".$intEstado."</th>";

		foreach ($eventos as $evento) {
			# code...
			echo "<tr>";
				echo "<td>".$evento['strEventoNome']."</td>";
			echo "</tr>";
		}
	}
	echo "</table>";
?>

$resultados é um array com todos os estados e eventos de cada estado.
Se cada evento está ligado a um estado no banco de dados, então não precisa executar querys dentro do foreach, você pode fazer tudo em uma única query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, mas ai que esta eu tenho 2 tabelas com estados, uma com todos os estados brasileiros e a outra com os estados que o usuário escolheu, no caso a tabela com os eventos aponta para todos os estados brasileiros e eu preciso pegar apenas os estados que o usuário escolheu, eu tentei criar uma query que fizesse isso, pq na verdade eu acredito que só conseguirei criar este array resultados se eu conseguir criar uma query que ja me traga estes resultados ai eu uso o mysql_fetch_assoc e gero esse array só ai eu poderei utilizar o foreach não é?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da forma que estou dizendo sim! Mas se você quiser executar querys dentro do foreach pode também, mas não é recomendado.


Dependendo de como está sendo salvo o id dos estados escolhidos pelos usuários, da pra listar tudo em uma query.

Você está salvando cada estado em um registro diferente ou tudo em um único registro?


Registro diferente:

id | user | estado
1 | 1 | 1
2 | 1 | 2


Se for assim da pra buscar todos estados e eventos em uma só query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Todos em registros diferentes, tipo a estrutura das tableas é:

 

tb_estados

 

IntEstadoID - strEstadoNome - strEstadoSigla

 

tb_estados_escolhidos

 

intEstadoEscolhidoID, intUserID, intEstadoID

 

Tipo eu utilizo como chave extrangeira


Neste exato momento o sistema esta assim:

$buscar_estados = mysql_query("SELECT intEstadoID FROM tb_estados_escolhidos WHERE intUserID = '$id'") or die(mysql_error());
$ee = mysql_fetch_assoc($buscar_estados);
foreach($ee as $ee){
   $estado_id = $ee['intEstadoID'];
   $sql_eventos = mysql_query("SELECT e.intEventoID, e.strEventoNome, e.intEstadoID, e.intCidadeID, e.strEventoData, e.intEventoCategoriaID, es.intEstadoID, es.strEstadoUF, ci.intCidadeID, ci.strCidadeNome, ec.intEventoCategoriaID, ec.strEventoCategoriaNome FROM tb_eventos AS e INNER JOIN tb_estados AS es ON e.intEstadoID = es.intEstadoID INNER JOIN tb_cidades AS ci ON e.intCidadeID = ci.intCidadeID INNER JOIN tb_eventos_categoria AS ec ON e.intEventoCategoriaID = ec.intEventoCategoriaID WHERE (e.intEstadoID = '$estado_id') AND (e.intUserID = '$id' OR e.strPublic = 's') LIMIT 5") or die(mysql_error());			                	
   $e=mysql_fetch_assoc($sql_eventos);

   foreach($e as $e){
   ?>
   <tr>	
	 <td><?php echo $e['strEventoNome']; ?></td>
	 <td><?php echo $e['strEventoCategoriaNome']; ?></td>
	 <td><?php echo $e['strCidadeNome']."/".$e['strEstadoUF']; ?></td>
	 <td><?php echo mostraData($e['strEventoData']); ?></td>						                    
  </tr>
  <?php
	 }}
   }
  ?>

Ai ele esta me mostrando o seguinte erro:

 

Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\info\sistema\principal.php on line 51

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem que montar uma query pra trazer tudo de uma só vez. Executar query dentro de loop não é eficaz.

Monte uma query semelhante a essa:

SELECT * FROM tb_estados_escolhidos as escolhidos INNER JOIN tb_eventos as eventos ON eventos.intEstadoID = escolhidos.intEstadoID AND escolhidos.intUserID = user_id INNER JOIN tb_estados as estados ON estados.IntEstadoID = escolhidos.intEstadoID

E não use o mesmo nome de variável no foreach:

foreach($ee as $ee)
foreach($e as $e)

Veja o que acontece:

<?php
$a = array(1,2,3,4,5);

//A partir daqui você perde a referência ao array...
//Então não use o mesmo nome...
foreach ($a as $a) {
    
    //
    print_r($a);
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que estou começando a entender, desculpe a demora em responder, estive fora esta semana, bem, eu cheguei no seguinte resultado:

$buscar_estados = mysql_query("SELECT escolhido.intEstadoID, escolhido.intEstadoEscolhidoID, evento.intEventoID, evento.intEventoCategoriaID, evento.strEventoNome, evento.intCidadeID, evento.intEstadoID, evento.strEventoData, categoria.intEventoCategoriaID, categoria.strEventoCategoriaNome, cidade.intCidadeID, cidade.strCidadeNome, estado.intEstadoID, estado.strEstadoUF FROM tb_estados_escolhidos AS escolhido INNER JOIN tb_eventos AS evento ON evento.intEstadoID = escolhido.intEstadoID AND escolhido.intUserID = '$id' INNER JOIN tb_eventos_categoria AS categoria ON categoria.intEventoCategoriaID = evento.intEventoCategoriaID INNER JOIN tb_estados AS estado ON estado.intEstadoID = evento.intEstadoID INNER JOIN tb_cidades AS cidade ON cidade.intCidadeID = evento.intCidadeID WHERE evento.intUserID = '$id' OR evento.strPublic = 's'") or die(mysql_error());
$resultados = mysql_fetch_assoc($buscar_estados);
foreach($resultados as $valor){
	echo $valor['intEstadoID'];       	
}

Pedi apenas para ele mostrar o id do estado, apenas com o objetivo de teste, porém estou recebendo o seguinte erro:

 

Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
2
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
1
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
1
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
2
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
S
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
5
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
2
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
B
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
S
Warning: Illegal string offset 'intEstadoID' in C:\xampp\htdocs\info\sistema\principal.php on line 48
S

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troque isso

foreach($resultados as $valor){
  echo $valor['intEstadoID'];       
}

Por isso:

foreach($resultados as $valor){
  echo $valor;       
}

fiz um teste rápido aqui

$valor já é a info do banco, ele não é um array;

e dessa maneira, só pega o primeiro registro do resultado

 

while ($row = mysql_fetch_array($query) assim pega todos

Compartilhar este post


Link para o post
Compartilhar em outros sites

galera o tópico foi resolvido, porém eu não estou conseguindo logar pelo facebook então não consigo marcar ele como resolvido.

 

a resposta é a última postagem do cl4ng a parte q fala sobre a query com a resposta do electronic com a parte do while

 

valew todo mundo, abraço

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.