8772 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous, Smiley cligne

j'ai un petit problème :
j'ai une page web :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="Language" content="FR" />
<title>bidule</title>
<link href="../css.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="page">
	<div id="banniere"></div>
	<div class="navigation"></div>
	<div id="corps">
		<p class="message">

		</p>
	</div>
	<div class="retour"><a href="inscription.php">retour</a></div>
</div>
<div class="navigation"></div>
</body>
</html>


qui passe la validation du w3c...

et lorsque je rajoute mon code PHP :
<?php
$tabChamps=array("civilite","nom","prenom","fonction","organisme","adresse","ville","cp","telephone","email","rencontres_28nov","rencontres_29nov","rencontres_30nov","acces_oeuvres","formation_acteurs","entrevues_28nov","entrevues_29nov","entrevues_30nov","repas_28nov","repas_29nov","repas_30nov","montant");

$erreur=false;
$verif=false;

foreach($tabChamps as $val){
	if(isset($_POST[$val])){
		$$val=$_POST[$val];
		$verif=true;
	}else{
		$$val=false;
	}
}

if($verif){
	switch($civilite){
		case 'M.': $civilite2="Monsieur"; break;
		case 'Mme': $civilite2="Madame"; break;
		case 'Mlle': $civilite2="Mademoiselle"; break;
		default: $civilite2="";
	}
	
	//-----------------------------------------------
	//UPLOAD DE LA PHOTO
	//-----------------------------------------------
	if($_FILES['photo']['name']){ // si formulaire soumis
		$dossier = '../upload/'; // dossier où sera déplacé le fichier
	
		$tmp_file=$_FILES['photo']['tmp_name'];
	
		if(!is_uploaded_file($tmp_file)){
			echo "Le fichier est introuvable<br />";
			$erreur=true;
		}
	
		// on vérifie maintenant l'extension
		$type_fichier=$_FILES['photo']['type'];
	
		if(!strstr($type_fichier,'jpg') && !strstr($type_fichier,'jpeg') && !strstr($type_fichier,'bmp') && !strstr($type_fichier,'gif')){
			echo "Le fichier que vous avez soumis pour la photo d'identité n'est pas un fichier image.<br />";
			$erreur=true;
		}
	
		// on copie le fichier dans le dossier de destination
		$nom_fichier = $_FILES['photo']['name'];
	
		if( !move_uploaded_file($tmp_file,$dossier.$nom_fichier) ){
			echo "Impossible de copier le fichier dans le dossier ".$dossier."<br />";
			$erreur=true;
		}
		
		// extraction de l'extension
		$extension=strtolower(substr($_FILES['photo']['name'],strrpos($_FILES['photo']['name'], '.')));
	}
	
	//-----------------------------------------------
	//CONSTRUCTION DU MESSAGE
	//-----------------------------------------------
	$message=$civilite2." <b>".$prenom." ".$nom."</b><br />";
	
	if($fonction){
		$message.=$fonction;
		if($organisme){
			$message.=" ";
		}
	}
	if($organisme){
		$message.="du ".$organisme."<br />";
	}
	if($adresse){
		$message.="<br />adresse :<br />".$adresse."<br />";
	}
	if($ville){
		if($cp){
			$message.=$cp." ".$ville;
		}else{
			$message.=$ville;
		}
		$message.="<br />";
	}
	if($telephone){
		$message.="Tél : ".$telephone."<br />";
	}
	if($email){
		$message.="E-mail : <a href=\"mailto:".$email."\">".$email."</a><br />";
	}
	
	$message.="<br />souhaite&nbsp;:";
	$message.="<br /><br />";
	
	if($rencontres_28nov||$rencontres_29nov||$rencontres_30nov){
		$message.="- participer aux <b>bidule</b>";
		$message.="<br />";
		
		if($rencontres_28nov){
			$message.="le ".$rencontres_28nov;
		}
		if($rencontres_29nov){
			if($rencontres_28nov){
				$message.=", ";
			}
			if(!$rencontres_30nov){
				$message.=" et ";
			}
			$message.="le ".$rencontres_29nov;
		}
		if($rencontres_30nov){
			if($rencontres_28nov || $rencontres_29nov){
				$message.=" et ";
			}
			$message.="le ".$rencontres_30nov;
		}
		$message.="<br /><br />";
	}
	
	if($acces_oeuvres || $formation_acteurs){
		$message.="- participer à la table ronde du mardi 28 novembre :";
		$message.="<br />";
		if($acces_oeuvres){
			$message.="à l'accès aux œuvres";
		}
		if($formation_acteurs){
			if($acces_oeuvres){
				$message.=" et ";
			}
			$message.="à la formation des acteurs";
		}
		$message.="<br /><br />";
	}
	
	if($entrevues_28nov || $entrevues_29nov || $entrevues_30nov){
		$message.="- souhaite bénéficier d'une accréditation pour le bidule";
		$message.="<br />";
		
		if($entrevues_28nov){
			$message.="le ".$entrevues_28nov;
		}
		if($entrevues_29nov){
			if($entrevues_28nov){
				$message.=", ";
			}
			if(!$entrevues_30nov){
				$message.=" et ";
			}
			$message.="le ".$entrevues_29nov;
		}
		if($entrevues_30nov){
			if($entrevues_28nov || $entrevues_29nov){
				$message.=" et ";
			}
			$message.="le ".$entrevues_30nov;
		}
		$message.="<br /><br />";
	}
	
	if($repas_28nov || $repas_29nov || $repas_30nov){
		$message.="- souhaite prendre les repas de midi";
		$message.="<br />";
		
		if($repas_28nov){
			$message.="le ".$repas_28nov;
		}
		if($repas_29nov){
			$nbCaseCoche++;
			
			if($repas_28nov){
				$message.=", ";
			}
			if(!$repas_30nov){
				$message.=" et ";
			}
			$message.="le ".$repas_29nov;
		}
		if($repas_30nov){
			if($repas_28nov || $repas_29nov){
				$message.=" et ";
			}
			$message.="le ".$repas_30nov;
		}	
		
		$message.="<br /><i>et s'engage donc a vous envoyer un chèque de&nbsp;: ".$montant.",00€</i>";
	}
	
	$message_html=file_get_contents("mail_debut.htm").$message.file_get_contents("mail_fin.htm");
	
	//-----------------------------------------------
	//DECLARE LES VARIABLES
	//-----------------------------------------------
	$destinataire="machin@laposte.net";
	$sujet="bidule";
	
	//-----------------------------------------------
	//GENERE LA FRONTIERE DU MAIL ENTRE TEXTE ET HTML
	//-----------------------------------------------
	$frontiere='-----frontiere:'.md5(uniqid(mt_rand())).'-----';
	
	//-----------------------------------------------
	//HEADERS DU MAIL
	//-----------------------------------------------
	$headers="From: ".$civilite." ".$prenom." ".$nom." <".$email.">\n";
	$headers.="Return-Path: <".$email.">\n";
	$headers.="MIME-Version: 1.0\n";
	$headers.="Content-Type: multipart/mixed; boundary=\"".$frontiere."\"";
	
	//-----------------------------------------------
	//MESSAGE HTML
	//-----------------------------------------------
	$corps="--".$frontiere."\n";
	$corps.="Content-Type: text/html; charset=\"utf-8\"\n";
	$corps.="Content-Transfer-Encoding: 8bit\n\n";
	$corps.=$message_html."\n\n";
	
	//-----------------------------------------------
	//PIECE JOINTE
	//-----------------------------------------------
	if($_FILES['photo']['name']){
		$corps.="--".$frontiere."\n";
		$corps.="Content-Type: image/*; name=".$nom_fichier."\n";
		$corps.="Content-Transfer-Encoding: base64\n";
		$corps.="Content-Disposition:attachement; filename=\"photo d'identité".$extension."\"\n\n";
		$corps.=chunk_split(base64_encode(file_get_contents($dossier.$nom_fichier)))."\n";
	}
	
	//Envoi du mail
	if(!$erreur && @mail($destinataire,$sujet,$corps,$headers)){
		echo "Votre inscription a bien été envoyé.";
		
		//envoie au webmaster
		@mail("machin@machin.org",$sujet,$corps,$headers);
	}else{
		echo "L'envoie de votre inscription n'a pas aboutit.";
	}
}
?>


entre les balises "<p class="message">" et "</p>"

La validation ne passe plus ! Smiley eek

et m'affiche :
end tag for "div" omitted, but OMITTAG NO was specified.

		<div class="message">



et pourtant toutes mes balises sont bien fermées !

Je n'y comprend rien donc si quelqu'un peut m'expliquer ou à déjà été confronté à ce problème...

Merci de m'aider...
Modifié par fodjio (25 Oct 2006 - 15:41)
Est-tu sur que tout le code PHP est bien executé ?

Tout ce code sert à traiter un formulaire apparement ?
Et si tout ce traitement s'effectue bien, tu devrai avoir entre tes balises
<p class="message"></p>

soit :
a écrit :
Votre inscription a bien été envoyé.

ou
a écrit :
L'envoie de votre inscription n'a pas aboutit.


Ce qui me turlupine c'est le "@" devant la fonction mail Smiley confus
réponse Raphaël :
non je ne place pas d'élément de type bloc dedans, juste une phrase.

réponse chpego :
Tu as tout compris.
Le '@' devant la fonction mail, c'est pour empêcher les messages d'erreurs.


J'ai finalement trouvé ! Smiley biggrin

Apparement (si quelqu'un pouvait confirmer, ça serait le top),
le validateur n'aime pas la fonction 'exit()' (ni 'die()' d'ailleurs)
et donc je pense qu'il execute carrement cette fonction et qu'il ne lit pas le reste de la page.

