Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
2424 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  requête vers une page php depuis une autre..

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

requête vers une page php depuis une autre..

n°1930803
mgbazz
Posté le 10-10-2009 à 00:37:20  profilanswer
 

Salut à tous et toutes,
 
je m'explique :
 
Sur une page php, j'aimerai faire en sorte que lorsqu'un utilisateur clique sur un bouton pour valider un formulaire, la page se recharge et lance l'exécution d'un script qui va provoquer plusieurs changements dans une base de donnée.
 
Pas très compliqué, j'avoue... sauf que : le script est plutôt balèze (il va provoquer plusieurs INSERT, UPDATE entre autres) et je souhaiterais éviter tout risque de la part de l'utilisateur si, par exemple, il clique sur "Arrêter le chargement de la page" pendant l'exécution du script ce qui se terminerait par un taff fait à moitié dans la base de donnée et donc un gros bordel  :pt1cable: !
 
Donc ce que j'aimerai, après que l'utilisateur ait cliqué sur ce fameux bouton, c'est qu'au chargement de la nouvelle page il y ait une requête envoyée au serveur qui exécuterait une autre page.php et qui, en fonction de diverses variables (issues du formulaire) également envoyées par la requête (par exemple dans un array), ferait les modifications dans la base de donnée...
 
Le scénario tel que je le conçois :
- L'utilisateur rempli son formulaire,
- il le valide,
- la page se recharge avec les variables $_POST,
- une requête est envoyée vers une autre page.php avec les $_POST dans un array,
- l'utilisateur est redirectionné tranquillement alors que pendant ce temps le script procède aux divers changements dans la base de donnée sans risquer d'être interrompu par l'utilisateur...
 
Pour ceux qui connaissent, j'aimerai reproduire un peu ce que fait paypal avec les IPN (notifications instantannées de paiement, donc après que la personne ait validé son paiement sur paypal) lorsqu'on donne ç paypal le lien vers la page.php sur notre serveur, page dans laquelle on peut récupérer tout un tas de variables et traiter en fonction...
 
Je suis novice dans php et j'ai quelques pistes comme HTTP_REQUEST mais je ne suis pas sûr de moi...
 
Je vais continuer mes recherches mais en parallèle j'aimerai avoir votre avis si vous voulez bien me le donner ;)
 
Merci d'avance  :jap:

mood
Publicité
Posté le 10-10-2009 à 00:37:20  profilanswer
 

n°1931242
Tirkyth
I love high heels
Posté le 12-10-2009 à 14:51:31  profilanswer
 

Hello,
 
Je n'ai pas de réponse sûre à ton problème, mais voici tout de même quelques pistes :
 
1 - Faire partir la requête vers ta page de traitement via AJAX. Je suppose qu'une fois que celle-ci est partie, un utilisateur ne peut pas l'interrompre via le bouton d'arrêt de chargement de page du navigateur. Mais j'en suis pas sûr du tout !
2 - Faire partir la requête vers ta page de traitement via cURL. Pareil, je suppose que si la soumission du formulaire déclenche la requête via cURL, l'utilisateur ne peut pas l'interrompre. L'interruption fera que sa page à lui n'attendra pas le retour de la requête, mais je pense que celle-ci sera faite en intégralité.
3 - Solution qui me semble la mieux : Utiliser des transactions SQL. En gros ça consiste à dire : A partir d'ici, toutes les requêtes que je fais seront effectives sur la base que lorsque je les validerai. Ainsi, tu démarres une transaction, tu fais toutes tes modifications, et tu valides ta transaction à la fin. Si l'utilisateur interrompt le chargement de la page, la transaction ne sera pas validée, et donc aucune requête n'aura été effectuée.


---------------
Développeur Symfony2 @ Sensio Labs - http://www.symfony.com - Mon Feedback !
n°1931399
rufo
Pas me confondre avec Lycos!
Posté le 13-10-2009 à 09:59:22  profilanswer
 

Je suis d'accord avec les transactions (donc tables en InnoDB). Cela dit, j'ai un doute sur le fait que cliquer sur "stop" du navigateur arrête l'exécution du script php côté serveur. Pour moi, ça dit simplement au serveur que le navigateur ne peux pas afficher le résultat du script (ie ne veut plus recevoir d'infos en provenance du serveur pour la page donnée).
 
