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

WoOo

Ciclo while que parece não saltar fora

15 mensagens neste tópico

Viva!

Fiz um script que funciona bem, mas da-me ideia que ele não sai do ciclo while. Digo isto porque o firefox enquanto carrega a página diz sempre no canto inferior esquerdo "Read www.dominio.com" e só fica "Done" quando a página é toda carregada!

Mas tenho o seguinte script para ir a uma tabela com datas de eventos e respectivos posters e quero que ele me imprima a imagem do proximo. Mas o ciclo while parece que fica sempre a correr não sei porque...

$q = mysql_query("SELECT e_date, e_picture FROM event ORDER BY e_date ASC");
$gap = 9999999999;

while($row = mysql_fetch_array($q)){
    $todays_date = date("Y-m-d");
    $events_date = $row['e_date'];

    $today = strtotime($todays_date); 
    $event = strtotime($events_date);
    
    if ($event > $today) {    
        if (($event - $today) < $gap) {
            $nextevent = $row['e_picture'];
            $gap = $event - $today;
        }
    }
}

Alguém me sabe identificar um erro que me esteja a escapar?

EDIT: Confirma-se que é o ciclo que demora a correr, pois deixei a página aberta algum tempo e ao fim de alguns segundos a pagina foi totalmente carregada no firefox, "Done"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo nesse ciclo onde é que escreves as coisas na página?  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah vem depois, qualquer cena como <img border="0" src="images/<?php echo $nextevent; ?>">

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah vem depois, qualquer cena como <img border="0" src="images/<?php echo $nextevent; ?>">

Penso que tens de fazer o teu echo dentro do ciclo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah vem depois, qualquer cena como <img border="0" src="images/<?php echo $nextevent; ?>">

Penso que tens de fazer o teu echo dentro do ciclo...

Isso não vai alterar a paragem do ciclo while...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

posso estar a ver ou a perceber mal mal a coisa, mas só a primeira linha com data posterior a hoje será lida...

exemplo:

hoje é dia 1...

o próximo evento é no dia 5 e o seguinte no dia 7...

começas com o gap a 999999999...

1º verificas se a data do evento é posterior à de hoje... 5 > 1... é maior...

2º verificas se a diferença entre as datas é inferior ao gap... evento-hoje=5-1=4... é inferior ao gap...

3º atribuis o valor da diferença ao gap... gap=4...

4º vai para a próxima linha da tabela...

5º verificas se o evento é depois de hoje... 7 > 1... é maior...

6º verificas se a diferença entre as datas é inferior ao gap... evento-hoje=7-1=6... gap = 4... 7 > 4... não respeita a condição, passa para a próxima linha da tabela e fará os passos 4 a 6 até chegar ao fim da tabela, daí o tempo de espera que tens depois de aparecer o 1º poster...

ou seja, só a 1ª linha lida em que a data do evento é superior à de hoje é que respeita a condição, a partir daí, todas as linhas falham...

não entendi bem se queres que te apresente todos os eventos posteriores a hoje ou só o próximo... se é só o próximo, só tens de fazer  WHERE e-date > date("Y-m-d") ORDER BY e-date ASC LIMIT 1... se são todos, é só WHERE e-date > date("Y-m-d") ORDER BY e-date... seja de um modo ou de outro, não vejo razão, pelo menos com o código apresentado, de existir a variável gap...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O tempo é convertido para strtotime(), dai o gap começar tao grande!

A ideia é mostrar apenas o proximo evento!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se é próximo, só tens de fazer o select com o where como indiquei acima e limite de 1 registo, que é o que vais mostrar... não há necessidade de fazeres os if's que tens depois...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@WoOo

Faz este teste para verificares se o ciclo continua a correr mesmo ou não...

Antes do while coloca  $num = 0; e dentro do while coloca echo $num; e $num++

mais ou menos assim:

//...

$num = 0;

while(...) {

//...

echo $num;

$num++;

}

Depois diz-me quantos números é que mostra :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porque nao usas este sql

SELECT e_date, e_picture FROM event WHERE e_date > NOW() ORDER BY e_date ASC

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

há-de mostrar o numero total de registos...

É óbvio... duh :P  Ele diz que o ciclo não para por era só mesmo confirmar :P

EDIT:

@WoOo

O ciclo só para quando aquilo acabar de ir buscar todos os resultados a BD...  :P  Se o que pretendes é que o ciclo pare depois de encontrar o próximo evento ai já é outra conversa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tem de fazer como eu escrevi e também o sven, só que com limit 1, porque só quer o primeiro registo que encontrar...:

SELECT e_date, e_picture FROM event WHERE e_date > NOW() ORDER BY e_date ASC LIMIT 1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usei esta uma dica e continua a sacar o ultimo evento mas sem todas aquelas linhas dentro do while

Obrigadão a todos!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora