Contrôler une table sql régulièrement depuis php

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Contrôler une table sql régulièrement depuis php

par Rockleader » 29 Jan 2016, 17:21

Me revoilà^^


J'ai terminé ma page qui simulera la gestion d'une connexion entre deux joueurs.

Concrètement, j'ai deux types d'user:


User 1: Va sur la page et attend user2 pour un match
User2: Arrive sur la page et voit que user1 attend donc peut partir directement dans son match.

Pour user2, pas de soucis.

Pour user 1: Une fois que je me suis logué dans la table d'attente, je dois vérifier régulièrement si un user2 est arrivé (via un boolean dans la table).

Sauf que, cette vérification, je ne sais pas vraiment comment la faire.

Ma première idée, c'était de bloquer l'utilisateur sur une page qui se rechargement toute seule jusqu'à ce qu'un user2 arrive.
C'est clair que ça fonctionnera, mais il y a deux soucis:

1- Je bloque l'user sur la page et il ne peut rien faire d'autre à part observer sa page se recharger indéfiniment si personne n'arrive.

2- Je blinde l''historique de mon user avec une seule page :twisted:


Bref, c'est vraiment pas top et en plus je suis sûr que je surchargerais le serveur d'olympe qui est déjà pas super top en perf^^

J'avais aussi pensé à essayer d'adopter une sorte de timer avant de recharger la page, mais ça impliquerait de synchro également avec l'user 2 pour qu'ils partent en même temps, et ça serait vraiment trop galère.

Du coup, voyez-vous une autre solution ?


Je vois déjà le mot magique AJAX arriver; mais j'ai encore du mal à voir comment ça va marcher.

Est-ce qu'une page appelé par AJAX (donc qui ne perturbera pas l'affichage de l'user) pourra néanmoins faire une redirection sous certaine condition avec un header location ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



syrac

Re: Contrôler une table sql régulièrement depuis php

par syrac » 29 Jan 2016, 19:12

Voici commment tu pourrais procéder (mais il existe d'autres possibilités) :

Supposons que tu disposes d'un bouton Html5 indiquant l'état connecté ou non de User2. Au début le bouton est rouge, ce qui indique que User2 n'est pas connecté. Lorsqu'il passe au vert ça signifie que User2 vient de se connecter.

<button class="rouge" type="button" id="connexUser2">User2</button>

Dans ton script js (en jQuery, plus simple que le pur javascript) tu définis deux fonctions :

1- verifier() : appelle le script Php voirDansBD.php, lequel accède à la table de la BD dans laquelle sont stockées les informations de connexion. Ce script se termine par echo result, la variable result contenant 0 si User2 n'est pas connecté, et 1 s'il l'est.

<?php
// Ici on vérifie dans la BD si User2 est connecté. Attribuer le résultat à la variable result
echo result
?>

2- user2Connecte() : appelle la fonction verifier() toutes les 5 secondes.

Code: Tout sélectionner
function user2Connecte() {
    nIntervId = setInterval(verifier, 5000);
}
 
function verifier() {
    $.post("voirDansBD.php", function(data) {
        switch (data) {
            case 0 :
                break;    // Toujours pas connecté, on ne fait rien
            case 1 :
                clearInterval(nIntervId);      // Stopper la vérification
                $("#connexUser2").removeClass("rouge").addClass("vert");    // on attribue la couleur verte au bouton connexUser2
                break;
            default:
                window.alert("Une erreur est survenue !");       // voirDansBD.php  n'a renvoyé ni 0 ni 1, donc le script est bugué, ou impossible d'accéder à la BD
        }    // fin switch
    });    // fin $.post
}    // fin verifier()


Notes que $.post envoie des requêtes asynchrones.

Inutile de préciser que je n'ai procédé à aucun test.
Modifié en dernier par syrac le 29 Jan 2016, 19:46, modifié 2 fois.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Re: Contrôler une table sql régulièrement depuis php

par Rockleader » 29 Jan 2016, 19:31

J'ai tenté ceci, mais on dirait que ça ne marche pas

wait.js

Code: Tout sélectionner
function getValue(){
      var xhr=(function(){
         if(window.XMLHttpRequest)
            xhr=new XMLHttpRequest();
         else if(window.ActiveXObject){
            try{
               xhr=new ActiveXObject("Msxml2.XMLHTTP");
            }catch(e){
               xhr=new ActiveXObject("Microsoft.XMLHTTP");
            }
         }else{
            xhr=false;
         }
         return xhr;
      })();
 
      if(!xhr)return null;
 
      xhr.open('GET','isWaiting.php',false);
      xhr.send(null);
      return(xhr.readyState==4&& xhr.status==200)?xhr.responseText:null;
   };


function goToFight(){
    document.location.href="wayofshogun.olympe.in/traitement/combat.php";
};

 function startTimer(){ 
        var fight=getValue();
        if(fight==0){
            //On ne doit plus attendre
            goToFight();
        }else{
            //Il faut continuer de vérifier
            startTimer();
        }     
               
    };



Dans mon fichier php pour lancer le script dans une condition j'ai

Code: Tout sélectionner
echo '<script type="text/JavaScript" src="./wait.js">
                    startTimer();';



La page isWaiting qui devrait être appelé par ajax

Code: Tout sélectionner
<?php
  session_start();
  require_once("./../BDD/connect.php");
   $connexion = mysqli_connect(SERVEUR,NOM,PASSE,BASE);
    if(!$connexion) //si erreur
    {
            echo "Désolé, connexion à ".SERVEUR." temporairement impossible !";
            echo "Essayez plus tard !";
    }
    //CONNEXION OK

     if(isset($_SESSION['pseudo'])){
            $pseudo=$_SESSION['pseudo'];
        }else{
             header('Location: ./notFound.html');
        }
      //on recup notre pseudo
        $reqId="select idU from Utilisateur where pseudo='$pseudo'";
        $resId=mysqli_query($connexion,$reqId);
        //Un seul résultat possible
        $emp=mysqli_fetch_assoc($resId));
        $id=$emp['idU1'];
   //on check si on peut rentrer en match
       $request="select waiting from WaitMach where idU1='$id'";
       //un seul res possible
       $resReq=mysqli_query($connexion,$request);
       $emp=mysqli_fetch_assoc($resId));
         echo $emp['waiting'];


