Ir para conteúdo

POWERED BY:

Arquivado

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

Ana Riet

While dentro de while

Recommended Posts

oi, pessoal!

 

estou com um problema há algum tempo, que não consigo resolver de forma nenhuma. preciso rodar duas queries diferentes (já tentei fazer uma query só [e isso seria outra saída viável] mas simplesmente não deu certo pela forma como os itens estão distribuídos), uma dentro da outra, uma dependendo da outra. ou seja, botando um while dentro do outro. mas o segundo while simplesmente não é executado:

 

seguem as queries:

$query = "	select c.codChamado, c.descricao, a.nomeAnalista, sc.descrStatus,
					eu.usuario, eu.nomeEstacao,
					date_format(c.data,'%d/%m/%Y às %Hh%i') AS data
					from chamado c, analista a, statusChamado sc, estacaoUsuario eu
					where a.codAnalista = c.fkCodAnalista
					and sc.codStatus = c.fkCodStatusChamado
					and eu.codEstacaoUsuario = c.fkCodEstacaoUsuario
					and fkCodEstacaoUsuario in ($forestacoes)
					and fkCodStatusChamado in ($forstatus)
					order by eu.nomeEstacao, data";
		
		
		$query2 = "	select ic.codItemChamado, ic.info, a.nomeAnalista,
					date_format(ic.data,'%d/%m/%Y') AS data
					from itemChamado ic, analista a, chamado c
					where ic.fkCodChamado = c.codChamado
					and ic.fkCodAnalista = a.codAnalista
					and c.codChamado = '$codChamado'
					order by data";

 

e o código PHP:

 

<?
			
			
			$row = mysql_fetch_array($resultado);
										
			if ($row == NULL)
			{
				echo "	<table width=80% cellspacing=3 cellpadding=2 border=0>
							<tr>
								<td>Não há nenhum chamado aberto.</td>		
							</tr>
							<tr>
								<td> </td>
							</tr>
						</table>";				
			}
				
			else
			
			{
				
				echo "<table width=80% cellspacing=3 cellpadding=2 border=0>";
				
				$resultado = mysql_query($query);
				
				$estacao = "";
				
				while ($row = mysql_fetch_array($resultado))
				{
					
					if ($estacao <> $row["nomeEstacao"])
					{
						$estacao = $row["nomeEstacao"];
						
						echo "	<tr>
									<td colspan=2><hr>
									</td>
								</tr>	
								<tr>
									<td><b>Estação</b>:</td>
									<td><b>" . $row["nomeEstacao"] . "</b></td>
								</tr>
								<tr>
									<td><b>Usuário</b>:</td>
									<td><b>" . $row["usuario"] . "</b></td>
								</tr>
								<tr>
									<td> 
									</td>
								</tr>
						";
						
					}

					echo "<tr>
							<td width='23%'><b>Código:</b></td>
							<td>" . $row["codChamado"] . "</td>
						</tr>
						<tr>
							<td><b>Descrição:</b></td>
							<td>" .  $row["descricao"] . "</td>  
						</tr>
						<tr>				
							<td><b>Aberto por:</b></td>
							<td>" . $row["nomeAnalista"] . "</td>
						</tr>
						<tr>				
							<td><b>Em:</b></td>
							<td>" . $row["data"] . "</td>
						</tr>
						<tr>
							<td><b>Status:</b></td>
							<td>" . $row["descrStatus"] . "</td>
						</tr>
						<tr>
							<td> 
							</td>
						</tr>";
						
						$codChamado = $row["codChamado"];
												
						$resultado2 = mysql_query($query2);
					
						
						while ($row2 = mysql_fetch_array($resultado2))
						{
							
							echo "<tr>
									<td nowrap>" . $row2["data"] . "</td>
									<td nowrap>" . $row2["nomeAnalista"] . "</td>
									<td>" . $row2["info"] . "</td>
								</tr>";
								
						}
				
					
				}
							
				echo "</table>";
			}							
		
		?>

 

ele simplesmente não entra no segundo while, passando direto.

então, antes do segundo while, tentei colocar conforme vi em alguns sites a linha:

 

mysql_data_seek($resultado2,0);

mas continuou não dando certo. ele entra, dá um monte de erros e não executa direito:

 

Warning: mysql_data_seek() [function.mysql-data-seek]: Offset 0 is invalid for MySQL result index 6 (or the query data is unbuffered) in C:\xampplite\htdocs\SCEU\administrador\relchamados2.php on line 214
 Código: 9 
