Question théorique : Environnement d'exécution d'une fonction php appelé via ajax.

Petit nouveau ! | 2 Messages

12 févr. 2019, 11:40

Salut,

J'appelle une fonction php avec une commande (jquery) comme:

var result = $.post ('/php/fonctions.php', {fonction: 'citation', data: lang}, function (data) {
txt_citation.innerHTML = data.citation + "<strong>" + data.nom + "</ strong>";
}, "json");

Dans le fichier fonctions.php, j'ai une ligne "$ _POST [" fonction "] ($ _ POST [" data "]);" pour appeler ma fonction. J'ai essayé avec "call_user_func_array ($ _ POST [" fonction "], $ _POST [" data "]);" mais ça ne marche jamais, je ne sais pas pourquoi. Si vous pouvez m'expliquer pourquoi c'est bon mais ce n'est pas la raison de ce post. Quel est la procédure classique pour réaliser cela ?

Dans ma fonction, j'ai un "require /php/login.php ; ". Cette ligne ne fonctionne pas lors d'appel ajax (fonctionne en temps normal). J'ai résolu le problème avec:

$env = '/ volume1/web/site';
require $env.'/php/login.php';

Je n'aime pas cette solution qui ne fonctionne que sur un serveur spécifique! J'ai essayé avec

$ env = realpath ('.');
require $ env.'/php/login.php';

et j’ai réalisé que les fonctions telles que realpath () ne fonctionnent pas lorsqu’on appelle via ajax. Il semble que j'ai eu d'autres fonctions qui ne fonctionnent pas comme d'habitude. Par exemple, comment utiliser les fonctions de fichier php quand vous ne savez pas "où" vous êtes?

Je suppose que le serveur crée un environnement d'exécution spécial (environnement d'exécution sécurisé?) Lorsqu'il est appelé via ajax (de l'extérieur en d'autres termes). Si "require" fonctionne, "require_once" ne semble pas fonctionner...

Pourriez-vous m'expliquer ce qui ce passe au niveau de l'environnement d'exécution php (celui où ma fonction php fonctionnera lorsqu'elle est appelée depuis le client via ajax) ? D'un point de vue pratique - inutile de comprendre exactement ce qui se passe :-)

Si vous avez des exemples sur:

Comment puis-je trouver le chemin complet pour utiliser "require" directement dans ma fonction (sans lui passer cette info en paramètre), pour utiliser les fonctions de fichier (ouverture, écriture, etc) et autres trucs du même genre (en fait, tout ce qui dépend de l'environnement d'exécution) ?
Comment déboguer facilement ma fonction php lorsqu'elle est appelée via ajax? "echo $ test" ne fonctionne pas comme d'habitude (il envoie l'info à ajax) ;-)

Je connais le problème, je peux imaginer pourquoi mais je ne le comprends pas :-(

Merci de votre aide

Marc

Mammouth du PHP | 1967 Messages

12 févr. 2019, 14:21

Juste quelque piste auquelle je pense.

Les variable $_SERVER devrait pouvoir t'aider pour retrouver le bon chemin pour ton require.

En utilisant les outils de devellopeur du navigateur tu devrais voir les echo fait dans ta fonction appelée en ajax;
sinon tu peux toujours faire générer un fichier texte avec les erreurs et tes debugs.

concernant ton appel de fonction dynamique, ne serait il pas mieux d'avoir un fichier php par fonction ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 2 Messages

13 févr. 2019, 06:58

En écrivant :

$env = $_SERVER['DOCUMENT_ROOT'];
require $env.'/php/login.php';

au lieu de :

$env = realpath ('.');
require $env.'/php/login.php';

Cela fonctionne.

Si quelqu'un pouvait m'expliquer pourquoi, ce serait sympa. Une autre façon de poser la question serait :

Pourquoi la fonction realpath ('.') fonctionne en pure locale sur le serveur et qu'elle ne fonctionne plus lorsqu'elle est indirectement appelée par le client alors même que le "path" est le même ?

Pour l'instant, j'envoie mes "tests" à ma fonction appelante via "echo json_encode()" et j'affiche le résultat depuis ma fonction appelante.

Avec suffisamment de tests en entrée de mon fichier contenant toutes mes fonctions, cela devrait le faire...

Avatar du membre
Mammouth du PHP | 1609 Messages

13 févr. 2019, 15:48

Salut, à priori c'est pas une question de call ajax. C'est une question de quel est le fichier php qui est appelé par le client.
A priori le realpath('.') ne va pas se baser sur le path du fichier qui contient l'appel mais sur le path du fichier qui a été appelé.

Si tu as la structure suivante (avec l'appel de realpath dans fonctions.php) :

Code : Tout sélectionner

|- ajax | |- ajaxcall.php |- include | |- fonctions.php |- index.php

et que tu inclus le fichier fonctions.php dans index.php et dans ajaxcall.php alors le realpath('.') ne sera pas le même selon que tu appelles index.php ou ajaxcall.php car leur path n'est pas le même. Le path sera relatif au fichier appelé.

PS : généralement pour gérer ce genre de problème, j'utilise la constante __DIR__ qui retourne le path du fichier où la constante est utilisée et je pars de là pour le reste du path.
Développeur web depuis + de 20 ans