Résultat : il m'explique que mes balises ne sont pas fermées alors qu'elles le sont réellement. Smiley confus

J'ai donc bidouillé pour éviter les 'exit' et là, la page réussis la validation. Smiley smile


Merci pour votre aide. Smiley cligne
Modifié par fodjio (25 Oct 2006 - 16:43)
Salut fodjio Smiley cligne ,

Le validateur ne peut pas tenir compte du code PHP puisqu'il ne fait que valider le HTML qui est généré.
Donc il ne peut pas exécuter un exit() ou un die()... qui d'ailleurs n'apparaissent pas dans ton code Smiley rolleyes
J'aurais donc tendance à dire que le fait d'enlever ces 2 fonctions a également supprimé le bout de code qui n'allait pas...

@+
c'est bizarre mais il n'y a nul part de exit() ou de die() dans ton code
Smiley rolleyes

Bon j'espère que ton problème est [RESOLU] Smiley cligne
$$val=false;
Pourquoi de la variable dynamique ?
C'est pas maintenable

switch($civilite){

		case 'M.': $civilite2="Monsieur"; break;

		case 'Mme': $civilite2="Madame"; break;

		case 'Mlle': $civilite2="Mademoiselle"; break;

		default: $civilite2="";
Même chose pour ce switch immonde.
Utilises un array() bien plus performant

Je me suis arrêté à cette hauteur dans ton code, corriges déjà ça.
M'est avis que le problème vient de la façon dont tu valides ta page. En effet, il s'agit d'un fichier php qui doit normalement se trouver sur un serveur (local ou distant). Ce faisant il est interprété par le module apache et renvoie du code html. En aucune manière ton php ne peut être lu par le validateur. ton "die" et ton "exit" n'entre donc pas en ligne de compte.

Tu as donc du faire une validation via upload sur le site du w3c, directement à partir du fichier sur ton ordinateur. ll faudrait donc vérifier le fichier à partir d'une page web, c'est-à-dire dans un navigateur, pour que ce dernier soit interprété par le serveur (local ou distant).

Ensuite, nous pourrons t'aider pour des problèmes de PHP stricto sensus ; si "le grand kiwi" y consent.
Smiley smile

PS : attention à l'encodage, tu risques d'avoir des surprises...
Modifié par fredmac (25 Oct 2006 - 21:19)
Bison a écrit :
$$val=false;
Pourquoi de la variable dynamique ?
C'est pas maintenable

switch($civilite){

		case 'M.': $civilite2="Monsieur"; break;

		case 'Mme': $civilite2="Madame"; break;

		case 'Mlle': $civilite2="Mademoiselle"; break;

		default: $civilite2="";
Même chose pour ce switch immonde.
Utilises un array() bien plus performant

Je me suis arrêté à cette hauteur dans ton code, corriges déjà ça.


Je rejoins également ce que dis Bison, le reste du code est aussi à revoir. Smiley cligne J'osé pas le dire, mais puisque Bison l'a fais Smiley langue
Resalut tout le monde !

c'est la première fois que je me fais 'secouer un peu' comme ça dans un forum Smiley sweatdrop

Alors en effet, quand j'ai posté mon message j'avais déjà modifié mon code.
Du coup je suis perdu, et je sais plus pourquoi ça marche maintenant et pas avant (???).
Il faut que je refasse des tests.

J'accèpte vos critiques, cela montre que j'ai encore beaucoup à apprendre,
mais malheureusement je comprends pas ce qui vous chagrine,
expliquez-moi ce que je devrai mettre à la place.
Et si possible pourquoi mon code est si mauvais.
Ça serait sympa...


Réponse à chpego :

Excuse-moi pour le [Résolu] j'allais sincèrement le mettre, mais j'ai oublié.
Par contre j'hésite maintenant à le mettre parce que du coup la cause du problème n'est finalement pas définitivement résolue. Affaire à suivre...


Réponse à Bison :

de la variable dynamique parce que c'est plus pratique, après il ne reste plus qu'à faire une boucle qui crée les variables.
Et si, c'est maintenable, car il n'y a plus qu'à modifier le tableau quand on veut changer, ajouter ou supprimer une variable, sans toucher au reste.

Ou, est-ce que tu pense que j'ai meilleur temps d'utiliser les variables $_POST[] ?

J'attends ta solution.
Montre-moi que j'ai tord. Smiley cligne

Pareil pour le switch, explique-moi en quoi il est immonde,
si il y a mieux, je suis preneur.
Y'a pas d'problème...


Merci de m'aider à progresser
Modifié par fodjio (26 Oct 2006 - 09:55)
fodjio a écrit :
Resalut tout le monde !

c'est la première fois que je me fais incendier comme ça dans un forum Smiley sweatdrop

Incendier ?
En quoi te secouer un peu pour t'aider à progresser est-il assimilable à "se faire incendier" ?
En quoi te dire que le code n'est pas joli joli c'est "se faire incendier" ? Smiley eek

Si tu n'acceptes pas la critique, constructive en plus, il ne faut pas proposer ton code à l'appréciation des autres intervenants.
Si je te dis que ton code n'est pas propre, c'est parce que je sais de quoi je parles. Smiley ohwell

Je suis désolé si tu le prends de cette manière.
Enfin bref, c'est pas grave, je te présente, donc, mes excuses pour avoir essayer de te faire avancer, pour avoir essayer de t'impliquer dans ton projet.
Je laisse la main.

Tiens, lis et médite :
a écrit :
Benjamin Franklin a dit :
Tu me dis, j'oublie, tu m'enseignes, je me souviens, tu m'impliques, j'apprends.

Modifié par Bison (26 Oct 2006 - 09:52)
Oups ! Smiley sweatdrop
Incident diplomatique.

Je m'excuse pour le mot 'incendié' que j'ai aussitôt remplasser.
D'ailleurs, si tu as lu le reste du message, je passe mon temps à dire que je souhaite avancer grace à ces critiques (qui c'est vrai , ne méritent pas le qualificatif "d'incendières", je me suis peut-être un peu embalé Smiley rolleyes ).

Alors ? Toujours copain ? Smiley smile

Allez Bison, explique-moi s'il te plait, je veux savoir.

Merci

a écrit :
moi :
je m'excuse, tu me pardonne... et on ce bois une bonne kro en faisant une partie de PES

Modifié par fodjio (26 Oct 2006 - 10:06)
Bonjour, et bien je ne sais pas si Bison va penser la même chose que moi, mais je vais essayer de dire ce qui a prioiri ne va pas dans ton code.

Tout d'abord tu traite un formulaire, il faudrait connaitre le nom et le type des champs pour pouvoir les traiter chacun, savoir si tout ces champs ont bien été remplis. Je commencerai par tester si le bouton submit a bien été soumis, ensuite je testerai si chaque champ a bien été rempli par un isset(), puis tester si aucun d'entre eux n'est vide avec la fonction empty(). Peut-etre que des champs peuvent être facultatif, donc il faut aussi prendre en compte cela.

Si tout ca est bien vérifié tu peux commencé à "construire" ton message, puis envoyer le message et là encore tester si le mail est bien envoyer.

Si tu ne vois pas trop ce que je veux dire par tout ces test, tu peux regarder sur ce lien, plus exactement le code du fichier insert_news.php

J'espère que ca pourra t'aider, par contre je suis d'accord pour un PES, mais sans la Kro Smiley biggrin
Modifié par chpego (26 Oct 2006 - 10:31)
Merci chpego,

mais il faut peut-être que je vous explique qu'en fait le formulaire est sur une autre page.
Lorsque l'on soumet le formulaire (sur cette autre page donc) je fais déjà une vérification grâce à du Javascript (champs obligatoire, email valide, ect).

Donc, je n'ai pas besoin de vérifier en php (sauf si vous me démontrez le contraire bien sur) et le bouton submit à forcement été actionné pour arriver sur la page du traitement du message.

Merci quand même chpego. Smiley smile


Quant au test "isset()", je le fais justement grâce à ma boucle qui contient 'mon affreux $$val' Smiley biggol .


Moi je demande juste ce que je devrai faire à la place de cette boucle et la place du switch.

a écrit :
Je comprends vite mais fô m'expliquer longtemps.
C'est peut-être dû au mélange PES/Kro Smiley cligne

Modifié par fodjio (26 Oct 2006 - 10:54)
a écrit :
Donc, je n'ai pas besoin de vérifier en php (sauf si vous me démontrez le contraire bien sur) et le bouton submit à forcement été actionné pour arriver sur la page du traitement du message.

Qu'est ce qui se passe si javascript est désactivé chez l'utilisateur ?
chpego a écrit :
Je commencerai par tester si le bouton submit a bien été soumis, ensuite je testerai si chaque champ a bien été rempli par un isset(), puis tester si aucun d'entre eux n'est vide avec la fonction empty().

Bon allez, chui de bonne humeur.

Pour tous les deux, si les champs sont obligatoires, !empty() seul fera l'affaire, lié à un trim()
Un exemple là : Comment contrôler les entrées de vos formulaires ?

Pour en revenir aux variables dynamiques :
- Une variable dynamique n'est utile qu'à de très rares execptions.

- C'est juste l'espace de nommage qui change. Dans les deux cas (variable-variable et array), la taille est identique (à peu de choses près).

- Utiliser des variables dynamiques rend le code inmaintenable et illisible, et on peut dans 99,999% des cas faire autrement.

Tu vas avoir l'air malin si dans 6 mois tu dois apporter des corrections à un code de ce type :
Euuh... ouais... c'était quoi encore ce $$var ?????

Donc, on utilise un tableau
<?php
$tablo=array('mr'=>'Monsieur', 'mme'=>'Madame','mlle'=>'Mademoiselle');
$machin='mlle';
echo $tablo[$machin];
?>


Voilà, plus de var-var et plus de switch()
Si le javascript est désactivé l'utilisateur ne peut pas soumettre le formulaire.

Parce que le code du bouton ce présente comme ça :
<input name="" type="button" value="Envoyer" onclick="verifForm();" />



Bison,
mon $$var je l'utilise qu'une seul fois pour créer d'autres variables.
C'est juste pour remplacer mes $_POST['variable'] par des $variable.

Pour le tableau, t'as raison, c'est plus astucieux que le switch.
Modifié par fodjio (26 Oct 2006 - 14:31)
SuD a écrit :


Ouch!! Smiley ohwell

Petite piqure de rappel au sujet des formulaires

Je m'en doutais...
Mais, je te ferai quand même remarquer que c'était indiqué en rouge en plus :
a écrit :
Même si les portions de code sont fonctionnelles en l'état, elles ne servent que de support dans la méthode de vérification. Vous devrez opter pour une forme plus rigoureuse de vérification avec les données sur lesquelles l'internaute à la main ainsi que de vérifier la conformité de votre code HTML.


Mais pour te faire plaisir, j'ai modifié le code du formulaire mis en exemple.
Le but de l'article n'est rien de plus que de montrer une méthode de vérif liée à php. Smiley langue
Modifié par Bison (26 Oct 2006 - 16:49)
Bison a écrit :

Le but de l'article n'est rien de plus que de montrer une méthode de vérif liée à php.
Bison a écrit :

echo 'Les champs ',implode(', ',$corrige),' sont obligatoires<br /><br />
<a href="javascript:history.go(-1);">Corriger ou complètez les champs erronés !</a>';


La méthode n'est pas bonne justement!
Modifié par SuD (26 Oct 2006 - 16:49)
Pages :