Perso, j'ai déjà été amené à devoir supprimer à la mano (via phpmyadmin) des requêtes bloquantes lancées par un script php et j'avais pourtant demander l'arrêt du script.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres/, ICARE, outil de gestion de conf hard et soft : http://sourceforge.net/projects/icare, E-commerce de vaisselle jetable : http://www.tablea.fr
n°1932503
deuspi
Posté le 16-10-2009 à 15:30:26  profilanswer
 

Salut,
 
Je pense que la fonction qui peut t'aider est ignore_user_abort
Voir ici : http://fr2.php.net/manual/fr/funct [...] -abort.php
 
Cette fonction permet de t'assurer que le script côté serveur ne s'interrompra pas même si l'utilisateur appuie sur Stop.
Pense aussi à mettre éventuellement un set_time_limit(0) pour que le script ne provoque pas de timeout.
Ceci dit il est toujours intéressant de se poser des questions sur l'utilisation des transactions SQL.
 
Pour info ignore_user_abort est également une directive du php.ini : voir ici http://fr2.php.net/manual/fr/misc. [...] user-abort
 
En espérant que ça t'aidera...
Bon courage.

n°1932587
mgbazz
Posté le 16-10-2009 à 17:25:49  profilanswer
 

Je vous remercie tous les trois pour vos réponses,
 
Pour le moment la solution que j'utilise est :
 

Citation :


$req="var1=".$var1_value."&var2=".$var1_value."$var3=[etc...];
 
$header .= "POST lien_vers_mon_script/script.php HTTP/1.0\r\n";
$header .= "Host: ip:port\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".strlen($req)."\r\n\r\n";
 
$fp = fsockopen ('ip', port, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
}
else {
fputs($fp, $header . $req);
 }
 
header('Location: redirection.php'); //redirection après la validation du formulaire et de la requête


 
ensuite dans script.php, je récupère les variables POST (var1, var2, var3, etc) puis le script s'exécute...
 
Ca correspond bien à mes attentes car si le client ne touche pas au chargement de la page et bien la requête part puis il est aussitôt redirectionné, sinon, dans le cas où il arriverait à stopper la page, la requête ne part pas et donc ce sera comme s'il n'avait jamais validé le formulaire...
 
Ce qui m'intéresse aussi c'est que dans mon cas le chargement de la page est vraiment très rapide vu que le script s'exécutera "ailleurs" grâce à la requête et non sur la page en cours...
 
Concernant la sécurité, je dois juste autoriser l'accès à la page script.php pour le serveur. Comme ça personne d'autre ne pourra envoyer des requêtes vers celle-ci...
 
Donc pour l'instant je continue mes petites recherches en attendant toujours vos propositions et critiques sur la méthode actuellement utilisée.
 
Je vous remercie d'avance.
 
cia

Message cité 1 fois
Message édité par mgbazz le 16-10-2009 à 19:11:41
n°1932600
Tirkyth
I love high heels
Posté le 16-10-2009 à 17:48:24  profilanswer
 

mgbazz a écrit :

Ce qui m'intéresse aussi c'est que dans mon cas le chargement de la page est vraiment très rapide vu que le script s'exécutera "ailleurs" grâce à la requête et non sur la page en cours...


Juste une question. Je ne comprend pas trop en quoi c'est plus rapide. Tu attends bien la réponse de ta requête non ? Donc c'est aussi rapide que si ça se faisait sur la page en cours non ?  :??:


---------------
Développeur Symfony2 @ Sensio Labs - http://www.symfony.com - Mon Feedback !
n°1932616
mgbazz
Posté le 16-10-2009 à 18:56:41  profilanswer
 

Le script est long (tout un tas de diverses requêtes sql...) et son exécution peut donner lieu à un long chargement de la page.
En faisant une requête vers une autre page (script.php), l'exécution du script ne se fait pas sur la page en cours et l'utilisateur peut donc être redirectionné pendant que le script s'exécute de façon indépendante.
 
Pour Tirkyth : je n'ai pas besoin de la réponse de la requête sur cette page en cours, je veux simplement que le script soit exécuté puis l'utilisateur redirectionné quels que soient les cas. C'est mon script qui va ensuite interpréter les résutats de la requête et agir en conséquent (exemple : envoyer un mail pour dire que tout s'est bien déroulé ou le cas échéant...)
 
Je peux quand même interpréter sur la page en cours l'envoie de la requête vers script.php :

Citation :


if (!$fp) {
//la requête n'a pas été envoyée
}
else {
//la requête a bien été envoyée
}


 
Si l'éxécution du script se fait sur la page en cours, l'utilisateur doit donc attendre la fin de l'éxécution du script pour ensuite être redirectionné.
D'où ma recherche pour éviter que l'annulation du chargement de la page ou la fermeture du browser ait un effet néfaste sur l'éxécution du script (en le stoppant en plein milieu par exemple)
 
Voilà, j'espère que j'ai été assez clair ^^
 
Je continue mes recherches en tenant compte de vos propositions précédentes.

n°1932617
mgbazz
Posté le 16-10-2009 à 19:10:13  profilanswer
 

Herk! Mea culpa!
Je me suis trompé dans les lignes de code que j'ai quoté dans une de mes réponses précédente,
 

Citation :


$fp = fsockopen ('ip', port, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
}
else {
fputs($fp, $header . $req);
 }


 
Voilà le bon code...
 
 
biensûr je n'attends pas la réponse du script :

Citation :


while (!feof($fp)) {
$res = fgets ($fp, 1024);
//echo $req;
}


 
Ce bout de code était donc de trop, j'ai dû prendre cette partie dans un autre fichier que j'avais fait pour réaliser quelques tests...
 
Donc oui Tirkyth, dans le cas où j'attends la réponse du script et bien oui le chargement ne sera pas plus rapide (il en va de soit...), mais en réalité je redirectionne l'utilisateur dès que la requête est envoyée (c'est à dire aussitôt après le fputs (équivalent à fwrite)...
 
Désolé !
 
Je vais éditer le message précédent en enlevant la partie du code que je n'utilise pas !

Message cité 1 fois
Message édité par mgbazz le 16-10-2009 à 19:12:21
n°1933074
Tirkyth
I love high heels
Posté le 19-10-2009 à 10:57:37  profilanswer
 

Ah je me disais bien :)


---------------
Développeur Symfony2 @ Sensio Labs - http://www.symfony.com - Mon Feedback !
n°1933764
kao98
...
Posté le 20-10-2009 à 15:45:08  profilanswer
 

mgbazz a écrit :

Herk! Mea culpa!
Je me suis trompé dans les lignes de code que j'ai quoté dans une de mes réponses précédente,
 

Citation :


$fp = fsockopen ('ip', port, $errno, $errstr, 30);
if (!$fp) {
// HTTP ERROR
}
else {
fputs($fp, $header . $req);
 }


 
Voilà le bon code...
 
 
biensûr je n'attends pas la réponse du script :

Citation :


while (!feof($fp)) {
$res = fgets ($fp, 1024);
//echo $req;
}


 
Ce bout de code était donc de trop, j'ai dû prendre cette partie dans un autre fichier que j'avais fait pour réaliser quelques tests...
 
Donc oui Tirkyth, dans le cas où j'attends la réponse du script et bien oui le chargement ne sera pas plus rapide (il en va de soit...), mais en réalité je redirectionne l'utilisateur dès que la requête est envoyée (c'est à dire aussitôt après le fputs (équivalent à fwrite)...
 
Désolé !
 
Je vais éditer le message précédent en enlevant la partie du code que je n'utilise pas !


Moi perso, je ne redirectionne pas mes utilisateurs, je les redirige.
 
Bon, ta solution me semble ... vraiment pas top. Tu réinvente la roue carrée en fait !
Comme ça t'a déjà été dit : regarde du côté des transactions SQL et de la fonction ignore_user_abort. C'est exactement ce que tu souhaites, c'est bien plus simple à mettre en oeuvre que ce que tu fais, c'est fait pour ce que tu veux faire ... bref, pas la peine de te prendre la tête à vouloir appeler un autre script depuis ton serveur.


---------------
Kao ..98 | BsA (airsoft)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  requête vers une page php depuis une autre..

 

Sujets relatifs
Lien vers une base de données localCarrousel jQuery : ne fonctionne qu'au 2e chargement de la page
Redirection de URI d'un répertoire vers VHost ApacheCh Vbs permettant recherche web et save page txt / Horloge fuseaux
Problème grosse requête PHP !Conseils pour migration Access vers Oracle
affichage des résultats d'une requête SQLProblème requête select avec double résultats
Des Tests Fonctionnels sur requête SQL[VBS] script pour copier un fichier de serveur vers un client
Plus de sujets relatifs à : requête vers une page php depuis une autre..


Hit-Parade
Copyright © 1997-2012 Hardware.fr SARL / Groupe LDLC / LesNumeriques.com / Version anglaise du site: BeHardware