Descrição: Isso é um teste 
Aberto por: Alexandre 
Em: 04/09/2008 às 20h13 
Status: Em aberto 
   

Warning: mysql_data_seek() [function.mysql-data-seek]: Offset 0 is invalid for MySQL result index 7 (or the query data is unbuffered) in C:\xampplite\htdocs\SCEU\administrador\relchamados2.php on line 214
 Código: 12 
Descrição: alou alou 
Aberto por: Alexandre 
Em: 04/09/2008 às 20h20 
Status: Em aberto 
   

Warning: mysql_data_seek() [function.mysql-data-seek]: Offset 0 is invalid for MySQL result index 8 (or the query data is unbuffered) in C:\xampplite\htdocs\SCEU\administrador\relchamados2.php on line 214
 Código: 5 
Descrição: Usuário não consegue enviar emails 
Aberto por: Maria 
Em: 28/08/2008 às 17h57 
Status: Em aberto 
   

Warning: mysql_data_seek() [function.mysql-data-seek]: Offset 0 is invalid for MySQL result index 9 (or the query data is unbuffered) in C:\xampplite\htdocs\SCEU\administrador\relchamados2.php on line 214

e etc...

 

alguém tem alguma idéia do que posso estar fazendo de errado? ou esse tipo de situação é impossível de ser resolvida dessa forma e tem que ser feita com uma query só?

 

fico muito grata a quem puder me dar uma luz! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Ana,

 

Qual é o fundamento do código?

 

Porque executar duas solicitações ao mesmo tempo?

 

Responda e tentaremos de ajudar.

 

Sucesso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá, kimura! obrigada pela atenção! vou tentar explicar:

 

meu bd tem 7 tabelas, no caso as duas importantes usadas nessas queries são essas, "chamado" e "itemChamado". o chamado é composto de código, descrição, data de abertura e três chaves estrangeiras, que são os códigos de status do chamado, estação a qual o chamado de refere e código do analista que o abriu.

 

já o "itemChamado" é cada um dos movimentos do chamado, ou seja, cada passo executado. um chamado possui 0..* itens de chamado, e cada item de chamado só pertence a um determinado chamado. itemChamado contém código do itemChamado, info (descrição do "passo" feito), data e duas chaves estrangeiras, uma referenciando o código do chamado ao qual ele pertence e outra referenciando o código do analista que fez aquele efetuou aquele determinado passo.

 

resumindo, as tables:

 

#
# Structure for the `chamado` table : 
#

