8791 sujets

Développement web côté serveur, CMS

Bien le bonjours à tous,

et bien tout est dans le titre.
Je viens demander de l'aide car j'ai réalisé un formulaire en html ensuite je l'ai soumis à une vérification javascript simple pour les champs vides ou mal renseigner. (javascript inclus dans le header de ma page)

Ensuite par le biais de la methode POST j'effectue le traitement des données dans une page php.
Et je termine par une redirection vers une page confirmant l'envois du message ainsi que de données.
Mais je n'arrive pas à récupérer les données sur la page de confirmation pour les afficher à l'utilisateur.

Je vais vous montrer ma page de traitement des données :


<?php header("Content-Type: text/html; charset=utf-8");//Définition du type d'encodage texte 
?> 
<?php
 
//Initialisation des variables
$server = '*****';
$user = '****';
$pass = '****';
$table = Formulaire;
$db = 'mabasededonner';
 
//Connexion à la base de donnée
mysql_pconnect($server, $user, $pass)
or die("Impossible de se connecter au serveur $server");
 
//Selection de la base de donnée
mysql_select_db($db)
or die("impossible de se connecter à la base $db");
	$Nom = $_POST['nom'];
	$Mail = $_POST['mail'];
	$Message = $_POST['message'];
 
//Définition du destinataire ainsi que du sujet de l'email
define('MAIL_DESTINATAIRE','alfred@gmail.com');
define('MAIL_SUJET','Message du formulaire de donchofolio');
 
//Préparation de l'entête du mail:
$mail_entete = "MIME-Version: 1.0\r\n";
$mail_entete .= "From: {$Nom} "
             ."<{$Mail}>\r\n";
$mail_entete .= 'Reply-To: '.$Mail."\r\n";
$mail_entete .= 'Content-Type: text/plain; charset="iso-8859-1"';
$mail_entete .= "\r\nContent-Transfer-Encoding: 8bit\r\n";
$mail_entete .= 'X-Mailer [langue]HP/' . phpversion()."\r\n";
 
//Préparation du corps du mail
$mail_corps = "Message de : $Nom\n";
$mail_corps .= $Message;
 
//Envoi du mail
mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete);  	
$query = "INSERT INTO $table (nom, mail,message )
VALUES ('$Nom', '$Mail', '$Message')";
 
//Résultat de l'envois des informations à la base de donnée
$resultat = mysql_query($query)
or die("L'insertion a echouée car ". mysql_error() ."."); 
 
//Redirection sur la page de résultat d'envois
header("Location: contact_result.php"); exit;
?>


La page contact_result.php étant la page sur laquelle je désire afficher la confirmation de l'envois.

Comment puis-je faire pour transmettre les données de la page php initiale à la page contact_result.php ?

J'espère avoir été clair.
Merci pour vos futures réponses.

Cordialement Greg.
Modifié par doncho (11 Dec 2009 - 14:02)
Salut,

il y a plusieurs solutions, la plus propre à mon sens étant peut-être de créer des variables de session contenant les données de ton formulaire, que tu supprimes sur la page suivante (contact_result.php), après récupération ou affichage, avec un unset.

Ceci dit, n'est-il pas plus simple dans ton cas d'afficher directement la confirmation et les données dans ta page de traitement des données? Avec une condition du type: si l'envoi est réussi, alors affiche la confirmation et les données, sinon affiche l'erreur.

Non moins cordialement,
Polly Jean
Merci pour ta réponse.
C'est vrai que le faire directement dans la page peut être une meilleur solution.
Je testerai ça demain et je viendrais donner de mes nouvelles.

Bonne soirée à toi.

Cordialement Greg.
Hello,

Puisque tu as fait un INSERT pourquoi ne pas faire une requête sur la page de confirmation ?

Comme tu as forcément mis un id unique en auto-increment ( Smiley smile ) ça doit donner quelque chose de ce genre :
SELECT nom, mail, message FROM $table ORDER BY id DESC LIMIT 0, 1 
Vu que c'est le dernier enregistrement inséré ça devrait suffire mais tu peux aussi récupérer l'id du dernier INSERT à l'aide de mysql_insert_id et le passer dans le header en variable GET.

Polly-Jean a écrit :
Ceci dit, n'est-il pas plus simple dans ton cas d'afficher directement la confirmation et les données dans ta page de traitement des données? Avec une condition du type: si l'envoi est réussi, alors affiche la confirmation et les données, sinon affiche l'erreur.
Ce serait effectivement bien plus simple mais le problème de ne pas faire de redirection est qu'un réaffichage de la page (F5) va refaire un INSERT et renvoyer un mail. Smiley cligne
Heyoan a écrit :
Ce serait effectivement bien plus simple mais le problème de ne pas faire de redirection est qu'un réaffichage de la page (F5) va refaire un INSERT et renvoyer un mail. Smiley cligne


Oups! Autant pour moi... Smiley confused
Hum je comprend le soucis de le faire sur la même page.
Donc je regarderai à soit faire une session soit faire ce que tu me propose Heyoan bien que je ne comprenne pas tout étant novice en PHP.

Enfin si j'ai une question je reviendrai la poser.

Merci pour ta réaction.

Cordialement Greg.
Heyoan a écrit :

Comme tu as forcément mis un id unique en auto-increment ( Smiley smile ) ça doit donner quelque chose de ce genre :
SELECT nom, mail, message FROM $table ORDER BY id DESC LIMIT 0, 1 
Vu que c'est le dernier enregistrement inséré ça devrait suffire


Hum quand tu parle d'avoir mis un id unique en auto-increment. C'est quelque chose que l'on doit définir à la création de la table dans phpmyadmin pour chaque elements de la table?

Si oui quand je coche la case unique et que je choisi auto-increment dans le menu déroulant extra, il me retourne une erreur.

Je te montre l'erreur :


CREATE TABLE  `donchofomail`.`Formulaire` (

`nom` VARCHAR( 30 ) NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (  `nom` )
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci
MySQL a répondu:

#1063 - Incorrect column specifier for column 'nom' 


Voilà, j'espère que je ne dis pas de bêtises.

Cordialement Greg.

Edit =

Je crois avoir compris.
Quand tu parles d'id unique en auto-increment, il faut rajouter un champ au départ avec une valeur INT de nom "id" en auto-increment avec la case primaire coché ?

Si je me plante n'hésitez pas à ma le dire... Smiley confused

Merci
Modifié par doncho (08 Dec 2009 - 13:49)
Aïe ! Effectivement il te manque quelques notions de base ! Smiley langue

Pour des raisons de normalisation (cet article peut sembler un peu ésotérique mais en fait c'est relativement simple dans la pratique... avec un peu d'entraînement) et parce que ça simplifie la vie on doit pouvoir retrouver un enregistrement grâce à une clef primaire.

Sans entrer dans le détail on utilise fréquemment un identifiant numérique qu'on incrémente de 1 à chaque nouvel enregistrement. Comme ça on est sûr d'avoir un identifiant unique et comme la plupart des SGBD gèrent l'auto-increment on n'a pas à s'en soucier.

Pour Mysql cela donnerait quelque chose de ce genre (à noter que formulaire n'est pas une bonne idée pour désigner une table puisque plusieurs d'entre elles vont recevoir des données de différents formulaires) :
CREATE TABLE `messages` (
`id_message` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`pseudo` VARCHAR( 30 ) NOT NULL ,
`email` VARCHAR( 60 ) NOT NULL ,
`message` TEXT NOT NULL ,
`date_message` DATETIME NOT NULL
) ENGINE = MYISAM ;
Du coup si j'insère 2 nouveaux enregistrements comme ceci :
INSERT INTO messages (pseudo, email, message, date_message)
VALUES ('toto', 'toto@hotmail.fr', 'test de toto', NOW()), ('titi', 'titi@hotmail.fr', 'test de titi', NOW());
le champ id_message est automatiquement renseigné et pour récupérer sur ta page de confirmation le dernier inséré :
SELECT pseudo, email, message FROM messages ORDER BY id_message DESC LIMIT 0, 1 


Pour (re)voir les fonctions SQL de base cf. http://sqlpro.developpez.com/
Modifié par Heyoan (08 Dec 2009 - 14:13)
J'ai très bien compris et je t'en remercie l'objectif de cet id unique.

Maintenant sachant que je change de page après la redirection dois-je me reconnecter à ma base de données sur la page confirmation ? ou puis-je directement récupérer les valeur ?

De plus une erreur se produit alors qu'auparavant je ne l'ai jamais rencontrée :

Warning: Cannot modify header information - headers already sent by (output started at /homez.305/donchofo/www/port_mail.php:3) in /homez.305/donchofo/www/port_mail.php on line 49


Je me suis renseigné et apparemment cela est dû au fait que j'essaye de redéfinir le header alors que des informations ont déjà été envoyer à ma page. Mais bon je ne vois vraiment pas d'où cela provient.

J'ai apporté d'infimes modifications à mon code (juste changer mail en email pour éviter la confusion avec des termes propres au langage) :

<?php header("Content-Type: text/html; charset=utf-8");//Définition du type d'encodage texte 
?> 
<?php

//Initialisation des variables
$server = '******';
$user = '******';
$pass = '*****';
$table = Formulaire;
$db = 'donchofomail';

//Connexion à la base de donnée
mysql_pconnect($server, $user, $pass)
or die("Impossible de se connecter au serveur $server");

//Selection de la base de donnée
mysql_select_db($db)
or die("impossible de se connecter à la base $db");
	$Nom = $_POST['nom'];
	$Mail = $_POST['email'];
	$Message = $_POST['message'];

//Définition du destinataire ainsi que du sujet de l'email
define('MAIL_DESTINATAIRE','robert@gmail.com');
define('MAIL_SUJET','Message du formulaire de donchofolio');

//Préparation de l'entête du mail:
$mail_entete = "MIME-Version: 1.0\r\n";
$mail_entete .= "From: {$Nom} "
             ."<{$Mail}>\r\n";
$mail_entete .= 'Reply-To: '.$Mail."\r\n";
$mail_entete .= 'Content-Type: text/plain; charset="iso-8859-1"';
$mail_entete .= "\r\nContent-Transfer-Encoding: 8bit\r\n";
$mail_entete .= 'X-Mailer [langue]HP/' . phpversion()."\r\n";

//Préparation du corps du mail
$mail_corps = "Message de : $Nom\n";
$mail_corps .= $Message;

//Envoi du mail
mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete);  	
$query = "INSERT INTO $table (nom, email,message )
VALUES ('$Nom', '$Mail', '$Message')";

//Résultat de l'envois des informations à la base de donnée
$resultat = mysql_query($query)
or die("L'insertion a echouée car ". mysql_error() ."."); 

//Redirection sur la page de résultat d'envois
header("Location: contact_result.php"); exit;
?>


Voilà je ne penses pas que cela doit être un gros soucis mais bon s'en est quand même un ...
Smiley confus

Merci.
doncho a écrit :
Maintenant sachant que je change de page après la redirection dois-je me reconnecter à ma base de données sur la page confirmation ? ou puis-je directement récupérer les valeur ?
Ben oui : dès que tu dois effectuer une requête il faut d'abord te connecter.

doncho a écrit :
De plus une erreur se produit alors qu'auparavant je ne l'ai jamais rencontrée :

Warning: Cannot modify header information - headers already sent by (output started at /homez.305/donchofo/www/port_mail.php:3) in /homez.305/donchofo/www/port_mail.php on line 49
Ce message apparaît lorsque tu utilises la fonction header alors qu'un sortie html a déjà été effectuée. Il faut donc que ce code soit placé avant le DOCTYPE. En l'occurrence il peut s'agir d'un simple espace comme par exemple ici :
<?php header("Content-Type: text/html; charset=utf-8");//Définition du type d'encodage texte 
?> [#blue]// <-- d'une part cette fermeture / réouverture ne sert à rien mais s'il y a un espace ici cela génère une sortie html ![/#]
<?php

Pour finir je te rappelle que si tu débutes en PHP Alsacréations n'est pas le bon forum : il en existe une foultitude qui sont justement dédiés à cela. Smiley cligne
Bonjour,

Je prend un peu ton problème au vol mais je vais essayer d'y apporter ma pierre.

* Concernant ton problème de header :

L'erreur retournée par php indique que le header placé en ligne 49 génère une erreur car un affichage (quel qu'il soit : html, erreur php, ...) a été généré par la ligne 3. Les headers ne "fonctionnent" que si aucun contenu n'a précédement été envoyé au navigateur. Donc le code de la ligne 3 de ton fichier pose problème, quel qu'il soit.

* Concernant la récupération de tes informations sur la page de confirmation :

Tu as inséré un enregistrement dans la base de donnée contenant ces informations et il te faut donc de toute façon les récupérer dans la base de donnée. Pour celà tu dois te connecter à la base de donnée sur la page de confirmation et récupérer le dernier enregistrement inséré (grâce à l'auto-incrément du champs id de ta base).

mysql_query('SELECT * FROM Formulaire ORDER BY id DESC LIMIT 0,1')


Ca devrait te donner le contenu de ta dernière insertion que tu pourras afficher dans la page de confirmation.

* Quelques remarques concernant ton code :

- Si on considère qu'un autre utilisateur peut être inséré dans la table Formulaire entre l'insertion en cours et sa confirmation, tu cours le risque (certes limité) avec cette méthode d'afficher des informations correspondant à un autre utilisateur sur la page de confirmation. Pour parer à ce problème, sur la page de traitement, tu peux récupérer l'id de l'enregistrement effectué (avec mysql_insert_id()) et le transmettre à la page de confirmation avec les variables de session afin de récupérer non pas le dernier enregistrement mais celui correspondant à l'id transmis. Mais bon, à ce compte-là autant économiser une requête sql et tout passer en session entre les deux pages.

- Rends le champs mail, ou nom, unique dans ta base de donnée afin d'éviter qu'un petit malin s'amuse à remplir ta base de donnée avec une boucle.

- Evites les connexions persistantes : Un peu de lecture

- Tu risques d'avoir pas mal besoin de tes instructions de connexion à la base de donnée, je te conseille de la transformer en fonction et de la mettre dans un fichier à part que tu appelleras sur chaque page où c'est nécessaire. Ca sera beaucoup plus simple le jour ou tu auras des modifications à y apporter.

Voilà, si tu as la moindre question, n'hésite pas.

Bon courage,

Smiff.
Modifié par Smiff (09 Dec 2009 - 08:42)
Merci beaucoup à vous deux pour votre aide.
Je vais m'atteler à ça demain. Je viendrai mettre mon post a jour en conséquence.

Bonne fin de soirée à vous.

Cordialement Greg.
Voilà j'ai réussi grâce à votre aide donc je viens vous dires merci et à une prochaine.

Cordialement Greg.