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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    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 confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 415
    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 415
    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 éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    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 Expert
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    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 éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    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 confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 415
    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 415
    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.

+ Répondre à la discussion
Cette discussion est résolue.

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