Ana Riet 0 Denunciar post Postado Outubro 20, 2008 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
Kimura 0 Denunciar post Postado Outubro 21, 2008 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
Ana Riet 0 Denunciar post Postado Outubro 21, 2008 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
Ana Riet 0 Denunciar post Postado Outubro 22, 2008 ninguém? :( Compartilhar este post Link para o post Compartilhar em outros sites
Maykonn 6 Denunciar post Postado Outubro 22, 2008 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'] Compartilhar este post Link para o post Compartilhar em outros sites
Ana Riet 0 Denunciar post Postado Outubro 22, 2008 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
Maykonn 6 Denunciar post Postado Outubro 22, 2008 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
Maykonn 6 Denunciar post Postado Outubro 22, 2008 o mysql_data_seek só funciona com mysql_fetch_row() (não fetch_array ou fetch_assoc) achei aqui Compartilhar este post Link para o post Compartilhar em outros sites
Ana Riet 0 Denunciar post Postado Outubro 22, 2008 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
Ana Riet 0 Denunciar post Postado Outubro 22, 2008 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
Maykonn 6 Denunciar post Postado Outubro 22, 2008 É, 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
Ana Riet 0 Denunciar post Postado Outubro 22, 2008 É, 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
Maykonn 6 Denunciar post Postado Outubro 22, 2008 Meu até eu to ficando nervoso com esse while... hauihaiuha... Tenta quebrar em object com mysql_fetch_object... dai voce chama o campo $tal->nomedocampo; Compartilhar este post Link para o post Compartilhar em outros sites