CREATE TABLE `chamado` (
  `codChamado` INTEGER(11) NOT NULL AUTO_INCREMENT,
  `descricao` VARCHAR(300) COLLATE latin1_swedish_ci DEFAULT '',
  `fkCodStatusChamado` INTEGER(11) DEFAULT NULL,
  `fkCodEstacaoUsuario` INTEGER(11) DEFAULT NULL,
  `fkCodAnalista` INTEGER(11) DEFAULT NULL,
  `data` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`codChamado`),
  KEY `fkCodAnalista` (`fkCodAnalista`),
  KEY `fkCodStatusChamado` (`fkCodStatusChamado`),
  KEY `fkCodEstacaoUsuario` (`fkCodEstacaoUsuario`),
  KEY `descricao` (`descricao`),
  CONSTRAINT `chamado_ibfk_1` FOREIGN KEY (`fkCodStatusChamado`) REFERENCES `statuschamado` (`codStatus`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `chamado_ibfk_2` FOREIGN KEY (`fkCodEstacaoUsuario`) REFERENCES `estacaousuario` (`codEstacaoUsuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `chamado_ibfk_3` FOREIGN KEY (`fkCodAnalista`) REFERENCES `analista` (`codAnalista`) ON DELETE CASCADE ON UPDATE CASCADE

)ENGINE=InnoDB
AUTO_INCREMENT=14 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='InnoDB free: 3072 kB; (`fkCodStatusChamado`) REFER `sceu/sta; InnoDB free: 3072 ';

#
# Structure for the `itemchamado` table : 
#

CREATE TABLE `itemchamado` (
  `info` VARCHAR(400) COLLATE latin1_swedish_ci DEFAULT '',
  `data` DATE DEFAULT NULL,
  `fkCodChamado` INTEGER(11) DEFAULT NULL,
  `fkCodAnalista` INTEGER(11) DEFAULT NULL,
  `codItemChamado` INTEGER(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`codItemChamado`),
  KEY `fkCodChamado` (`fkCodChamado`),
  KEY `fkCodAnalista` (`fkCodAnalista`),
  KEY `info` (`info`),
  CONSTRAINT `fkCodAnalista` FOREIGN KEY (`fkCodAnalista`) REFERENCES `analista` (`codAnalista`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fkCodChamado` FOREIGN KEY (`fkCodChamado`) REFERENCES `chamado` (`codChamado`) ON DELETE CASCADE ON UPDATE CASCADE

)ENGINE=InnoDB
AUTO_INCREMENT=14 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'
COMMENT='InnoDB free: 3072 kB; (`fkCodChamado`) REFER `sceu/chamado`(; InnoDB free: 3072 ';

o que eu queria fazer é apresentar um relatório pro usuário com listagem de todos os chamados e abaixo de cada um deles os passos (itens de chamado) feitos. por exemplo:

Chamado: 2

Estação: XYZ

Descrição: Blá blá

Aberto Por: João

Em: 03/08/2008 às 11h20

Status: Cancelado

 

- 10/08/2008 - Analista: Ana - Informação: Monitor está com defeito

- 13/08/2008 - Analista: Maria - Informação: Foi encomendado novo monitor

- 15/08/2008 - Analista: Alexandre - Informação: Novo monitor chegou

 

Chamado: 3

Estação: ABC

Descrição: Etc etc

Aberto Por: José

Em: 04/10/2008 às 17h00

Status: Em aberto

 

- 11/10/2008 - Analista: Ana - Informação: Blá blá

- 13/08/2008 - Analista: Maria - Informação: Blé blé

- 15/08/2008 - Analista: Alexandre - Informação: Bli bli

 

eu sei (ou melhor, imagino) que isso poderia ser resolvido de forma mais fácil com uma query sql que abrangesse tudo, e depois somente separasse os resultados diretamente no php, mas já tentei de tudo e não consegui fazer uma query assim, porque dá problema com o fato de ter duas colunas com nomes de analistas (o analista que abriu o chamado e o analista que efetuou o determinado passo [itemChamado]).

 

se alguém puder ajudar, estou num mato sem cachorro... rs! agradeço! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Ana.

Acho que para o que voce quer, seria colocar a $query2 dentro do primiero while.... Nao seria isso? ai voce faria where asdfasfdf = $row['codchamado']

Maykonn,

 

Muito obrigada pela resposta!

 

Mas tecnicamente a 2ª query está dentro do primeiro while, não? pelo menos o mysql_query está...

 

$codChamado = $row["codChamado"];
												
$resultado2 = mysql_query($query2);

de qualquer forma, movimentei toda a query pra dentro do primeiro while, imediatamente antes do código que botei acima, e continuou a mesma coisa... :(

 

 

vou endoidar! :wacko:

Compartilhar este post


Link para o post
Compartilhar em outros sites

hauihaiuahiauh

É verdade... hehe desculpa, falta de atenção.

 

Vou se acho no google algo sobre esses erros... imagino que esteja ficando nervosa com isso né... heheheh, ninguem viu isso ainda. Vamos ver se o google ja.

Compartilhar este post


Link para o post
Compartilhar em outros sites

poxa, valeu pela ajuda! :)

 

eu estou tentando há dias já, já fiz de tudo. e imagino que seja uma bobeira... algo que me diz que é algo em torno do mysql_data_seek...

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa! postamos juntos! caramba, valeu! vou dar uma olhada nisso aí... o problema é que não tenho como fazer um while iniciar dentro do outro sem o mysql_data_seek, e preciso que o retorno seja um array... rs

 

socooooorro! rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

É, fui ver exemplos no php.net... e todos sao com fetch_assoc.

Mas eu acho que se voce dar um reset($resultado2) vai dar na mesma né?

pq o reset leva o vetor para primeiro elemento do array...

ou seja, suponho que levara para a primeira linha da $resultado2 assim como a proposta do data-seek

Compartilhar este post


Link para o post
Compartilhar em outros sites

É, fui ver exemplos no php.net... e todos sao com fetch_assoc.

Mas eu acho que se voce dar um reset($resultado2) vai dar na mesma né?

pq o reset leva o vetor para primeiro elemento do array...

ou seja, suponho que levara para a primeira linha da $resultado2 assim como a proposta do data-seek

tentei isso antes do segundo while, deu outro erro....

 

reset($resultado2);

"passed variable is not an array or object". ele só vai virar array depois do mysql_fetch_array né? no qual ele não entra... então não tenho como botar isso depois. :(

 

a questão toda é que ele não entra no 2o while, em momento nenhum...

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.