infos sur les pages php

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
lionel173
Salamandre
Messages : 22
Inscription : 04 févr. 2010, 08:54

infos sur les pages php

Message par lionel173 »

Bonjour,

Après avoir suivi le tuto toujours très bien fait sur info.sio2.be/kz... j'ai créé une petite page php.
Par contre je suis resté sur ma faim concernant les vérifications évoquées à la dernière page.
Comment effectuer ces deux vérifs. Est-ce que je peux trouver des conseils et exemples.
Pour rendre une saisie obligatoire et la vérifier, ou encore le format correct d'une adresse email.

J'ai aussi visualisé la page phpsecure.info... pour protéger la fonction mail(), mais j'avoue ne pas avoir compris les protections à apporter.

J'ai créé un champ message ou le visiteur peut taper quelques lignes de texte. Est-ce que la commande "htmlentities" suffit verrouiller ce champ ?
Les sites perso ou de petites pme qui ne sont destinés qu'à un nombre presque "intime" de visiteurs ne sont surement pas exposés autant que des sites de vente en ligne ou de grosse entreprises. Qu'en pensez-vous ? Faut-il vraiment mettre toutes les protections possibles ?

Enfin dans mon champ message, j'ai un soucis de caractères accentués qui arrive codés dans ma boite email. Est-ce qu'il existe un attribut à donner au champ concerné, ou une méthode particulière qui m'échappe.

Beaucoup de questions d'un coup, mais j'attends vos conseils. Merci d'avance.
Lionel
lionel173
Salamandre
Messages : 22
Inscription : 04 févr. 2010, 08:54

Re: infos sur les pages php

Message par lionel173 »

Bonjour à tous,

Le php n'interresse personne ?? Etonnant :shock: :shock:

Ou alors est-ce que c'est parce que c'est tellement simple et que je n'ai rien vu que mon message ne solicite aucun commentaire :roll:

Peut-être que je me suis mal exprimé. Dites le moi. Merci
bobo
Iguane
Messages : 764
Inscription : 18 août 2003, 11:04

Re: infos sur les pages php

Message par bobo »

Hum, je pense que cette question aurait plus sa place dans la section développement Web, je déplace.
Les standards c'est bon, mangez en !
Flore & Sébastien
Unité dans la diversité.
Asumbaa
Tyrannosaurus Rex
Messages : 2411
Inscription : 08 déc. 2004, 20:07

Re: infos sur les pages php

Message par Asumbaa »

Salut,
lionel173 a écrit :Comment effectuer ces deux vérifs. Est-ce que je peux trouver des conseils et exemples.
Pour rendre une saisie obligatoire et la vérifier, ou encore le format correct d'une adresse email.
Je n'arrive pas à accéder à ton tuto.
Pour vérifier les saisies utilisateur, il faut simplement regarder les valeurs saisies et comparer avec ce que tu attendais. Dans ta page PHP de traitement du formulaire, tu peux avoir des choses comme ça :

Code : Tout sélectionner

// Vérification champs obligatoires
if (!isset($_POST['champ_obligatoire']) || $_POST['champ_obligatoire'] == '') { traitement de l'erreur }

// Vérification de format
if (!is_numeric($_POST['champ_numerique']) { traitement de l'erreur de format }
if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))  { traitement de l'erreur de format email }
Et ainsi de suite, pour chaque élément entré par ton utilisateur.
lionel173 a écrit :J'ai créé un champ message ou le visiteur peut taper quelques lignes de texte. Est-ce que la commande "htmlentities" suffit verrouiller ce champ ?
Les sites perso ou de petites pme qui ne sont destinés qu'à un nombre presque "intime" de visiteurs ne sont surement pas exposés autant que des sites de vente en ligne ou de grosse entreprises. Qu'en pensez-vous ? Faut-il vraiment mettre toutes les protections possibles ?
Il y a deux choses distinctes à protéger, et il faut bien avoir ça en tête. Aucune des deux n'est très compliquée, et oui même pour une petite entreprise c'est important (je suppose que tu tiens à tes données !?)
Donc, les deux choses :
- protéger ta base de données des injections SQL => pour cela, toujours échapper les données et vérifier que tes variables contiennent bien ce que tu attendais, avant de les insérer en base.
- protéger ton site lorsque tu affiches les données enregistrées en base => là htmlentities peut t'aider, bien entendu. Sinon tu t'exposes à des messages contenant du HTML qui sera ensuite incorporé au HTML de ton site au moment de l'affichage.
lionel173 a écrit :Enfin dans mon champ message, j'ai un soucis de caractères accentués qui arrive codés dans ma boite email. Est-ce qu'il existe un attribut à donner au champ concerné, ou une méthode particulière qui m'échappe.
Ça dépend de ta boite mail, de l'encodage de tes pages, du cheminement effectué par les données envoyées par mail, du format du mail... Il nous faudrait un peu plus de détails.

bobo a écrit :Hum, je pense que cette question aurait plus sa place dans la section développement Web, je déplace.
Tu as bien fait :wink:
chinon37
Animal mythique
Messages : 5319
Inscription : 21 mars 2005, 10:17

Re: infos sur les pages php

Message par chinon37 »

Asumbaa: le tuto est ici: http://info.sio2.be/kpz/5/index.php (l'auteur en est Ymai, célèbre modo du non moins célèbre forum KompoZer :mrgreen: ) :wink:
Préferez Kompozer 0.8 à Nvu
Défendons nos valeurs, adhérons à l'APRIL
La Démocratie, c'est quand on frappe à votre porte à 6h00 du matin, et que c'est le laitier.
lionel173
Salamandre
Messages : 22
Inscription : 04 févr. 2010, 08:54

Re: infos sur les pages php

Message par lionel173 »

Merci Asumbaa,

Je vais suivre tes conseils... et assurément revenir pour d'autres questions au fur et à mesure de l'avancement :wink:
lpgc
Lézard à collerette
Messages : 259
Inscription : 16 juil. 2006, 01:02

Re: infos sur les pages php

Message par lpgc »

si je peux te conseiller un site ... w3schools

d'une manière générale pour valider un formulaire ... il faut d'après moi mettre la validation à 2 niveaux :

-1 d'abord côté client en javascript quand c'est possible pour éviter les aller-retour inutiles vers le serveur
les dates bien formatées par exemple, les infos nécessaires bien remplies

tant que ce n'est pas bon ... on n'accède pas au serveur
http://www.w3schools.com/js/js_form_validation.asp

-2 la même validation au niveau serveur
pourquoi aussi au niveau du serveur ? ...
vérification par rapport à la base de donnée ( duplicate )
le formulaire peut-être utilisé par un autre site sans les validations JS
injections diverses ...

certainement sécuriser le site ( ftp, ssl, ... ) ... si les données sont critiques
lionel173
Salamandre
Messages : 22
Inscription : 04 févr. 2010, 08:54

Re: infos sur les pages php

Message par lionel173 »

Bonjour,

Malgré vos conseils, je bute sur la première comparaison qui semble pourtant simple.
Voilà ce que j'ai tapé dans ma page php pour contrôler une zone "nom" qui ne contient rien comme texte de base avant saisie
soit

$nom = htmlentities($_POST['nom']);
if (empty($_POST['nom'])){ echo "Champ obligatoire" }else{ echo "$nom" }
ou
$nom = htmlentities($_POST['nom']);
if (!isset($_POST['nom']) || $_POST['nom'] == '') { echo "Champ obligatoire" }else{ echo "$nom" }

et la page ne s'affiche plus. Elle refonctionne dés que je supprime la ligne "if...".
Sans cette ligne, tout ce passe bien et la page s'affiche avec les données saisies, et le mail est envoyé.

Je ne vois pas où est mon erreur. Merci de votre aide précisieuse.

Lionel
lpgc
Lézard à collerette
Messages : 259
Inscription : 16 juil. 2006, 01:02

Re: infos sur les pages php

Message par lpgc »

tu dois avoir une erreur dans le style :

Parse error: syntax error, unexpected '}', expecting ',' or ';' in xxx.php on line yy

il manque les ; en fin dinstructions

Code : Tout sélectionner

if (empty($_POST['nom'])){ echo "Champ obligatoire"; }else{ echo "$nom"; }
lionel173
Salamandre
Messages : 22
Inscription : 04 févr. 2010, 08:54

Re: infos sur les pages php

Message par lionel173 »

Merci lpgc,
on fait des erreurs plutôt ridicules quand on est débutant. Je mettais le ";" à la fin de la ligne, mais pas à chaque instruction.

J'ai un autre soucis concernant une boucle "switch".
Voilà en résumé mon raisonnement :
<php? switch($suite){ case 0: ?>
<form ... action=form.php // le formulaire appelle la meme page...
....
<input // bouton submit">
<input name="suite" value="1" type="hidden">
<input // bouton reset>
/form>
....
<php? break;?>
<php? case 1:
....
Vérification des données obligatoires...
affichage des messages d'erreur
....
$suite=0;
}

Il semble que le break stop à chaque fois le déroulement, quelque soit la valeur de $suite. Si bien que la partie case 1: n'est jamais exécutée.
Je n'utilise peut-être pas la bonne méthode ou plutôt une autre erreur de ma part. Tous les exemples que j'ai pu trouver sont sur le même procédé.
Je suis preneur de toutes vos critiques et vos idées.
Merci

Quand j'aurais résolu ce pb là, je chercherais comment afficher les messages à un endroit précis sur la page...
lpgc
Lézard à collerette
Messages : 259
Inscription : 16 juil. 2006, 01:02

Re: infos sur les pages php

Message par lpgc »

c'est vraiment la base du PHP ... en regardant quelques exemples élémentaires il ne devrait pas y avoir trop de problèmes

la structure d'un switch étant :

Code : Tout sélectionner

switch($ilog){ 
  case 1: 
    echo 'visiteur'; 
    break; 
  case 1: 
    echo 'membre'; 
    break; 
  case 4: 
    echo 'administrateur'; 
    break; 
  case 12: 
    echo 'suspendu définitivement après avoir été déjà '; 
//  sans break en fin de case continue les cases suivants jusqu'au premier break rencontré
  case 11: 
    echo 'suspendu provisoirement suite à une '; 
  case 10: 
    echo 'suspension pour 3 mois '; 
    break; 
  default: 
    echo "warning $ilog non prévu !"; 
}
pour la structure du formulaire ... peut-être s'inspirer de : Quelques liens utiles : Ils l'ont (bien) fait pour vous : Formulaire sécurisé d'envoi de mails
lionel173
Salamandre
Messages : 22
Inscription : 04 févr. 2010, 08:54

Re: infos sur les pages php

Message par lionel173 »

Bonjour,

Après quelques jours de lecture des tutos sur le siteduzero entre autres, et beaucoup d'heures de solitude devant ma page de code, "je donne ma langue au chat" !
J'ai un formulaire qui envoi les données vers une page de test et d'envoie du mail. Les tests se font bien, si j'affiche le message du mail, il est bon, mais quand je l'envoie, le texte s'affiche deux fois dans le même message et la partie $message n'arrive pas.
Autre soucis : quand une erreur est détectée le procédé affiche le message d'erreur et sort du switch (break de case 1:), mais le mail avec les erreurs est envoyé tout de même alors qu'il est en case 0: . Je ne comprends pas pourquoi.
Est-ce que quelqu'un à un avis ?

Je vous joins ma page, ne riez pas je débute ! Il y a 15 jours, je ne savais même pas que le php existait, et je n'avais jamais tapé une ligne de code html. -:)
Précision : la ligne mail() est en remarque pour faire les tests bien-sûr.

Code : Tout sélectionner

<html>
<body style="font-size: 1em; font-family: Calibri; text-align: center; color: blue; background-color: #d9e021">

<?php
// Initialisation desz variables 
$liste = ""; $titre = ""; $nom = "";$nommaj; $prenom = ""; $adresse = ""; $cp = ""; $ville = ""; $tel = "";
$nb1 = ""; $nb2 = ""; $devis = ""; $rappel = ""; $message = ""; $mail = "";
$erreur = ""; $envoi = ""; $total = "";
$mail = ""; $sujet = ""; $header = ""; $message_mail = "";

// Lecture des données saisies
$liste = $_POST['liste'];
$titre = $_POST['titre'];
$nom = htmlspecialchars($_POST['nom']);
$nommaj = strtoupper($nom);
$prenom = htmlspecialchars($_POST['prenom']);
$adresse = htmlspecialchars($_POST['adresse']);
$cp = htmlspecialchars($_POST['cp']);
$ville = htmlspecialchars($_POST['ville']);
$tel = htmlspecialchars($_POST['tel']);
$email = htmlspecialchars($_POST['email']);

$nb1 = htmlspecialchars($_POST['nb1']);
$nb2 = htmlspecialchars($_POST['nb2']);
if (isset($_POST['devis']))
	$devis = $_POST['devis'];
	else
	$devis = "non";
if (isset($_POST['rappel']))
	$rappel = $_POST['rappel'];
	else
	$rappel = "non";
$message = htmlspecialchars($_POST['message']);

// Vérification des données
if ($liste == "Choisissez" OR $titre == "Choisissez" OR $nom == "" OR $prenom == "") // Controle liste, titre, nom, prénom
	{ echo "<br><br>Vos coordonnées sont érronées, merci de vérifier.<br>
			Au moins un des champs obligatoires est resté vide."; $erreur = 1;}
	
if (! preg_match("#^[0-9]{5}$#", $cp) AND $cp != "") // Contrôle du code postal
	{echo "<br><br>Numéro de code postal incorrect.<br>
			Vous avez tapé : $cp"; $erreur = 1;}

if (! preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $tel)) // Contrôle numéro de téléphone
	{ echo "<br><br>Numéro de téléphone icorrect.<br>
			Vous avez tapé : $tel"; $erreur = 1;}

if (! preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $email)) // Contrôle de l'email
	{ echo "<br><br>Format de l'email invalide.<br>
			Votre réponse est : $email"; $erreur = 1;}

if (! preg_match("#^[0-3]?$#", $nb1)) // Contrôle chiffre nombre de fauteuils
	{ echo "<br><br>le nombre de fauteuil(s) doit être compris entre 1 et 3.<br>
			Votre réponse est : $nb1."; $erreur = 1; $erreur = 1;}

if (! preg_match("#^[0-4]?$#", $nb2)) // Contrôle chiffre nombre de personnes
	{ echo "<br><br>Le nombre de personne(s) valide(s) doit être entre 1 et 4.<br>
			Votre réponse est : $nb2."; $erreur = 1;}

$total = $nb1 + $nb2;	
if ($total > 5) // Contrôle du nombre total de personnes
	{ echo "<br><br>Le nombre total de personnes est supérieur à 5 passagers.<br>
			Vous avez tapé $nb1 + $nb2 = $total personnes"; $erreur = 1;}

if ($message == "") // Contrôle texte message
	{ echo "<br><br>Vous n'avez pas tapé de message, merci de recommencer."; $erreur = 1;}

// Affichage du message

switch($erreur)
	{ 
	case 1:
	echo "<br><br><b><u>Erreur(s) détectée(s)</u><br><br>
	<font color='red'>Votre formulaire ne nous a pas été transmis.</b></font>";
	break;
	
	case 0:
	//else
	echo "<br><br><b>Merci</b><br>$titre $prenom $nommaj,<br><br>
		<b>Votre message nous à été transmis.</b><br><br>
		Nous prendrons contact avec vous<br>
		en fonction de votre demande et <br>
		d'après les éléments que vous nous avez indiqués :<br>
		par téléphone au $tel,<br>ou à votre adresse Email $email.<br>";
	
		// Création de l'entête du mail
		$mail = "lionelmobilite.fr";
		$sujet = "Message depuis site internet lionelmobilité.fr";
		$header = "From: \"Lionel Mobilite\"<lionelmobilite.fr>";
		$header .= "Reply-to: \"Lionel Mobilite\" <lionelmobilite.fr>";
		$header .= "MIME-Version: 1.0";

		// Création du message
		$message_mail = "Content-Type: text/plain; charset=\"ISO-8859-1\"";
		$message_mail .= "Content-Transfert-Encoding: 8bits";
		$message_mail .= "Je suis $liste \n\n";
		$message_mail .= "Personne à contacter : $titre ";
		$message_mail .= "$prenom ";
		$message_mail .= "$nommaj \n\n";
		$message_mail .= "Numero de telephone : $tel \n\n";
		$message_mail .= "Adresse Email : $email \n\n";
		$message_mail .= "Adresse : $adresse \n";
		$message_mail .= "$cp $ville \n\n";
		$message_mail .= "Nombre de personnes en fauteuil : $nb1 \n\n";
		$message_mail .= "Nombre de personnes valides : $nb2 \n\n";
		$message_mail .= "Devis : $devis \n";
		$message_mail .= "Rapel : $rappel \n\n";
		$message_mail .= "$message \n";

		// test affichage du contenu : 
		echo "$mail $sujet $message_mail $header";

		// envoi du mail
		//mail ($mail, $sujet, $message_mail, $header);
	}
	
?>

<form method="post">
<br><br>
<p align="center"><input type="button" name="B1"
value="Fermer la fenêtre" onClick="window.close()"></p>
</form>
</body>
</html>
Merci de vos réactions,
Lionel
Asumbaa
Tyrannosaurus Rex
Messages : 2411
Inscription : 08 déc. 2004, 20:07

Re: infos sur les pages php

Message par Asumbaa »

Salut,

Le truc qui me saute aux yeux, c'est que tu initialises $erreur à "" (chaine vide) pour ensuite le switcher sur 1 ou 0 (valeur qu'il ne contiendra donc jamais).
Mais ça n'explique pas pourquoi il passe dans le case 0 alors que le break; aurait dû le stopper.

Je n'ai pas bien compris ce qu'il se passe avec le message répété deux fois mais pas transmis ?
lionel173
Salamandre
Messages : 22
Inscription : 04 févr. 2010, 08:54

Re: infos sur les pages php

Message par lionel173 »

Salut Asumbaa,

J'ai rectifié l'initialisation de $erreur à "0", et pour être plus logique, j'ai mis le case 0: (préparation et envoi du mail) avant case 1: (affichage des erreurs).
Depuis je ne reçois plus les mail !?!

Ce que je voulais dire lorsque je reçois le mail (erreurs détectées ou non) le $message_mail est répété deux fois. Là je ne vois vraiment pas pourquoi.
par contre lorsque je fait un test d'affichage du contenu de $message_mail (ligne echo "$mail....) le texte ne s'affiche qu'une seule fois.

Code : Tout sélectionner

switch($erreur)
	{ 
	case 0:
	echo "<br><br><b>Merci</b><br>$titre $prenom $nommaj,<br><br>
		<b>Votre message nous à été transmis.</b><br><br>
		Nous prendrons contact avec vous<br>
		en fonction de votre demande et <br>
		d'après les éléments que vous nous avez indiqués :<br>
		par téléphone au $tel,<br>ou à votre adresse Email $email.<br>";
	
		// Création de l'entête du mail
		$mail = "lionelmobilite.fr";
		$sujet = "Message depuis site internet lionelmobilité.fr";
		$header = "From: \"Lionel Mobilite\"<lionelmobilite.fr>";
		$header .= "Reply-to: \"Lionel Mobilite\" <lionelmobilite.fr>";
		$header .= "MIME-Version: 1.0";

		// Création du message
		$message_mail = "Content-Type: text/plain; charset=\"ISO-8859-1\"";
		$message_mail .= "Content-Transfert-Encoding: 8bits";
		$message_mail .= "Je suis $liste \n\n";
		$message_mail .= "Personne à contacter : $titre ";
		$message_mail .= "$prenom ";
		$message_mail .= "$nommaj \n\n";
		$message_mail .= "Numero de telephone : $tel \n\n";
		$message_mail .= "Adresse Email : $email \n\n";
		$message_mail .= "Adresse : $adresse \n";
		$message_mail .= "$cp $ville \n\n";
		$message_mail .= "Nombre de personnes en fauteuil : $nb1 \n\n";
		$message_mail .= "Nombre de personnes valides : $nb2 \n\n";
		$message_mail .= "Devis : $devis \n";
		$message_mail .= "Rapel : $rappel \n\n";
		$message_mail .= "$message \n";

		// test affichage du contenu : 
		// echo "$mail $sujet $message_mail $header";

		// envoi du mail
		mail($mail, $sujet, $message_mail, $header);
	break;
	
	case 1:
	echo "<br><br><b><u>Erreur(s) détectée(s)</u><br><br>
	<font color='red'>Votre formulaire ne nous a pas été transmis.</b></font>";
	}
	
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Re: infos sur les pages php

Message par calimo »

Hello, je me permet d'intervenir.
lionel173 a écrit :Salut Asumbaa,

J'ai rectifié l'initialisation de $erreur à "0", et pour être plus logique, j'ai mis le case 0: (préparation et envoi du mail) avant case 1: (affichage des erreurs).
Depuis je ne reçois plus les mail !?!
"0" en valeur numérique ou chaîne (avec les guillemets) ? Je ne sais plus si c'est équivalent dans un case…

De plus, selon la doc php, le premier argument pour mail est « to » donc le destinataire. Or tu définis $mail = "lionelmobilite.fr" : forcément ça ne risque pas de fonctionner. Idem dans les From et Reply-to que tu mets dans $header : le destinataire ne pourra jamais répondre à "lionelmobilite.fr". N'oublie pas non plus les retours à la ligne après chaque entête (regarde le code source d'un message). Et également : tu as des entêtes (Content-Type, Content-Transfert-Encoding) dans le corps du message.

Pour le message doublé, il faudrait vérifier ce qui se passe quand tu définis "MIME-Version: 1.0". Tu peux probablement te passer de cette ligne :wink:

Sinon :
- la vérification de l'adresse email semble extrêmement restrictive (les .museum ou caractères accentués ne passeront jamais) et d'un autre côté probablement trop permissive (tu peux avoir plusieurs points à la suite, ce qui est certainement source de problèmes). Voir (p.ex) http://www.expreg.com/expreg_article.php?art=verifmail pour la regex officielle
- tu n'as pas besoin d'initialiser tes variables en chaine vide, si tu les remplit juste après avec les données POST. Php n'est pas un langage où il faut définir ses variables. Ce n'est pas exclu que cela puisse poser quelques soucis (masquant par exemple un warning ou un message d'erreur)

Bonne chance !
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités