Probleme construction boucle WHILE

Syl20 -  
 Syl20 -
Bonjour à tous.

J'ai un probleme dans la mise en place d'une boucle while.

J'ai ce script de compte à rebours qui depend d'une date de debut et date de fin de questions enregistrés dans une base sql. J'ai 52 questions.

require ("connectdb.php");
$id=1;
while($id < 53)//boucle pour passer à la question suivante jusqu'à la 53
{
$datedebut="SELECT date_deb,date_fin FROM parties WHERE id=$id";// selection des 2 dates pour la question 1
$date=mysql_query($datedebut)
or die('Erreur SQL !'.$date.'
'.mysql_error());
$datefetch=mysql_fetch_array($date);
$datedeb=$datefetch['date_deb'];
$datefin=$datefetch['date_fin'];
$datedebtime=strtotime($datedeb);//Conversion timestamp date_deb
$datefintime=strtotime($datefin);//conversion timestamps date_fin
$datediff=$datefintime-$datedebtime;//Différence entre les deux dates
$nbSecondes= $datediff -(mktime($datefin) % $datediff);
echo "Id question : $id<br>";
echo "Compte à rebours : $nbSecondes<br>";//c'est ce qui est récupéré par le javascript...
echo "Date debut : $datedeb<br/>";
echo "Date fin :$datefin<br/>";
echo "Timestamp deb :$datedebtime<br/>";
echo "Timestamp Date fin :$datefintime<br/>";
echo "Difference : $datediff<br/>";
$id++;
}

Il m'affiche :

Id question : 1
Compte à rebours : 118
Date debut : 2007-09-06 18:24:53
Date fin :2007-09-06 18:26:53
Timestamp deb :1189095893
Timestamp Date fin :1189096013
Difference : 120

Id question : 2
Compte à rebours : 58
Date debut : 2007-09-06 18:25:53
Date fin :2007-09-06 18:26:53
Timestamp deb :1189095953
Timestamp Date fin :1189096013
Difference : 60

Id question : 3
Compte à rebours : 58
Date debut : 2007-09-06 18:26:53
Date fin :2007-09-06 18:27:53
Timestamp deb :1189096013
Timestamp Date fin :1189096073
Difference : 60

Etc, etc, puisqu'il affiche les 52.

Ce que je souhaite, c'est n'afficher que le compte à rebours de l'ID question 1. Une fois que celui-ci est à 0, passer à l'affichage de l'ID question 2, etc, etc...

Merci d'avance.

8 réponses

pitxu Messages postés 708 Statut Membre 95
 
Je ne suis pas sur, mais essaie :

require ("connectdb.php");
$id=1;
while($id < 53)//boucle pour passer à la question suivante jusqu'à la 53
{
$datedebut="SELECT date_deb,date_fin FROM parties WHERE id=$id";// selection des 2 dates pour la question 1
$date=mysql_query($datedebut)
or die('Erreur SQL !'.$date.'
'.mysql_error());
$datefetch=mysql_fetch_array($date);
$datedeb=$datefetch['date_deb'];
$datefin=$datefetch['date_fin'];
$datedebtime=strtotime($datedeb);//Conversion timestamp date_deb
$datefintime=strtotime($datefin);//conversion timestamps date_fin
$datediff=$datefintime-$datedebtime;//Différence entre les deux dates
$nbSecondes= $datediff -(mktime($datefin) % $datediff);
echo "Id question : $id<br>";
echo "Compte à rebours : $nbSecondes<br>";//c'est ce qui est récupéré par le javascript...
echo "Date debut : $datedeb<br/>";
echo "Date fin :$datefin<br/>";
echo "Timestamp deb :$datedebtime<br/>";
echo "Timestamp Date fin :$datefintime<br/>";
echo "Difference : $datediff<br/>";
if ($nbSecondes=0) { $id++; }
}
0
Syl20
 
Merci de t'occuper de cela...

J'avais essayé cette condition, mais cela semble boucler à l'infini...
0
pitxu Messages postés 708 Statut Membre 95
 
Je suis d'accord. Je pense qu'il faut passer par une fonction javascript qui détecte que $nbSecondes=0.
0
Syl20
 
Tu aurias une idée de comment cela se fait en JS?

Cela me semble pourtant bizarre que je ne puisse pas le gerer en php...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pitxu Messages postés 708 Statut Membre 95
 
Publie la routine js pour le compte à rebours, je vais regarder.
0
Syl20
 
Voila :

<script language=javascript>

var x;

function tempsSession()
{
var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

var method = "GET";
var filename = "renvoyeTempsRestantSession.php";

var data = null;

xhr_object.open(method, filename, true);

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) {
var tmp = xhr_object.responseText;
document.form1.tempsRestantInitial.value = tmp;
document.form1.tempsRestant.value = tmp;
}
}
xhr_object.send(data);
}

function Decompte() {
//((document.form1.tempsRestant.value > 0)) ? (window.document.form1.tempsRestant.value = --valeur) : (window.clearInterval(x));
window.document.form1.tempsRestant.value--;
if (window.document.form1.tempsRestant.value == 0) {
window.clearInterval(x);
window.document.form1.submit.disabled = false;
window.document.getElementById("reponse").style.visibility="visible";

}
//function Decompte() {
//window.document.form1.tempsRestant.value = parseInt(document.form1.tempsRestant.value)--;
//if (window.document.form1.tempsRestant.value == 0) {
//window.clearInterval(x);
//window.document.form1.submit.disabled = false;
//window.document.getElementById("reponse").style.visibility="visible";
//}
}

function init() {
x = window.setInterval('Decompte()', 1000);
}

function initCompteur()
{
tempsSession();
init();

}

</script>

le champs temps.restant.initial n'est pas utilisé.

dans mon champs du form1, c'est tempsrestant...

Merci
0
pitxu Messages postés 708 Statut Membre 95
 
Apparement c'est faisable avec une imbrication de while. je cherche ...
0
Syl20
 
C'est sympa...

Je me permets également, puisque tu es dans le js, de te demander autre chose.

Pour l'instant l'affichage de mon compteur dans le script php se fait avec uniquement les secondes.

Le but, parce que je suis en train de modifier ce php, c'est un affichage de type date('i:s', $nbSecondes) du compte à rebours, pour avoir par exemple :

00:36

Bon, ça je sais faire.

Mais le pb se situe au niveau du JS. Lui, il n'accepte pas les ":". Car il traite une valeur numérique et que le : lui pose probleme. D'ailleurs, il m'affiche Nan (Not a number).
De la même façon, et lorsque j'enlèbe les :, il affiche 0036 sur la première seconde d'affichage et revient ensuite à 36. Il ne semble pas prendre les 0 des minutes, et ni le 0 si secondes <10.

Je pense que le problème vient de la définition de la value dans la fonction Decompte :

function Decompte() {
window.document.form1.tempsRestant.value--;
if (window.document.form1.tempsRestant.value == 0) {
window.clearInterval(x);
window.document.form1.submit.disabled = false;
window.document.getElementById("reponse").style.visibility="visible";

Mais je sèche... Si tu as une idée...
0