Afficher message avant header(); - PHP - Programmation
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
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 ?
Marsh Posté le 13-11-2004 à 21:42:39
faire une redirection en javascript comme sur ce forum par exemple
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
Marsh Posté le 13-11-2004 à 22:15:39
autant pour moi...
en plus c'est sa que j'utilise sur mes forums :S
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.
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>" );
}
}
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 :
|
histoire que ce soit lisible
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> </p><p> </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>
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é.
Marsh Posté le 14-11-2004 à 19:37:13
Master_Jul a écrit : A la place des : |
Bof, $_POST est très bien
et au moins t'es sûr de pas manger de problèmes de collisions
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
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 :
|
pour mettre ton script en forme
parce que là c'est illisible
A part ca:
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
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
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
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
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."
Marsh Posté le 15-11-2004 à 20:00:51
Master_Jul a écrit : Masklinn : Tu sais lire ? |
"
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
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/
Marsh Posté le 15-11-2004 à 20:11:37
tu places un mini bout de PHP dedans
genre
Code :
|
qui peut devenir
Code :
|
et si t'as de gros morceaux de html "conditionnels"
Code :
|
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 : |
Citation : <script language="JavaScript"> |
il tue ton site
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 !!!!
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." |
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 :
|
Donc ca ca va nous donner un form tout con, comme ca:
Maintenant imaginons que le résultat n'est pas valide (bon avec l'exemple c'est pas facile, mais on s'en fout )
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 :
|
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
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 ).
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
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.