Afficher message avant header();

Afficher message avant header(); - PHP - Programmation

Marsh Posté le 13-11-2004 à 20:55:17    

Voici mon problème
 
if ($requete) {
  echo("<p><font face=verdana size=2>Votre ajout a bien été  
                envoyé.<br>.<br>Vous êtes ajouté dans la DB des  
                Users</font></p>" );
   
                header("Location:login.php" );
}
 
Il passe directement ds le .php sans afficher les messages, meme un sleep(x) ne fctionne pas.
 
Merci de votre aide.

Reply

Marsh Posté le 13-11-2004 à 20:55:17   

Reply

Marsh Posté le 13-11-2004 à 21:04:52    

les header doivent etre envoyés avant que quoique se soit soit envoyé dans l'html

Reply

Marsh Posté le 13-11-2004 à 21:34:06    

esox_ch a écrit :

les header doivent etre envoyés avant que quoique se soit soit envoyé dans l'html


 
mais si je veux afficher ce msg, je dois faire quoi ?

Reply

Marsh Posté le 13-11-2004 à 21:42:39    

faire une redirection en javascript comme sur ce forum par exemple


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Marsh Posté le 13-11-2004 à 21:59:51    

pourquoi une redirection javascript?
 
ya un truc vachement bien, c'est <meta http-equiv="Refresh" content="timer;url=@">
tu remplaces timer par le temps (en secondes) avant redirection, le @ par l'adresse de destination (login.php par exemple) et p00f
 [:spamafote]


Message édité par masklinn le 13-11-2004 à 22:00:22

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-11-2004 à 22:15:39    

autant pour moi...
en plus c'est sa que j'utilise sur mes forums :S
:lol:


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Marsh Posté le 13-11-2004 à 22:32:51    

Sinon pour info, y'a la sortie bufferisée : ob_start() qui permet de s'afranchir des problèmes de header(), cookie, etc.


---------------
En français, on écrit "connexion", pas "connection".
Reply

Marsh Posté le 14-11-2004 à 08:02:36    

Comment pourrais-je adapter mon script alors avec la solution de Masklinn ??
 
if ($ok == 1){
  mysql_connect("localhost","root","" );
  $connexion = mysql_select_db("accounters" );
     
  if ($connexion) echo "=> Vous etes bien connecté à la DB  
                           des Accounts mangagers <=";
  else echo "=> Echec lors de la connexion <=";
     
$requete = mysql_query ("INSERT INTO personnes (nom, prenom, login, service, aile) VALUES ('$nom','$prenom','$login','$service','$aile')" );
 
if ($requete) {
  echo("<p><font face=verdana size=2>Votre ajout a bien été envoyé.<br>.<br>Vous êtes ajouté dans la DB des Users</font></p>" );
  header("Location:login.php" );
 }
 else {
     echo ("<p><font face=verdana size=2>Problème de  
            requete au serveur PHP</font></p>" );
     echo ("<p><font face=verdana size=2>Veuillez  
            cliquer sur la flèche précédente de votre  
            navigateur</font></p>" );
 }
}

Reply

Marsh Posté le 14-11-2004 à 12:03:01    

on peut avoir une adresse histoire de voir la page finale?
puis le script complet aussi, mis en forme avec des balises

Code :
  1. Code :
    1. et

histoire que ce soit lisible


Message édité par masklinn le 14-11-2004 à 12:05:59

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-11-2004 à 19:22:15    

<html>
<head></head>
<body>
 
<?
 
$ok = 1;
 
$nom = $_POST["c_nom"];
$prenom = $_POST["c_prenom"];
$login = $_POST["c_login"];
$service = $_POST["c_service"];
$aile= $_POST["c_aile"];
$langue = $_POST["c_langue"];
 
 
if ($nom == "" ){ //nom du champ1
echo("<font face=verdana size=2>Vous n'avez pas complété le champ nom.</font><br>" ); //message qui s'affiche si le visiteur n'a pas rempli ce champ
$ok = 0; //si le champ1 n'a pas été rempli, la variable ok prend la valeur de 0
}
 
if ($prenom == "" ){
echo("<font face=verdana size=2>Vous n'avez pas complété le champ prénom.</font><br>" );
$ok = 0;
}
 
if ($login == "" ){
echo("<font face=verdana size=2>Vous n'avez pas complété le champ login.</font><br>" );
$ok = 0;
}
 
if ($service == "" ){
echo("<font face=verdana size=2>Vous n'avez pas complété le champ service.</font><br>" );
$ok = 0;
}
 
if ($aile == "" ){
echo("<font face=verdana size=2>Vous n'avez pas complété le champ aile.</font><br>" );
$ok = 0;
}
 
if ($langue == "0" ){
echo("<font face=verdana size=2>Vous n'avez pas complété le code langue.</font><br>" );
$ok = 0;
}
 
// retour au formulaire
 
if ($ok == 0) {
 //echo("<p>&nbsp;</p><p>&nbsp;</p><p align=\"center\"><a href=\"1.php\"><strong>Retour</strong></a></p>" );
 echo ("<p><font face=verdana size=2>Veuillez cliquer sur la flèche précédente de votre navigateur</font></p>" );
}
if ($ok == 1){
 
 //connnexion pour l'ajout :
 
 mysql_connect("localhost","root","" );
  $connexion = mysql_select_db("accounters" );
     
  if ($connexion) echo "=> Vous etes bien connecté à la DB des Accounts mangagers <=";
  else echo "=> Echec lors de la connexion <=";
     
 $requete = mysql_query
       ("INSERT INTO personnes (nom, prenom, login, service, aile) VALUES ('$nom','$prenom','$login','$service','$aile')" );
 if ($requete) {
  echo("<p><font face=verdana size=2>Votre ajout a bien été envoyé.<br>.<br>Vous êtes ajouté dans la DB des Users</font></p>" );
  header("Location:login.php" );
 }
 else {
  echo ("<p><font face=verdana size=2>Problème de requete au serveur PHP</font></p>" );
  echo ("<p><font face=verdana size=2>Veuillez cliquer sur la flèche précédente de votre navigateur</font></p>" );
 }
}
 
?>
 
</body>
</html>

Reply

Marsh Posté le 14-11-2004 à 19:22:15   

Reply

Marsh Posté le 14-11-2004 à 19:29:27    

A la place des :
$nom = $_POST["c_nom"];  
 
http://www.phpdebutant.org/article113.php
Chapitre 7
extract($_POST,EXTR_OVERWRITE);
 
Les champs vides, ça se vérifie en JS. Contente toi de ne pas exécuter la requête si l'un des champs n'est pas rempli en PHP.
 
Sinon comme autres remarques, on met plutôt les infos de connexion dans un fichier à part qu'on inclue, c'est plus propre.  
 
Les booléens (true, false) permettent de se passer de "ok=1" pas très parlant.
 
A la place de tes :
"Veuillez cliquer sur la flèche précédente de votre navigateur"
 
Dis plutôt : "Vous allez être redirigé vers la page précédente dans 3 secondes."
 
Et ajoute dans les meta de cette page ce dont Masklinn t'as parlé.


Message édité par Master_Jul le 14-11-2004 à 19:37:35
Reply

Marsh Posté le 14-11-2004 à 19:37:13    

Master_Jul a écrit :

A la place des :
$nom = $_POST["c_nom"];  
 
http://www.phpdebutant.org/article113.php
Chapitre 7
extract($_POST,EXTR_OVERWRITE);


Bof, $_POST est très bien [:spamafote]
et au moins t'es sûr de pas manger de problèmes de collisions :o  

Citation :

Les champs vides, ça se vérifie en JS. Contente toi de ne pas exécuter la requête si l'un des champs n'est pas rempli en PHP.


Faut arrêter la drogue hein [:totoz]  
Si le JS est désactivé sur la machine client, je te signale que les champs ne sont pas vérifiés > bravo, DTC en beauté et ton client l'a dans le baba
Les formulaires, ca se vérifie/traite toujours à l'arrivée côté serveur
 
 
steevi > je t'ai demandé d'utiliser les balises

Code :
  1. Code :
    1. et


pour mettre ton script en forme
parce que là c'est illisible [:itm]
 
A part ca:
 

  • Le traitement des informations PHP doit se faire avant la balise <html>

N'effectue aucun affichage, stocke les flags pour savoir ce que tu dois affiché, mais effectue tes tests & calculs avant le début de page, ca permet de clarifier le bordel

  • De plus, effectuer les tests avant permet de balancer tranquillement ses headers et de pouvoir conditionner l'utilisation de metas (qui se positionnent dans le head)
  • use et abuse d'isset sur $_POST et $_GET, ca permet d'éviter pas mal de problèmes


 
En gros ici:
 
1ère partie php
Vérifier la validité des champs $_POST et stocker les valeurs (si besoin est), si tous sont valides alors armer le flag (genre $ok = true), sinon le désarmer ($ok = false)
 
Si tous le champs sont valides et vérifiés, effectue ta requête SQL
 
2e partie, html
dans le head, afficher le meta kivabien
<meta http-equiv="Refresh" content="5;url=login.php"> si le flag est armé (que le machin a réussi)
rien ou <meta http-equiv="Refresh" content="5;url=ta_page_précédente"> si flag pas armé
 
3e partie, encore html
dans le head, affiche le(s) message(s) kivonbien:
Si réussite, ben que ca a réussi
Si échec, sur quels champs
 
Une alternative serait, en cas d'échec, de re-afficher le form d'origine (dans cette page, pas en renvoyant l'utilisateur à l'autre page) avec toutes les valeurs correctes déjà remplies, de cette manière l'utilisateur n'a qu'à compléter ce qui manque (en se basant sur tes messages) et à renvoyer [:youpi]  
 

Citation :

"Contente toi de ne pas exécuter la requête si l'un des champs n'est pas rempli en PHP."


Oui je sais lire, un champ peut être rempli avec une valeur censée être invalide (genre "ornithorynque" dans la langue) avec JS désactivé c'est pas vérifier > tous les champs sont remplis, mais la valeur non vérifiée a 9 chances sur 10 de crasher ta base ou ton script, quand c'est pas un trou de sécurité béant [:itm]  
 
Il ne faut jamais faire confiance à un utilisateur, et il faut tout vérifier de là ou on a le contrôle.
Or au niveau du JS le webmestre n'a AUCUN contrôle


Message édité par masklinn le 14-11-2004 à 19:54:33

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-11-2004 à 19:38:38    

Masklinn : Tu sais lire ?
"Contente toi de ne pas exécuter la requête si l'un des champs n'est pas rempli en PHP."

Reply

Marsh Posté le 15-11-2004 à 20:00:51    

Master_Jul a écrit :

Masklinn : Tu sais lire ?
"Contente toi de ne pas exécuter la requête si l'un des champs n'est pas rempli en PHP."


"
2e partie, html
dans le head, afficher le meta kivabien
<meta http-equiv="Refresh" content="5;url=login.php"> si le flag est armé (que le machin a réussi)
rien ou <meta http-equiv="Refresh" content="5;url=ta_page_précédente"> si flag pas armé
 
3e partie, encore html
dans le head, affiche le(s) message(s) kivonbien:
Si réussite, ben que ca a réussi
Si échec, sur quels champs "
 
comment tu fais pour tester des champs en html, suis dsl mais j'ai jamais fait de html/php

Reply

Marsh Posté le 15-11-2004 à 20:09:02    

Je te conseille ce cours très intéressant et complet en français :
http://www.le-webmestre.net/web/cours/javascript/

Reply

Marsh Posté le 15-11-2004 à 20:11:37    

tu places un mini bout de PHP dedans
genre

Code :
  1. <head>
  2.     <title>titre_page</title>
  3.     <?php
  4.         if(flag_ok)
  5.             echo "<meta...>";
  6.     ?>
  7. </head>


qui peut devenir

Code :
  1. <head>
  2.     <title>titre_page</title>
  3.     <?php if(flag_ok) echo "<meta...>"; ?>
  4. </head>


 
et si t'as de gros morceaux de html "conditionnels"

Code :
  1. <?php
  2. if(ma_condition)
  3. {?>
  4.     <!--
  5.         code html
  6.     -->
  7. <?php
  8. }
  9. else
  10. {?>
  11.     <!--
  12.         re_html
  13.     -->
  14. <?php
  15. }?>


par contre si tu utilises la 2e méthode, avoir une indentation très propre devient essentiel pour ne pas se perdre dans le source

Master_Jul a écrit :

Je te conseille ce cours très intéressant et complet en français :
http://www.le-webmestre.net/web/cours/javascript/


[:rofl]

Citation :

<script language="JavaScript">
Mon code javascript
</script>


[:rofl][:rofl][:rofl][:rofl][:rofl]
 
il tue ton site [:loom the gloom]


Message édité par masklinn le 15-11-2004 à 20:15:10

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 15-11-2004 à 21:06:47    

"Une alternative serait, en cas d'échec, de re-afficher le form d'origine (dans cette page, pas en renvoyant l'utilisateur à l'autre page) avec toutes les valeurs correctes déjà remplies, de cette manière l'utilisateur n'a qu'à compléter ce qui manque (en se basant sur tes messages) et à renvoyer."
 
Comment faire cela ?
 
NB: merci de tous tes conseils, ils fonctionnent très bien !!!!

Reply

Marsh Posté le 15-11-2004 à 21:33:59    

steevi2307 a écrit :

"Une alternative serait, en cas d'échec, de re-afficher le form d'origine (dans cette page, pas en renvoyant l'utilisateur à l'autre page) avec toutes les valeurs correctes déjà remplies, de cette manière l'utilisateur n'a qu'à compléter ce qui manque (en se basant sur tes messages) et à renvoyer."
 
Comment faire cela ?
 
NB: merci de tous tes conseils, ils fonctionnent très bien !!!!


Bah c'est pas très compliqué ca
 
Imaginons que ton form de base soit un truc à la con, disons un input text et un submit, ca va donner:

Code :
  1. <form action="validate.php" method="post">
  2.     <input type="text" name="mon_texte" /><br />
  3.     <input type="submit" value="send" /> <input type="reset" />
  4. </form>


Donc ca ca va nous donner un form tout con, comme ca:
http://img117.exs.cx/img117/364/miniform.png
 
Maintenant imaginons que le résultat n'est pas valide (bon avec l'exemple c'est pas facile, mais on s'en fout :whistle: )
Disons qu'au cours de l'initialisation la valeur de l'input text a été stockée dans la variable $text.
 
On veut réafficher le form, mais prérempli avec les valeurs reçues, on va pour cela utiliser l'attribut value des input, qui permet de fournir une valeur de départ (ou valeur par défaut)
Donc on remet notre form d'origine, mais on ajoute un attribut "value" pour l'input:text

Code :
  1. <form action="validate.php" method="post">
  2.     <input type="text" name="mon_texte" value="<?php print $text; ?>" /><br />
  3.     <input type="submit" value="send" /> <input type="reset" />
  4. </form>


et dans ce value on insère le truc qu'on a reçu.
 
et on se retrouve avec un champ pré-rempli avec la valeur réceptionnée
http://img37.exs.cx/img37/8088/miniform_pre.png
l'utilisateur n'a plus qu'à remplir ce qui manque, à re-submit, ca va renvoyer le form à la page et refaire un test de validation :)  
(et re-re-afficher le form si c'est toujours pas bon :o ).
 
Cette méthode fonctionne nickel avec les inputs, avec les <select> c'est un peu plus compliqué (regarde l'attribut "selected" des <option> ), mais loin d'être infaisable :)  
 
ouala, t'as plus qu'à modifier ton script pour faire ca
 
PS: j'ai pas testé si le code inséré en PHP fonctionnait, c'est à vérifier, il faut peut être retoucher un peu le bouzin


Message édité par masklinn le 15-11-2004 à 21:35:56

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

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