JavaScript et PHP : probléme

JavaScript et PHP : probléme - PHP - Programmation

Marsh Posté le 23-12-2007 à 16:29:03    

Bonjour à tous,
 
Je suis en train de réaliser mon portfolio en utilisant le php/mysql.
 
Dans la partie d'administration lorsque l'on valide les formulaires, on apporte les modifications à la base après vérification des données et je redirige l'utilisateur avec du javascript.
 
C'est là que ça bloque : une fois que toutes les vérifications sont faites et que les données ont été modifié dans la base, toute ma page est disparue et il ne reste que les éléments qui sont en dessous de l'instruction JavaScript ci-dessous!
 
Voici mon bout de code pour cette fonction :

Code :
  1. //Redirection
  2. $time = 2;
  3. echo "<script language='Javascript'>setTimeout('redirect(\'\')', $time*1000);</script>";
  4. //Fonction redirect() :
  5. function redirect(page) {
  6. document.location.href=page;
  7. }


 
Si je met ces quelques lignes en commentaires, tout marche correctement.
 
Merci à tous!


Message édité par Adrienm le 23-12-2007 à 16:31:28

---------------
Adrien
Reply

Marsh Posté le 23-12-2007 à 16:29:03   

Reply

Marsh Posté le 23-12-2007 à 17:04:17    

Les redirections en javascript, c'est très pas bien. Il faut le faire côté serveur en PHP justement, style :

Code :
  1. header('Location: http://tonsite.cm/page.html', true, 303);

Reply

Marsh Posté le 23-12-2007 à 17:04:38    

Et je vois déjà venir un post avec "ça marche pas, j'ai une erreur "headers already sent"" :D

Reply

Marsh Posté le 23-12-2007 à 17:14:59    

Oui, je sais mais le probléme c'est que lorsque l'on utilise "hearder('Location ..." il faut pas qu'il y a d'autres instructions auparavant...


---------------
Adrien
Reply

Marsh Posté le 23-12-2007 à 17:21:26    

Adrienm a écrit :

Oui, je sais mais le probléme c'est que lorsque l'on utilise "hearder('Location ..." il faut pas qu'il y a d'autres instructions auparavant...


Il ne faut pas qu'il y ait d'envoi au navigateur, ce qui est logique... Ca ne devrait pas poser de problèmes, ou alors il y a un problème de conception ;)

Reply

Marsh Posté le 23-12-2007 à 20:21:44    

Oui tout à fait d'accord avec la logique de la fonction "header".
Ce que je souhaiterai, c'est que lorsque le formulaire est soumis et validé (vérifications faites, et modifications de la BDD faites) un message du genre "Mise à jours réalisé avec succès, vous allez être redirigé, veuillez patienter" et ensuite du coup on redirige au bout de quelques secondes (d'où l'existance de la variable $time).


Message édité par Adrienm le 23-12-2007 à 20:22:20

---------------
Adrien
Reply

Marsh Posté le 23-12-2007 à 20:23:42    

Nan c'est pas super. Mieux vaut une page fixe, avec le message, et des liens vers ce que veux faire l'utilisateur :)

Reply

Marsh Posté le 23-12-2007 à 20:30:06    

Ah oui, c'est pas bête, tu viens de me donner une idée!
Merci je vais tester à quoi je pense et je vous tiens au courant...


---------------
Adrien
Reply

Marsh Posté le 24-12-2007 à 12:41:09    

Je viens de tester pour faire une page de validation où l'utilisateur a le choix de faire ce qu'il veut... mais cela ne marche pas! En effet, je ne peux pas mettre le header car j'aurai forcement des instructions de test avant pour savoir si le formulaire a bien été rempli.
A ce compte là, moi tout ce que je veux faire, c'est quand le formulaire est soumis et valide, que la page actuelle se re-actualise (un F5 automatique).

 

Ce qui m'inquietète le plus, c'est qu'en JavaScript ça marchais très bien avant et je ne sais pas ce que j'ai fais et hop....  :??:

Message cité 1 fois
Message édité par Adrienm le 24-12-2007 à 12:43:05

---------------
Adrien
Reply

Marsh Posté le 26-12-2007 à 16:52:30    

Adrienm a écrit :

En effet, je ne peux pas mettre le header car j'aurai forcement des instructions de test avant pour savoir si le formulaire a bien été rempli.


Non, les instructions ne devraient pas générer de sorties. D'après-toi, comment font les autres ? ;) Essaye sinon d'activer l'output buffering en début de script.

Reply

Marsh Posté le 26-12-2007 à 16:52:30   

Reply

Marsh Posté le 26-12-2007 à 18:51:01    

Une fois le formulaire soumis:
 

Code :
  1. // INSTRUCTION SQL
  2. mysql_query("INSERT INTO, UPDATE..... blablabla" );
  3. echo "mise à jour ok, redirection dans 5 secondes";
  4. echo "<meta http-equiv='refresh' content='5;url=tapage.php'>";


 
A+ ;)

Message cité 2 fois
Message édité par Johan le 26-12-2007 à 18:51:35
Reply

Marsh Posté le 26-12-2007 à 19:01:12    

Johan a écrit :

Une fois le formulaire soumis:
 

Code :
  1. // INSTRUCTION SQL
  2. mysql_query("INSERT INTO, UPDATE..... blablabla" );
  3. echo "mise à jour ok, redirection dans 5 secondes";
  4. echo "<meta http-equiv='refresh' content='5;url=tapage.php'>";


 
A+ ;)


C'est exactement ce qu'il ne faut pas faire, du début à la fin :(

Reply

Marsh Posté le 26-12-2007 à 21:18:25    

De toute façon mon code n'est pas composé ainsi... Voici un lien pour voir mon code.

 

Dans mon cas, j'ai quand même des instructions qui génére des sorties car mon en-tête est commune à toutes mes pages, je fais donc un include avant!

 

Voici mon code. Attention en le transformant en php, il y réside plusieurs erreurs car il manque le fichier de "lang" (mon application est multi-langues) et les différents fichiers appelés en en-tête de la page originale.


Message édité par Adrienm le 26-12-2007 à 21:18:48

---------------
Adrien
Reply

Marsh Posté le 26-12-2007 à 21:19:58    

Y'a de l'idée dans ton truc, tu peux facilement faire en sorte de n'avoir pas de sortie si pas d'erreurs. Met un coup d'output buffering par exemple, et problème résolu :)

Reply

Marsh Posté le 26-12-2007 à 21:47:06    

Developpe un peu, ta réponse n'est pas recevable pour moi :)

Reply

Marsh Posté le 27-12-2007 à 12:04:01    

Oui milles excuses, j'étais un peu pressé :jap:

 
Johan a écrit :

Code :
  1. // INSTRUCTION SQL
  2. mysql_query("INSERT INTO, UPDATE..... blablabla" );
  3. echo "mise à jour ok, redirection dans 5 secondes";
  4. echo "<meta http-equiv='refresh' content='5;url=tapage.php'>";


 

Alors y'a déjà un problème, au niveau de l'ordre d'affichage : les meta ne peuvent qu'apparaître dans le <head>, le texte dans le <body>. Là t'as du mélange (même si les navigateurs sont gentils et vont corriger d'eux-même l'erreur).

 

Aussi, la redirection par meta refresh est fortement déconseillée, cf. Use standard redirects: don't break the back button! (anglais)

 


Le mieux pour traiter les formulaires, c'est découper en plusieurs fichiers. T'aura un fichier principal qui se charge de vérifier/afficher le formulaire, un fichier avec le formulaire en lui-même. On peut alors facilement rediriger vers une autre url en cas de succès, avec le bon code HTTP. Genre t'as un fichier pouet.php :

Code :
  1. <?php
  2.  
  3.  $errors = array();
  4.  $nom = '';
  5.  
  6.  if($_SERVER['REQUEST_METHOD'] === 'POST') {
  7.  
  8.      $nom = isset($_POST['nom']) ? $_POST['nom'] : '';
  9.  
  10.      if(strlen($nom) === 0) {
  11.        $errors[] = 'Vous devez entrer un nom';
  12.      }    
  13.  
  14.      if(count($errors) > 0) {
  15.          
  16.         require 'formulaire.php';
  17.  
  18.      } else {
  19.  
  20.          header('Location: http://tonsite.com/succes.php', true, 303);
  21.          exit;
  22.      }
  23.  
  24.  } else {
  25.  
  26.         require 'formulaire.php';
  27.  }


A toi de structurer comme tu veux, de rajouter quelques automatisations, notemment pour ce qui est de la validation des données.

 

Et après t'as ton formulaire.php :

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  3.     <head>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5.         <title>Pouet</title>
  6.     </head>
  7.     <body>
  8.         <form action="pouet.php" method="post">
  9.             <div>
  10.                 <label for="name">Votre nom</label><br />
  11.                 <input type="text" name="nom" id="name" value="<?php echo htmlspecialchars($nom, ENT_QUOTES, 'utf-8') ?>" />
  12.             </div>
  13.             <div class="actions">
  14.                 <input type="submit" value="Envoyer" />
  15.             </div>
  16.         </form>    
  17.     </body>
  18. </html>


Message édité par FlorentG le 27-12-2007 à 12:04:47
Reply

Marsh Posté le 27-12-2007 à 15:41:58    

Merci j'en prends bonne note :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed