IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Fonction interne possible dans du php?


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Fonction interne possible dans du php?
    Je vous explique rapidement, ne sachant pas s'il est possible de faire ce genre de chose étant donné que le php est coté serveur et le javascript coté client.

    J'aimerais exécuter une fonction Js à l'intérieur d'une condition php (donc sans être en réaction à un event particulier).

    D'après ce que j'ai cru comprendre, on peut exécuter du Js dans du php en le mettant dans un echo.
    Mais tous les exemples que j'ai pu croiser ne montre à chaque fois qu'une fonction.

    Hors moi, ma fonction est censé en appeler une autre; en gros il s'agit de faire l'appel AJAX de getValue toute les secondes.

    Du coup, j'ai mis la fonction getValue en fonction interne de startTimer.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    echo'<script type="text/JavaScript">
                    function startTimer(){
                         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;
                    };
     
                        setTimeout(getValue,1000);
                    }';

    Q1- Est ce que le code Js mis dans l'echo sera bloquant ? i.e que setTimeout faisant des appels infinis si je puis dire, et ce code étant dans l'echo du php, est ce que je fais rester bloqué ici sans afficher le reste de la page ?

    Q2- Est ce que je peux appeler la fonction dans ma condition php depuis un fichier Js comme j'ai l'habitude de le faire pour éviter de mélanger les deux; sachant qu'elle n'est pas affiliée à un event ?


    ===============

    L'idée c'est que je vais devoir check régulièrement le contenu d'une table sql pour à moment donné faire une redirection vers une autre page.

    Je pourrais garder l'utilisateur en le forçant à rester sur la page en faisant une sorte de boucle infini en mettant un header vers sois même et ainsi exécuter de nouveau les requêtes que je veux, mais si je peux arriver au même résultat sans recharger la page avec AJAX ça serait mieux je pense (surtout que si je flingue les historiques de mes users en moins de 60 secondes ils vont me lyncher^^)


    EDIT:

    Bon voilà ce que j'ai tenté, mais on dirait que ça ne marche pas

    wait.js

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo '<script type="text/JavaScript" src="./wait.js">
                        startTimer();';

    La page isWaiting qui devrait être appelé par ajax

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <?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'];
     
     
    ?>

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Mets tout ton code javascript dans ta page comme s'il devait s'exécuter systématiquement. Ensuite si tu veux faire dépendre l'exécution de ton code javascript d'une variable php tu as deux solutions.
    - Soit tu inclus une variable php directement dans le javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <script>
    var run = <?= $variable_php ?>;// ici $variable_php est censé retourner 0 ou 1
     
    if (run == 1)
    {
     
    }
    </script>
    soit tu fais afficher la variable php dans un élément html caché (input ou div etc.) et tu récupère l'état de cette variable en javascript.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //...
    <input id = "run" type = "hidden" value = "<?= $variable_php ?>" >
    //...
    <script>
    var run = $('#run').val();// ici $variable_php est censé retourner 0 ou 1 (syntaxe avec jquery)
     
    if (run == 1)
    {
     
    }
    </script>
    La seconde méthode est souvent préférée car elle permet de mieux découpler le code javascript du code php.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Je suis obligé de faire rentrer la variable dans un div ?


    Si je reprend le code que Eric2A m'avait montré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    	<meta charset="utf-8" />
    	<title>Test</title>
    </head>
    <body>
    	<div id="result"></div>
    	<script type="text/javascript">
    	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','test.php',false);
    		xhr.send(null);
    		return(xhr.readyState==4&& xhr.status==200)?xhr.responseText:null;
    	};
     
    	var wait=getValue();
     
    	// Afficher résultat
    	if(wait==null)wait='Ouups ! Une erreur est survenue';
    	document.getElementById('result').appendChild( document.createTextNode(wait) ) ;
    	</script>
    </body>
    </html>
    Finalement ici, on mettait la valeur de wait dans l'élément result.

    Mais cela sous entends que la valeur wait est connu dans js et devrait pouvoir être traité sans spécialement avoir besoin d'un div ? Puisque je ne veux pas afficher la valeur mais seulement la traiter.


    Là, il semblerait que mon problème vienne du fait que la requete AJAX ne se fait pas.

    Je vais tenter d'insérer le code dans la page sans passer par un fichier Js...mais je trouve ça moche d'être obligé de le mettre dans le même fichier...




    EDIT:

    J'ai mis les fonction dans la page php comme conseillé, et cette fois la requête AJAX se fait bien de façon infini, mais j'obtiens des erreurs et vraisemblablement même en mo loguant avec un second user ça ne change rien.

    Warning ici
    Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.

    Et cette erreur là qui se répercute à l'infini
    waitGuerre.php:28 GET http://wayofshogun.olympe.in/traitement/isWaiting.php 500 (Internal Server Error)



    EDIT2:

    Copié collé quand tu nous tiens, j'avais gardé dans isWaiting ma requête avec une parenthèse de trop.
    D'où l'erreur dans le code et l'erreur 500.


    Donc là je vais re testé et normalement la requete AJAX ne devrait plus bug...reste à voir si ça va fonctionner... =)

  4. #4
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Pour tester à intervalle régulier, on peut utiliser à nouveau AJAX mais cette fois-ci de manière asynchrone (sa raison d'être).
    Cela évitera le Warning "Synchronous XMLHttpRequest on the main thread is deprecated" et soulagera le navigateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    var checkForFight=function(){
    	var xhr=!1,fight;
     
    	if(window.XMLHttpRequest)
    		xhr=new XMLHttpRequest();
    	else if(window.ActiveXObject){
    		try{xhr=new ActiveXObject("Msxml2.XMLHTTP");}
    		catch(e){xhr=new ActiveXObject("Microsoft.XMLHTTP");}
    	}
    	if(!xhr)return; // AJAX non pris en compte : Peu probable aujourd'hui :)
     
    	// Fonction appelée à intervalle régulier tant que la condition n'est pas remplie
    	function checking(){
    		xhr.open('GET','isWaiting.php',true); // Requête asynchrone (pas de blocage)
    		xhr.onreadystatechange=function(){
    			if(xhr.readyState==4){
    				if(xhr.status==200){
    					// Le serveur a bien répondu...
    					fight=xhr.responseText; // On récupère le retour
    					if(fight=='0'){
    						// C'est bon...
    						document.location.href="wayofshogun.olympe.in/traitement/combat.php";
    						return;
    					}
    				}else{
    					// Erreur lors de la requête au fichier
    				}
    				// Si le serveur a renvoyé une valeur différente de zéro ou une erreur est survenue
    				setTimeout(checking,10000); // un nouveau test sera effectué dans 10 secondes
    			}
    		};
    		xhr.send(null);
    	};
    	checking();
    };
     
    // Démarrer le test...
    checkForFight();
    J'ai choisi 10 secondes pour le temps d'attente entre chaque test. Cela évitera les erreurs 500 qui sont choses fréquentes chez Olympe (que j'aime quand-même).

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    J'ai rien contre Olympe non plus, sauf le fait que l'accès FTP plante de plus en plus en ce moment, je sais pas trop ce qu'ils font de leur coté..mais bon, j'imagine que c'est le lot pour ceux qui sont pas en accès premium =)

    Toujours pas pu tester depuis mon dernier EDIT à cause de l'accès ftp --'

    Sinon, pour ma part je vais être obligé de faire ça assez souvent, vu que je vais devoir lancer 2 user sur une même page, si j'en lance un avec dix secondes d'avances, au niveau du jeu ça sera pas du tout synchro, il faut qu'au départ je les lance en même temps.
    Du coup je vais devoir baisser la valeur à 1 sec ou 2 maximum.
    Après peut être que la façon dont je l'ai fais est un peu trop, j'imagine que je dois faire plus d'une requête par seconde là^^

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Si tu veux du temps réel mieux vaudrait voir node.js/socket io ou encore elephant io si tu veux utiliser php côté serveur. Avec ajax/php ça peux fonctionner mais ce n'est pas optimisé et le serveur ne pourra pas supporter des grosses montées en charge.

    Après cela dépend de tes moyens (temps et finances) car node.js demande des hébergements spécifiques et c'est moins simple qu'une requête ajax. On est encore très loin de pouvoir déployer un site node.js aussi facilement qu'un site php et donc pour l'instant on le réserve plutôt aux applications qui le nécessitent vraiment.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Comme je disais sur l'autre topic, je suis parti sur cette option en étant totalement conscient qu'il m'était impossible d'utiliser nodeJs ou peerJs (qui nécessitent d'être installé sur le serveur).

    Olympe ne permet pas ce genre de chose, pour cela il faudrait un hébergeur payant j'imagine et ce n'est pas la solution pour laquelle j'opte.

    En tout cas pas pour le moment.


    D'où la solution de passer par ajax et plus tard l'écriture dans un fichier commun.

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    J'approche du but mais j'ai encore des soucis

    On dirait que je récupère une valeur vide pour ma variable fight.

    Le alert m'indique clairement que la valeur de fight est null

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     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;
        };

    La fonction que je lance pour test


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function startTimer(){  
            var fight=getValue();
            if(fight==null)fight='Ouups ! Une erreur est survenue';
            if(fight==0){
               alert(fight);
            }else{
                 alert(fight);
                //Il faut continuer de vérifier
                setTimeout(startTimer, 3000);
            }      
     
        };
    Coté isWaiting je suis supposé renvoyé un echo donc ça devrait être bon...

    Bref, du coup, pourquoi cette condition n'est pas respecté (me retournant ainsi null ???) xhr.readyState==4&& xhr.status==200

  9. #9
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Tu n'as pas essayé le dernier code (en asynchrone) que j'ai placé ?

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Asynchrone cela veut dire qu'on laisse la main à l'utilisateur pendant les requêtes AJAX ?

    Si c'est le cas, je préférerai rester synchrone pour que l'user ne quitte pas la page d'attente. Enfin, pour le moment je fais encore des tests et j'essaye de comprendre donc c'est peut-être pas la bonne solution; cela dit, je n'ai pas vraiment vu ni compris la différence entre ce code et l'autre faisant que l'un est asynchrone et pas l'autre.

    Il faut que j'aille refaire un tour sur les tutos AJAX maintenant que je comprends un peu mieux le fonctionnement.

    Cela étant dit, le fait de ne pas être asynchrone ne devrait pas être à l'origine du renvoi de null, ou alors je suis à coté de la plaque entièrement.

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Ayant lu quelque part que le fait de rester synchrone pouvait empêcher le serveur d'envoyer la donnée au bon moment, j'ai essayé de mettre en asynchrone en re-utilisant le même code mais en remplaçant false par true.

    Malheureusement je récupère toujours la valeur null.

    Je n'ai pas directement testé ton code Eric car je n'ai pas saisi la différence avec celui que je présente là, les deux font pour moi sensiblement la même chose (si ce n'est que j'ai simplement remplacé la redirection par un alert pour mes tests.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
       <script type="text/JavaScript">
                    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',true);
            xhr.send(null);
            return(xhr.readyState==4&& xhr.status==200)?xhr.responseText:null;
        };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function startTimer(){  
            var fight=getValue();
            if(fight==null)fight='Ouups ! Une erreur est survenue';
            if(fight==0){
                //On ne doit plus attendre
               // goToFight();
               alert(fight);
            }else{
                 alert(fight);
                //Il faut continuer de vérifier
                setTimeout(startTimer, 3000);
            }      
     
        };

  12. #12
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    La différence c'est la présence de la propriété onreadystatechange nécessaire lors de l'envoi de requêtes en asynchrone.

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Ah effectivement ça m'avait échappé !

    J'ai donc testé ainsi et ça a marché parfaitement =)


    Par contre, j'ai pu voir sur la console de chrome que je me suis mangé pas mal d'erreur 500 provenant d'olympe.

    Du coup, ça veut dire que si le serveur d'olympe déconne avec une erreur 500. Que deux de mes users veulent faire un match, ça va faire quoi au niveau du code, il sera ignoré ou bien mis en attente ou bien ... ???


    Ce qui serait bien c'est que je puisse détecter ce genre d'erreur pour prévenir l'user que le problème vient du serveur Olympe.

    Parce que concrètement, si j'avais pas la console, j'aurais pas vu ces erreurs du serveur.

    Merci en tout cas

  14. #14
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Citation Envoyé par Amnael Voir le message
    Q1- Est ce que le code Js mis dans l'echo sera bloquant ? i.e que setTimeout faisant des appels infinis si je puis dire, et ce code étant dans l'echo du php, est ce que je fais rester bloqué ici sans afficher le reste de la page ?
    Juste pour que ça soit clair : PHP envoie du texte. Peu importe que ce soit du code HTML, JS ou autre, pour lui il n'y a que du texte. La machine qui exécute le code PHP, c'est-à-dire ton serveur, ne sait pas interpréter le JavaScript. Elle envoie du texte au client, le navigateur. En mettant de côté les techniques de chargement optimisé employées par les navigateurs, les choses se passent en gros comme ça : le serveur envoie la totalité de la page, (html, JS, etc.) et termine l'exécution du PHP. Le navigateur attend d'avoir reçu tout le texte avant de commencer l'analyse (c'est là que je mets de côté les optimisations). Quand toute la page est chargée, le navigateur sépare les différents langages, et passe la main à son moteur JavaScript s'il y a du code JS. À ce moment la phase d'exécution du code PHP par le serveur est terminée depuis longtemps !

    Je pourrais garder l'utilisateur en le forçant à rester sur la page en faisant une sorte de boucle infini en mettant un header vers sois même et ainsi exécuter de nouveau les requêtes que je veux, mais si je peux arriver au même résultat sans recharger la page avec AJAX ça serait mieux je pense (surtout que si je flingue les historiques de mes users en moins de 60 secondes ils vont me lyncher^^)
    Citation Envoyé par Amnael Voir le message
    Asynchrone cela veut dire qu'on laisse la main à l'utilisateur pendant les requêtes AJAX ?

    Si c'est le cas, je préférerai rester synchrone pour que l'user ne quitte pas la page d'attente.
    Tu as une bonne intuition quand tu penses que tu vas te faire lyncher En réalité tu ne peux pas « prendre la main » sur le navigateur de ton visiteur, ce serait percu comme intrusif (quand bien même ce serait possible de manière infaillible, ce qui est loin d'être le cas). On ne développe pas comme ça aujourd'hui. L'utilisateur est libre de faire ce qu'il veut, et c'est au développeur de prévoir tous les cas de figure.

    En l'occurence, ce n'est pas grave si l'utilisateur quitte la page, car dans ce cas toutes les requêtes Ajax sont automatiquement annulées par son navigateur. Du coup ça libère de la charge sur ton serveur. Et s'il rate un match, il ne peut s'en prendre qu'à lui-même… Ce que tu peux faire, c'est lui demander confirmation à la fermeture de la page grâce à l'évènement onbeforeunload.


    Citation Envoyé par Amnael Voir le message
    Malheureusement je récupère toujours la valeur null.
    Tu récupères null ou bien une valeur équivalente à null ? Je vois dans ton script que tu testes la valeur 0. En JS, 0 et null sont tous deux équivalents à false, à moins que tu utilises l'opérateur de comparaison stricte, le « triple-égal » :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (fight === null)
    De manière générale, il est recommandé de toujours utiliser la comparaison stricte, sauf cas particuliers.

    Note que responseText est toujours de type string, donc si ton serveur envoie un 0, JS le verra comme la chaîne "0" qui, elle, n'est pas équivalente à false.


    Citation Envoyé par Amnael Voir le message
    Ce qui serait bien c'est que je puisse détecter ce genre d'erreur pour prévenir l'user que le problème vient du serveur Olympe.
    Tu peux ! Il suffit de prévoir un cas pour xhr.status === 500.



    Une suggestion : tu peux alléger un peu la charge de ton serveur en attendant la réponse ajax avant de relancer le timer (si tu ne l'as pas déjà fait). Concrètement, déplace ton appel à setTimeout dans la fonction onreadystatechange.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Après si par ailleurs tu dois utiliser jquery pour utiliser un des nombreux modules disponibles - ce qui ne serait pas étonnant dans le type d'application que tu développe - tu peux aussi utiliser jquery pour tes requêtes ajax, c'est quand même plus facile et agréable à écrire.

  16. #16
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Puisqu'on parle de ça, je pense qu'on peut arrêter d'utiliser les ActiveX ajax, ils sont obsolètes depuis longtemps… Depuis que Microsoft a officiellement euthanasié IE6, on peut faire sans crainte la supposition que XMLHttpRequest est supporté par tous les navigateurs, et s'épargner cette disgrâcieuse combinaisons de if et de try/catch.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  17. #17
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Tu n'es pas le premier à me conseiller d'utiliser jquerry notamment pour AJAX.

    Et je vais te répondre la même chose qu'aux autres =) J'ai pour credo de ne pas utiliser une techno permettant de faire des choses que je ne comprends pas.

    Parce que autrement, c'est un terrain propice à se retrouver avec des bugs à la fin qu'on ne comprends pas.

    Comment dire, c'est comme si un mec t'envoyait une fonction pour un projet et te disait, t'en fais pas elle fonctionne parfaitement. Comme t'es consciencieux tu y jettes quand même un coup d'oeil, mais manque de bol, ça fait appel à certains points que tu ne connais pas, du coup impossible de vérifier par toi même qu'elle marche.

    Tu fais quoi ? TU l'utilises en prenant le risque de te retrouver avec un bug que tu comprendras pas, ou bien tu fais ta propre fonction, que tu sais fonctionnelle et que tu comprends et donc que tu pourras débug ?

    J'exagère un peu, mais c'est l'idée; et c'est pour ça que je me refuse à jquerry pour le moment.

    Bien sûr, il y a surement des choses que l'on peut faire simplement avec jquerry, et un jour où l'autre j'en ressentirais le besoin, mais avant ça je préférerais m'assurer de maîtriser correctement le Js basique. Et ce jour là quand je m'y mettrais je comprendrais par moi-même en quoi telle ou telle chose est bien plus pratique qu'une autre.


    Désolé je me suis un peu égaré pour le coup^^


    =============================

    Cela étant dit, quelqun pourrait-il m'expliquer pourquoi dans mon problème il n'était pas possible de recevoir la donnée en mode synchrone alors que le passage an asynchrone a permis de recevoir cette donnée ?

    J'ai bien compris qu'ajax avait été imaginé pour tourner en asynchrone, mais en quoi le cas contraire empêchait le bon fonctionnement ?


    Merci à vous.

  18. #18
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Citation Envoyé par Amnael
    mais en quoi le cas contraire empêchait le bon fonctionnement ?
    Voir la réponse de Watilin...
    Citation Envoyé par Watilin
    responseText est toujours de type string, donc si ton serveur envoie un 0, JS le verra comme la chaîne "0"
    D'ailleurs dans la version en asynchrone (qui fonctionne) on a bien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(fight=='0'){
    	// C'est bon...
    Citation Envoyé par =Watilin
    Concrètement, déplace ton appel à setTimeout dans la fonction onreadystatechange.
    C'est déjà fait


    Concernant ton choix d'étudier consciencieusement le langage avant d'attaquer une bibliothèque comme jQuery...

    Je suis entièrement d'accord avec toi !

  19. #19
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    responseText est toujours de type string, donc si ton serveur envoie un 0, JS le verra comme la chaîne "0"
    Justement, si je suis votre logique (je faisais mes test avec des alert et ce peut importe la valeur de ma variable).

    A chaque fois j'obtenais un affichage pour ainsi dire vide. Il aurait pu m'afficher "0" mais il n'y avait rien.

    En gros, je n'avais rien en retour du serveur sur un premier alert, et il n'y a qu'après la ligne du Oups que j'avais une valeur affiché.

    Enfin je sais pas c'est bizarre, car si j'en crois vos explications 0 et null sont similaire. Donc dans mon premier alert j'aurais au moins du avoir 0 d'affiché.



    Bon au pire c'est pas très grave, j'avais du faire un truc pas très net que j'ai rectifié sans faire attention^^ L'important c'est que j'ai saisi la nuance.

    Quoi qu'il en soit, merci à tous, je vais continuer à mon rythme mon truc (toujours mieux que de rien faire en attendant des réponses de stage --')

  20. #20
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    En fait, la valeur « falsy » pour le type string, c'est la chaîne vide "" (ou '', c'est pareil). Tout le reste équivaut à true, donc la chaîne "0" équivaut à true. C'est piégeux… En revanche, si tu convertis ta chaîne en nombre (par exemple avec parseInt), tu auras un 0 de type number qui est bien « falsy ».
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/11/2014, 09h36
  2. [MySQL] Utiliser la fonction sql EXECUTE dans script PHP
    Par boozook dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 07/12/2012, 22h43
  3. [EasyPHP] [Apache] appel de fonction JS fonctionne dans .html et pas .php
    Par durand2504 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 09/03/2006, 15h14
  4. appel de fonction JS fonctionne dans .html et pas .php
    Par durand2504 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/03/2006, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo