Aide pour affichage d'un décompte

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Aide pour affichage d'un décompte

Re: Aide pour affichage d'un décompte

par macgawel » 10 mars 2011, 14:34

@Steal35
Ce que tu me donnes fait à peu près la même chose que ce que je fais avec ma fonction chrono (quand je met son contenu directement sur la page et pas dans une fonction), à savoir afficher une suite de chiffre de 1 à 10.
Moi ce que je voudrais c'est un affichage "chronomètre", cad afficher 10, puis 9, 8, etc... en remplaçant le nombre à chaque fois, comme dans un chrono, et à rebours en commençant à 10.
A noter qu'il faudra que tu m'explique un peu l'utilité de flush et autre, j'ai regardé la doc pour comprendre, mais sans succés :(
Utilité de flush() (en gros) :
Classiquement :
- Le client (navigateur) envoie une requête au serveur.
- Le serveur traite toute la demande (il exécute tout le script PHP, par exemple).
- Le serveur envoie le résultat.
Le client récupère donc une page "finie".

L'utilisation des flush permet :
- Le client (navigateur) envoie une requête au serveur.
- Le serveur traite une partie de la demande (via PHP, par exemple).
- Le serveur envoie un début de résultat via flush.
Le client récupère donc une page "pas finie", qui se complétera à mesure des flush ou à la fin du script.

Tu peux tester avec la fonction de Stealth35 et ton script.
Avec ton script, le serveur effectue toutes les opérations puis envoie la page.
=> Il boucle de 10 à 0, et affiche d'un coup 10 9 8 7 6 5 4 3 2 1 0 (à la fin de la boucle).
Avec le script de Stealth35, il boucle de 10 à 0 et affiche dans la boucle. Tu verras donc 10 puis (à la suite) 9 etc.
@macgawel
Je ne connais pas bien javascript mais je suppose qu'en faisant comme tu dis, on obtient un code où, le but étant d'incrémenter de 1 une variable à chaque fin de compte à rebours, c'est la page qui calcule elle même le compte puis qui envoie un signal au serveur lui demandant de faire l'incrémentation. En gros les calculs se font du coté client et le serveur ce la joue bête et discipliné.
Hors si on applique ça à des programme comme, par exemple, les jeux sur navigateur (genre là où tu clique sur "construire entrepôt", ça gobe 200 bois, puis deux heures après t'as un entrepôt tout neuf) ou encore les sites comme rapidshare où tu dois attendre 30 sec avant de télécharger, c'est la porte ouverte à toute les tricheries., c'est la porte ouverte à toute les tricheries.
Ce que je voudrais faire c'est un système où le serveur travaille de son coté, tout en faisant en sorte que le client puisse voir le décompte.

Si j'ai pas été clair où si vous avez d'autres questions, n'hésitez pas ;)
Le plus simple à mon avis c'est de coupler JS + php (éventuellement avec de l'AJAX).
1. Le client valide (en cliquant sur le bouton).
2. Le serveur exécute le script et renvoie une page d'attente.
3. Sur cette page, côté client, un JS effectue le compte à rebours.
4. Comme le JS s'exécute côté client, il faut "bloquer" côté serveur. Plutôt que de faire un script qui va tourner pendant 10 sec. (même avec des sleep), il vaut mieux mémoriser l'heure de la dernière demande.

Les parties 1 à 3 sont simples.
Pour la 4, c'est (un peu) plus délicat. Il y a plusieurs possibilités, qui reposent toutes sur le même principe :
On stocke la date de la dernière demande, et quand on reçoit la prochaine demande on compare les dates.
Par exemple, tu peux utiliser les sessions : tu stockes une variable $_SESSION['date_derniere_construction']
$_SESSION['date_construction'] = time(); // date à laquelle le serveur reçoit la demande 
if ( $_SESSION['date_derniere_construction'] - $_SESSION['date_construction'] < 10 ) {
   // Pas assez de délai => on bloque
}
else {
   // Le délai est respecté => on fait le traitement
}
$_SESSION['date_derniere_construction'] = $_SESSION['date_construction'];
Il est aussi envisageable d'utiliser un champ caché qui contient la date de la dernière demande (ou mieux une valeur dépendant de la date).
Pour des jeux (où il y a plusieurs actions qui demandent du temps, et parfois un temps trop long pour être géré avec les sessions), tu peux stocker la date de la demande dans la BDD, et à chaque demande du client faire la comparaison.

Re: Aide pour affichage d'un décompte

par donkeykong » 07 mars 2011, 20:13

Merci pour vos réponses.

@Steal35
Ce que tu me donnes fait à peu près la même chose que ce que je fais avec ma fonction chrono (quand je met son contenu directement sur la page et pas dans une fonction), à savoir afficher une suite de chiffre de 1 à 10.
Moi ce que je voudrais c'est un affichage "chronomètre", cad afficher 10, puis 9, 8, etc... en remplaçant le nombre à chaque fois, comme dans un chrono, et à rebours en commençant à 10.
A noter qu'il faudra que tu m'explique un peu l'utilité de flush et autre, j'ai regardé la doc pour comprendre, mais sans succés :(

@macgawel
Je ne connais pas bien javascript mais je suppose qu'en faisant comme tu dis, on obtient un code où, le but étant d'incrémenter de 1 une variable à chaque fin de compte à rebours, c'est la page qui calcule elle même le compte puis qui envoie un signal au serveur lui demandant de faire l'incrémentation. En gros les calculs se font du coté client et le serveur ce la joue bête et discipliné.
Hors si on applique ça à des programme comme, par exemple, les jeux sur navigateur (genre là où tu clique sur "construire entrepôt", ça gobe 200 bois, puis deux heures après t'as un entrepôt tout neuf) ou encore les sites comme rapidshare où tu dois attendre 30 sec avant de télécharger, c'est la porte ouverte à toute les tricheries., c'est la porte ouverte à toute les tricheries.
Ce que je voudrais faire c'est un système où le serveur travaille de son coté, tout en faisant en sorte que le client puisse voir le décompte.

Si j'ai pas été clair où si vous avez d'autres questions, n'hésitez pas ;)

Re: Aide pour affichage d'un décompte

par stealth35 » 07 mars 2011, 17:43

après ca dépend du navigateur/serveur, mais PHP sait très bien le faire :wink:

Re: Aide pour affichage d'un décompte

par macgawel » 07 mars 2011, 17:39

mais si c'est possible, (revoie les bases :wink: )
Je sais, on en avait déjà parlé (ICI).

Mais :
1. Ca ne fonctionne pas sous Chrome (d'après stopher)
2. Vu l'idée de départ et le niveau annoncé, je pense que les fonctions de bufferisation ne constituent pas une réponse pertinente...
3. On parle d'un compte à rebours en secondes. Tes fonctions gèrent bien l'envoi du décompte en temps réél, mais pas l'affichage...

Re: Aide pour affichage d'un décompte

par stealth35 » 07 mars 2011, 17:20

Bonjour à tous.
Bonjour.
Pouvez vous me donner quelques indications sur ce que je devrais faire s'il vous plait ?
Reprendre les bases :mrgreen:

PHP est un langage utilisé côté serveur.
Du coup, tu ne peux pas avoir un compte à rebours côté client. Et PHP (qui travaille côté serveur) ne peux pas gérer l'évènement onclick (côté client).

=> utilises du Javascript pour ta fonction chrono.
mais si c'est possible, (revoie les bases :wink: )
un coup de ob_implicit_flush, ou un coup de ob_flush + flush
ob_start();

for($i=0;$i<10;$i++)
{
    echo $i, '<br />';
    ob_flush();
    flush();
    sleep(1);
}
ob_implicit_flush();

for($i=0;$i<10;$i++)
{
    echo $i, '<br />';
    sleep(1);
}

Re: Aide pour affichage d'un décompte

par macgawel » 07 mars 2011, 16:27

Bonjour à tous.
Bonjour.
Pouvez vous me donner quelques indications sur ce que je devrais faire s'il vous plait ?
Reprendre les bases :mrgreen:

PHP est un langage utilisé côté serveur.
Du coup, tu ne peux pas avoir un compte à rebours côté client. Et PHP (qui travaille côté serveur) ne peux pas gérer l'évènement onclick (côté client).

=> utilises du Javascript pour ta fonction chrono.

Aide pour affichage d'un décompte

par donkeykong » 07 mars 2011, 15:19

Bonjour à tous.

Je suis débutant en PHP et pour m'initier j'ai voulu créer une petite page sans trop me prendre la tête (et qui n'a aucune utilité puisque c'est pour m'initier) :

Code PHP :
<body>
<?php 
/* variables */
$nombre_maisons = 0;
$temps = 10;

/*corps */
echo "Nombre de maisons :  </br>";
echo "$nombre_maisons </br>";
echo "</br> Chrono : </br>";

echo "<input type='button' value='Construire' name='construire'>" ;

?>
 
</body>
</html>


Bien sûr, ce code n'est pas encore terminé.
Explication de ce que je voudrais arriver à faire : on a au début un nombre de maison égal à zéro, quand on appuie sur le bouton "construire" un compte à rebours de 10 secondes se lance, à la fin de ce compte à rebours $nombre_maisons est incrémenté de 1.

J'essaie notamment d'afficher le compte à rebours en temps réel sur l'écran, c'est à dire que je voudrais faire en sorte que le défilement des chiffres s'affiche.

J'avais pensé à une fonction qui serait lancée lors du clic sur le bouton :
Code PHP :
function chrono()
{
	while ($temps > 0)
	{
		echo "$temps </br>";
		$temps--;
	}
}


Mais de 1) ça affiche "10987654321" alors que moi je veux "10", puis "9", etc...
et de 2) ça ne marche pas quand j'appelle la fonction avec "onclick" sur le bouton "construire".

Pouvez vous me donner quelques indications sur ce que je devrais faire s'il vous plait ?
Uniquement sur l'affichage du chrono, le reste je me débrouilles.
Merci d'avance.