?>
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Re: Contrôler une table sql régulièrement depuis php

par Rockleader » 30 Jan 2016, 12:51

Bon, j'y suis presque, mais j'ai encore quelques problèmes liés à AJAX

Voici la fonction que je fais tourner pour tester

Code: Tout sélectionner
 function startTimer(){ 
        var fight=getValue();
        if(fight==null)fight='Ouups ! Une erreur est survenue';
        if(fight==0){
           alert(fight);
        }else{
             alert(fight);
            setTimeout(startTimer, 3000);
        }


getValue est l'appel AJAX qui devrait me retourner la valeur affiché à la fin (dans mon cas 0 ou 1) ou bien null

Code: Tout sélectionner
 function getValue(){
             var xhr=(function(){
            if(window.XMLHttpRequest)
                xhr=new XMLHttpRequest();
            else if(window.ActiveXObject){
                try{
                    xhr=new ActiveXObject("Msxml2.XMLHTTP");
                }catch(e){
                    xhr=new ActiveXObject("Microsoft.XMLHTTP");
                }
            }else{
                xhr=false;
            }
            return xhr;
        })();
 
        if(!xhr)return null;
 
        xhr.open('GET','isWaiting.php',false);
        xhr.send(null);
        return(xhr.readyState==4&& xhr.status==200)?xhr.responseText:null;
    };



L'appel AJAX semble bien se passer d'après ce que je vois sur ma console mais je retourne null au lieu de retourner ce que je veux.


Bref, il me manque de toute évidence un élément pour lier tout ça, et je ne sais pas ce que c'est
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Re: Contrôler une table sql régulièrement depuis php

par Rockleader » 31 Jan 2016, 15:56

Problème réglé en passant AJAX en asynchrone :D
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

syrac

Re: Contrôler une table sql régulièrement depuis php

par syrac » 31 Jan 2016, 20:13

Rockleader a écrit:Problème réglé en passant AJAX en asynchrone :D

Ajax est par définition asynchrone. C'est l'acronyme de Asynchronus Javascript.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite