Page 1 sur 1

Execute fonction PHP à la fin d'un compteur

Posté : 12 sept. 2016, 11:38
par Dataes
Bonjour, a la fin de mon compteur j'aimerais executer une fonction php, j'ai utilisé AJAX, pour l'affichage ok mais je suis obligé de recharger la page pour exécuter la fonction..

Voici le compteur

Code : Tout sélectionner

<script> function decompte() { var d = new Date('<?= $perso->getDernierCoup();?>'); d.setMinutes(d.getMinutes()+1); //timing à changer var time = parseInt(d.getTime() / 1000, 10); var aujourdhui = new Date(); var time_tmp = parseInt(aujourdhui.getTime() / 1000, 10); var restant = time - time_tmp; var jour = parseInt((restant / (60 * 60 * 24)), 10); var heure = parseInt((restant / (60 * 60) - jour * 24), 10); var minute = parseInt((restant / 60 - jour * 24 * 60 - heure * 60), 10); var seconde = parseInt((restant - jour * 24 * 60 * 60 - heure * 60 * 60 - minute * 60), 10); /*document.getElementById('jours').innerHTML = jour; document.getElementById('heures').innerHTML = heure;*/ document.getElementById('minutes').innerHTML = JSON.parse(minute); document.getElementById('secondes').innerHTML = JSON.parse(seconde); if (time_tmp >= time) { // Temps fini clearInterval(temps);//Stoppe le processus déclenche par setInterval. /*document.getElementById('jours').innerHTML = 0; document.getElementById('heures').innerHTML = 0;*/ /**********************************AJAX*****************************************************************/ /* <?php //$manager->actualise($perso); ?> // doit utiliser ajax pour executer cette fonction */ /**********************************AJAX*****************************************************************/ document.getElementById('changement').innerHTML = "Vous pouvez frapper !"; } } var temps = setInterval('decompte()', 500);//Similaire à setTimeout, elle déclenche répétitivement la même action à intervalles réguliers. </script>
Je sais afficher du contenu mais est-t-il possible d'exécuter une fonction php ?

Re: Execute fonction PHP à la fin d'un compteur

Posté : 12 sept. 2016, 12:04
par @rthur
Bonjour,

Javascript s'exécute dans le navigateur, alors que PHP s'exécute côté serveur, donc tu ne peux pas en javascript exécuté une fonction PHP directement.
En revanche ce que tu peux faire, c'est en javascript (à la fin de ton compteur), faire un appel en ajax à une page PHP sur le serveur qui va exécuter ta fonction PHP.

Voici un exemple avec jquery : https://api.jquery.com/jquery.get/

Re: Execute fonction PHP à la fin d'un compteur

Posté : 12 sept. 2016, 12:54
par Dataes
Oui c'est ce que j'avais fait mais la fonction ne s'execute pas.
J'ai le retour "ok" dans le log, mais je suis quand meme obligé de rafraichir pour que la fonction passe

Code : Tout sélectionner

<script> function decompte() { var d = new Date('<?= $perso->getDernierCoup();?>'); d.setMinutes(d.getMinutes()+1); //timing à changer var time = parseInt(d.getTime() / 1000, 10); var aujourdhui = new Date(); var time_tmp = parseInt(aujourdhui.getTime() / 1000, 10); var restant = time - time_tmp; var jour = parseInt((restant / (60 * 60 * 24)), 10); var heure = parseInt((restant / (60 * 60) - jour * 24), 10); var minute = parseInt((restant / 60 - jour * 24 * 60 - heure * 60), 10); var seconde = parseInt((restant - jour * 24 * 60 * 60 - heure * 60 * 60 - minute * 60), 10); /*document.getElementById('jours').innerHTML = jour; document.getElementById('heures').innerHTML = heure;*/ document.getElementById('minutes').innerHTML = JSON.parse(minute); document.getElementById('secondes').innerHTML = JSON.parse(seconde); if (time_tmp >= time) { // Temps fini clearInterval(temps);//Stoppe le processus déclenche par setInterval. /*document.getElementById('jours').innerHTML = 0; document.getElementById('heures').innerHTML = 0;*/ /**********************************AJAX*****************************************************************/ /* <?php //$manager->actualise($perso); ?> // doit utiliser ajax var url = 'modeles/ajax_actualise.php'; //$manager->actualise($perso); $.post(url, function(data){ // affiches le contenu dans la div $('#div_fonction').html(data); }); */ $(document).ready(function(){ $.post( 'modeles/ajax_actualise.php', function(data) { console.log(data); if (data == 'ok') { $("#div_fonction").html("<?php $manager->actualise($perso); ?>"); } else { $("#div_fonction").html("<p>Vous êtes inconnu dans notre système !"); } }, 'text' /* on recoit des données de type 'text' */ ); }); /**********************************AJAX*****************************************************************/ document.getElementById('changement').innerHTML = "Vous pouvez frapper !"; } } var temps = setInterval('decompte()', 500);//Similaire à setTimeout, elle déclenche répétitivement la même action à intervalles réguliers. </script>

Re: Execute fonction PHP à la fin d'un compteur

Posté : 12 sept. 2016, 13:22
par moogli
vire le $(document).ready(function(){} qui sert à rien dans une fonction. Dans ton cas tu va empiler les demandes pour exécuter la requête post quand le document sera prêt mais il l'est déjà du coup y a peu de chance que l'event soit levé et ça risque simplement de rien faire ;).

le setInterval suffit pour déclencher le première fois (et les suivantes).


@+

Re: Execute fonction PHP à la fin d'un compteur

Posté : 12 sept. 2016, 14:51
par Dataes
Ok je l'ai enlevé, mais ca change rien, à la fin du compteur ca m'affiche bien Vous pouvez frapper !
Mais lors du click sur frapper, remet le message sans faire fonctionner la fonction, après c'est ok.

CONSTRUCTEUR

Code : Tout sélectionner

if (isset($_GET['frapper'])) { // Si on a cliqué sur un personnage pour le frapper. require_once "modeles/frapper.php"; if ($perso->getNbCoups() < 3) { require_once "vues/connect.php"; if(isset($message)){ echo $message;} } elseif ($perso->getNbCoups() == 3) {/* Compte à rebours de 1 minutes */ $perso = $manager->get($perso->nom()); //pour reprendre info temps dernier coup require_once "vues/connect.php"; include_once 'modeles/compteur.php'; include_once "vues/compte.php"; // le message } }
COMPTEUR

Code : Tout sélectionner

<script> function decompte() { var d = new Date('<?= $perso->getDernierCoup();?>'); d.setMinutes(d.getMinutes()+1); //timing à changer var time = parseInt(d.getTime() / 1000, 10); var aujourdhui = new Date(); var time_tmp = parseInt(aujourdhui.getTime() / 1000, 10); var restant = time - time_tmp; var jour = parseInt((restant / (60 * 60 * 24)), 10); var heure = parseInt((restant / (60 * 60) - jour * 24), 10); var minute = parseInt((restant / 60 - jour * 24 * 60 - heure * 60), 10); var seconde = parseInt((restant - jour * 24 * 60 * 60 - heure * 60 * 60 - minute * 60), 10); /*document.getElementById('jours').innerHTML = jour; document.getElementById('heures').innerHTML = heure;*/ document.getElementById('minutes').innerHTML = JSON.parse(minute); document.getElementById('secondes').innerHTML = JSON.parse(seconde); if (time_tmp >= time) { // Temps fini clearInterval(temps);//Stoppe le processus déclenche par setInterval. /*document.getElementById('jours').innerHTML = 0; document.getElementById('heures').innerHTML = 0;*/ /**********************************AJAX*****************************************************************/ /* <?php //$manager->actualise($perso); ?> // doit utiliser ajax */ $.post( 'modeles/ajax_actualise.php', function(data) { console.log(data); if (data == 'ok') { $("#div_fonction").html("<?php $manager->actualise($perso); ?>"); } else { $("#div_fonction").html("<p>probleme !</p>"); } }, 'text' /* on recoit des données de type 'text' */ ); /**********************************AJAX*****************************************************************/ document.getElementById('changement').innerHTML = "Vous pouvez frapper !"; } } var temps = setInterval('decompte()', 500);//Similaire à setTimeout, elle déclenche répétitivement la même action à intervalles réguliers. </script>
FICHIER ajax_actualise.php pour l'appel AJAX

Code : Tout sélectionner

<?php echo "ok"; $manager->actualise($perso); ?>
VUE COMPTE.php

Code : Tout sélectionner

<div id="div_fonction"> </div> <!--execute ajax_actualise.php grace a ajax--> <br/> <!--<span id=\"jours\"></span> Jours <span id=\"heures\"></span> heures --> <span id="changement"> Vous ne pouvez plus frapper. <br/> Frappez avec ce perso dans <span id="minutes"></span> minutes <span id="secondes"></span> secondes <br/> </span>
FONCTION APPELE DANS PersonnagesManager.class.php

Code : Tout sélectionner

public function actualise(Personnage $perso){ $date = $perso->getDernierCoup(); $currentDate = strtotime($date); //transforme en timestamp UNIX (le nombre de secondes depuis le 1er Janvier 1970 à 00:00:00 UTC) $futureDate = $currentDate+(60*1); // +1mn timing à changer //$echeance = date("Y-m-d H:i:s", $futureDate); pour remettre en normal if((strtotime("now") > $futureDate)&&($perso->getNbCoups()>=3)) { //si les deux condi sont rempli, remet à 0 nb coups $perso->setNbCoups(0); } }

Re: Execute fonction PHP à la fin d'un compteur

Posté : 13 sept. 2016, 09:14
par moogli
var d = new Date('<?= $perso->getDernierCoup();?>');
d.setMinutes(d.getMinutes()+1); //timing à changer
var time = parseInt(d.getTime() / 1000, 10);

var aujourdhui = new Date();
var time_tmp = parseInt(aujourdhui.getTime() / 1000, 10);
var restant = time - time_tmp;

restant est négatif puisque il me semble logique que le dernier coup soit antérieur à la date actuelle. Du coup les calculs de date qui suivent me semble scabreux.

if (time_tmp >= time) c'est toujours vrai (avec mon affirmation logique précédente.

$("#div_fonction").html("<?php $manager->actualise($perso); ?>");
La méthode actualise de ton objet manager retourne et affiche rien, donc inutile de mettre ça comme ça dans une chaîne de caractère JS cette partie de code ne fait que vider le contenu de l'élément html #div_fonction.
sans parler du fait que de toute façon cela afficherais toujours la même chose car php n'est évalué qu'une fois à l'affichage de la page.

var temps = setInterval('decompte()', 500);
pourquoi des ' ?
=> var temps = setInterval(decompte(), 500); ou var temps = setInterval(function(){decompte();}, 500); pour fixer le scope.



FICHIER ajax_actualise.php pour l'appel AJAX
<?php
echo "ok";
$manager->actualise($perso); ?>

si le fichier c'est ça alors il y a forcément une erreur parce que la variable $manager n'existe pas ($perso non plus du reste).

compte.php => un span ne comprend pas de <br/> c'est une balise en ligne ;) (utilise une div à la place).


Globalement je pense que tu n'as pas bien saisie ce que tu peux faire avec "ajax" et que tu te mélange les pinceaux ;)

a priori tu souhaites vérifier si la personne connectée peu "frapper" le coup suivant.
Donc ta requête serveur doit être faite vers un fichier php qui va faire ce calcul et retourner oui / ok (true / false, ok / ko c'est toi qui voit).

du coup ta fonction JS appelée avec le setInterval ne contient que l'appel serveur.
Cet appel doit aussi te permettre de "verrouilleur" (désactiver) le bouton "frapper" pour qu'il ne soit pas utilisable tant que tu estimes que le délais d'attente n'est pas dépassé.


@+