8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour Smiley smile

Je viens de créer un formulaire, c'est le premier Smiley murf il est juste ici

Il s'agit d'un bulletin de vote pour cinq prix en littérature. Les votants ont cinq choix à faire dans une liste d'une centaine de valeurs par prix. Je n'ai rentré que deux valeurs par prix pour l'instant, je suis en train de compléter la liste. Puis avant de la développer je veux être certaine de mon code. Jusqu'à maintenant ça semble fonctionner, j'ai juste trois petits problèmes à régler :

1 - Je n'arrive pas à mettre un background blanc à l'ensemble du formulaire.

2 - Certaines valeurs, surtout dans "Meilleurs ouvrages et essais" sont beaucoup plus larges que le width="600" autorisé. J'aimerais savoir s'il est possible de dépasser cette largeur, voir même afficher en plusieurs lignes, quand l'on passe la souris dessus, mais ceci sans que j'ai besoin d'élargir mon champs.

3 - Finalement, le plus important lolol je ne reçois pas le formulaire dans mon courriel. Quelqu'un voit ou est mon erreur?

Voici mon code :

<?php
// Dans la ligne qui suit, remplacer webmaster@domaine.tld par l'adresse email du webmaster, à laquelle les messages devront être envoyés
$email_webmaster = "shirlmonadresseeditee@domaine.org";
// === traitement des données du formulaire ============================================================
if (isset($_POST["envoyer"])){ 
// le formulaire a été soumis
        $etat = "erreur"; 
// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur
// --- mise en forme des champs saisis dans le formulaire lors de sa soumission ---
        if (isset($_POST["email_expediteur"])) {
                 $_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));
        }
        if (isset($_POST["titre"])) {
                 $_POST["titre"]=trim(stripslashes($_POST["titre"]));
        }
        if (isset($_POST["message"])) {
                 $_POST["message"]=trim(stripslashes($_POST["message"]));
        }
		if (isset($_POST["adresse"])) {
                 $_POST["adresse"]=trim(stripslashes($_POST["adresse"]));
        }
        // --- test de la validité des champs saisis ---
        if (empty($_POST["email_expediteur"])) { 
// il manque l'email de l'expéditeur
                 $erreur="Saisissez votre adresse email...";
        }
        elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){ 
// l'adresse e-mail n'est pas valide
                 $erreur="Votre adresse e-mail n'est pas valide...";
        }
        elseif (empty($_POST["adresse"])) { 
// le message est vide
                 $erreur="Saisissez votre adresse";
        }
        else { 
// --- tous les champs sont correctement remplis: on pourra envoyer le mail ---
                 $etat="ok";
        }
}
else { 
// --- le formulaire n'a pas été soumis ---
           $etat="attente";
}
// === fin de traitement des données du formulaire =======================================================
?>
<html xml:lang="fr" lang="fr" xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <title>Form BORÉAL2008</title>
  <div align="center">
<img src="http://www.sffq.org/uploads/images/enteteboreal.jpg" alt="" /></div>
</head>

<body>

<div align="center">
<h1>BORÉAL 2008</h1>
<h2>Bulletin de vote préliminaire</h2></div>

<?php
if ($etat!="ok"){// le formulaire n'a pas été soumis, ou soumis avec une erreur
         if ($etat=="erreur"){
//le formulaire a été soumis avec une erreur
                         echo "<p><strong>".$erreur."</strong></p>\n"; 
// afficher le message d'erreur
         }
?>

<p><table width="600" border="1" align="center"><tr>
      <td width="600"><div align="left" height="16"><font size="2" face="Verdana, Arial, Helvetica, sans-serif, Tahoma"><i>Ceci est un vote préliminaire. Les cinq oeuvres primées seront votées sur format papier lors du Congrès Boréal.   Les œuvres concernées sont uniquement celles de l’année 2007.  VOUS N’AVEZ PAS BESOIN D’AVOIR TOUT LU POUR VOTER.  Vous pouvez ne pas voter dans une catégorie ou n’exprimer qu’un seul choix. Merci pour votre participation.  
	  </i></font></div></td></tr></table></p>

<?php


$romans = array(

    array(
        "id" => 1,
        "nom" => "Meilleur roman",
        "data" =>array(
            array(
                "id" => 1,
                "valeur" => "loups-garous",
                "nom" => "Amiot, Renée - Nous serons tous des loups-garous",
                ),
            array(
                "id" => 2,
                "valeur" => "naufragés",
                "nom" => "Bacon, Annie - Terra Incognita, tome 1 -Les naufragés de Chélon",
                ),

            ),
        ),
);


foreach($romans as $k => $v){

    echo "<table align='center' border='0' width='600'><tbody><tr>\n";
    echo "<td width='600' style='text-align:left;font-family:Verdana;font-size:20'>".$v['nom']."</td>\n";
    echo "<td align='center' valign='center' width='180'>\n";
    echo "</td></tr>\n";
    echo "<tr><td align='center' valign='middle' width='180'>\n";

    for($xx=0;$xx<5;$xx++){
        echo "\n<select name='liste".$v['id']."[".$xx."]' style='width: 600px;'>\n";
            echo "\t\t<option value=''></option>\n";
        foreach($v['data'] as $k2 => $v2){
            echo "\t\t<option value='".$v2['valeur']."'>".$v2['nom']."</option>\n";
            }
        echo "</select>\n";
        }

    echo "</td></tr>\n";
    echo "</tbody></table>\n";
    }

/*
echo"<pre>";
print_r($romans);
echo"</pre>";
*/


$nouvelles = array(

    array(
        "id" => 2,
        "nom" => "Meilleure nouvelle ou novella",
        "data" =>array(
            array(
                "id" => 1,
                "valeur" => "Beauté",
                "nom" => "Allard, Matt - Beauté fatale [FA], in Nocturne, hors-série 1",
                ),
            array(
                "id" => 2,
                "valeur" => "Fragments",
                "nom" => "Allard, Matt - Fragments [FA], in Horrifique # 56",
                ),

            ),
        ),
);


foreach($nouvelles as $k => $v){

    echo "<table align='center' border='0' width='600'><tbody><tr>\n";
    echo "<td width='600' style='text-align:left;font-family:Verdana;font-size:20'>".$v['nom']."</td>\n";
    echo "<td align='center' valign='center' width='180'>\n";
    echo "</td></tr>\n";
    echo "<tr><td align='center' valign='middle' width='180'>\n";

    for($xx=0;$xx<5;$xx++){
        echo "\n<select name='liste".$v['id']."[".$xx."]' style='width: 600px;'>\n";
            echo "\t\t<option value=''></option>\n";
        foreach($v['data'] as $k2 => $v2){
            echo "\t\t<option value='".$v2['valeur']."'>".$v2['nom']."</option>\n";
            }
        echo "</select>\n";
        }

    echo "</td></tr>\n";
    echo "</tbody></table>\n";
    }

/*
echo"<pre>";
print_r($nouvelles);
echo"</pre>";
*/

$ouvrages = array(

    array(
        "id" => 3,
        "nom" => "Meilleur ouvrage ou essais",
        "data" =>array(
            array(
                "id" => 1,
                "valeur" => "Allard, Jérôme-Olivier",
                "nom" => "Allard, Jérôme-Olivier - Le Cycle d’Elric : un aller simple pour le multivers, in Solaris 162 - La Fanfic: quand le fan devient auteur, in Solaris 164 - Lectures, in Solaris 163",
                ),
            array(
                "id" => 2,
                "valeur" => "Boudreau, Josée",
                "nom" => "Boudreau, Josée - Derniers Lus, in Brins d'éternité #17",
                ),

            ),
        ),
);


foreach($ouvrages as $k => $v){

    echo "<table align='center' border='0' width='600'><tbody><tr>\n";
    echo "<td width='600' style='text-align:left;font-family:Verdana;font-size:20'>".$v['nom']."</td>\n";
    echo "<td align='center' valign='center' width='180'>\n";
    echo "</td></tr>\n";
    echo "<tr><td align='center' valign='middle' width='180'>\n";

    for($xx=0;$xx<5;$xx++){
        echo "\n<select name='liste".$v['id']."[".$xx."]' style='width: 600px;'>\n";
            echo "\t\t<option value=''></option>\n";
        foreach($v['data'] as $k2 => $v2){
            echo "\t\t<option value='".$v2['valeur']."'>".$v2['nom']."</option>\n";
            }
        echo "</select>\n";
        }

    echo "</td></tr>\n";
    echo "</tbody></table>\n";
    }

/*
echo"<pre>";
print_r($ouvrages);
echo"</pre>";
*/

$artistique = array(

    array(
        "id" => 4,
        "nom" => "Meilleure création artistique visuelle ou audiovisuelle",
        "data" =>array(
            array(
                "id" => 1,
                "valeur" => "Bayadjiev",
                "nom" => "Bayadjiev, Alexandre - Le Diable et la lune (Isatis)"
                ),
            array(
                "id" => 2,
                "valeur" => "Bourguignon, Pascale",
                "nom" => "Bourguignon, Pascale - L’Enfant dans le miroir (Marchand de feuille)",
                ),

            ),
        ),
);


foreach($artistique as $k => $v){

    echo "<table align='center' border='0' width='600'><tbody><tr>\n";
    echo "<td width='600' style='text-align:left;font-family:Verdana;font-size:20'>".$v['nom']."</td>\n";
    echo "<td align='center' valign='center' width='180'>\n";
    echo "</td></tr>\n";
    echo "<tr><td align='center' valign='middle' width='180'>\n";

    for($xx=0;$xx<5;$xx++){
        echo "\n<select name='liste".$v['id']."[".$xx."]' style='width: 600px;'>\n";
            echo "\t\t<option value=''></option>\n";
        foreach($v['data'] as $k2 => $v2){
            echo "\t\t<option value='".$v2['valeur']."'>".$v2['nom']."</option>\n";
            }
        echo "</select>\n";
        }

    echo "</td></tr>\n";
    echo "</tbody></table>\n";
    }

/*
echo"<pre>";
print_r($artistique);
echo"</pre>";
*/

$fanique = array(

    array(
        "id" => 5,
        "nom" => "Meilleure activité fanique ou semi-professionnelle",
        "data" =>array(
            array(
                "id" => 1,
                "valeur" => "Brins d'éternité",
                "nom" => "Brins d'éternité"
                ),
            array(
                "id" => 2,
                "valeur" => "Clair/Obscur",
                "nom" => "Clair/Obscur",
                ),

            ),
        ),
);


foreach($fanique as $k => $v){

    echo "<table align='center' border='0' width='600'><tbody><tr>\n";
    echo "<td width='600' style='text-align:left;font-family:Verdana;font-size:20'>".$v['nom']."</td>\n";
    echo "<td align='center' valign='center' width='180'>\n";
    echo "</td></tr>\n";
    echo "<tr><td align='center' valign='middle' width='180'>\n";

    for($xx=0;$xx<5;$xx++){
        echo "\n<select name='liste".$v['id']."[".$xx."]' style='width: 600px;'>\n";
            echo "\t\t<option value=''></option>\n";
        foreach($v['data'] as $k2 => $v2){
            echo "\t\t<option value='".$v2['valeur']."'>".$v2['nom']."</option>\n";
            }
        echo "</select>\n";
        }

    echo "</td></tr>\n";
    echo "</tbody></table>\n";
    }

	
/*
echo"<pre>";
print_r($fanique);
echo"</pre>";
*/

?>

<p><table width="600" border="1" align="center"><tr>
      <td width="600"><div align="left" height="16"><font size="2" face="Verdana, Arial, Helvetica, sans-serif, Tahoma"><i>Cette liste, bien qu'exhaustive, peut s'avérer incomplète. Si vous désirez voter pour une ou plusieurs oeuvres ne figurant pas dans cette liste, je vous invite à les inscrire ici. Max.5 par catégorie.  
	  </i></font></div></td></tr></table></p>

<p><table width="600" align="center"><tr><td width="600"><div align="left" height="16">
		<label for="message">Autres suggestions:</label><br />
        <textarea name="message" id="message" cols="72" rows="5"><?php
        if (isset($_POST["message"])) { 
// le message a été saisi: le réafficher
                echo htmlspecialchars($_POST["message"],ENT_QUOTES);
        }
        ?></textarea></td></tr></table>
        </p>	  

<p><table width="600" border="1" align="center"><tr>
      <td width="600"><div align="left" height="16"><font size="2" face="Verdana, Arial, Helvetica, sans-serif, Tahoma"><i>Ces renseignements sont nécessaires à la validitation de votre bulletin ; Ils resteront confidentiels : 
	  </i></font></div></td></tr></table></p>

<p><table width="600" align="center"><tr><td width="600"><div align="left" height="16">
        <label for="titre">Votre nom (obligatoire):</label><br />
        <input type="text" size="40" name="titre" id="titre" value="<?php
        if (!empty($_POST["titre"])) { 
// le titre du message a été saisi: le réafficher
                echo htmlspecialchars($_POST["titre"],ENT_QUOTES);
        }
        ?>" /></td></tr></table>

		<table width="600" align="center"><tr><td><form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
        <p><label for="email_expediteur">Votre courriel (obligatoire):</label><br />
        <input type="text" size="40" name="email_expediteur" id="email_expediteur" value="<?php
        if (!empty($_POST["email_expediteur"])) { 
// l'adresse email de l'expéditeur a été saisie: la réafficher
                echo htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);
        }
        ?>" /></td></tr></table>

        <table width="600"  align="center"><tr><td><p><label for="message">Votre adresse (obligatoire):</label><br />
        <textarea name="message" id="message" cols="40" rows="5" value=:"Adresse/rue/ville/province/code postal/pays"><?php
        if (isset($_POST["adresse"])) { 
// le message a été saisi: le réafficher
                echo htmlspecialchars($_POST["message"],ENT_QUOTES);
        }
        ?></textarea></td></tr></table>
        </p>
        <table width="600" align="center"><tr><td><p><input type="submit" name="envoyer" value="Envoyer" /></td></tr>
		
		</table>
        </p>
        </form>
<?php
}
else {
// le formulaire a été soumis sans erreur, on envoie le mail
        $entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";
        $entete .= "MIME-Version: 1.0";
        if (@mail($email_webmaster,$_POST["titre"],$_POST["adresse"],$entete)){ 
// mail envoyé
                echo "Votre bulletin de vote a été envoyé. Merci pour votre participation.<br />\n";
                echo "<a href=\"".$_SERVER["PHP_SELF"]."\">nnn</a>\n";
        }
        else { 
// erreur lors de l'envoi du mail
                echo "Un problème s'est produit lors de l'envoi de votre bulletin.\n";
                echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Veuillez réessayer...</a>\n";
        }
}
?>
</body>
</html> 


Merci pour votre aide Smiley biggrin
Modifié par Mireldar (07 Mar 2008 - 23:59)
Bonjour,

Sans répondre à ton souci directement, j'ai l'impression que ergonomiquement la solution de la liste déroulante est peu adaptée à de gros volumes de choix dans une liste déroulante. Particulièrement pour un choix qui n'est pas d'emblée connue par l'utilisateur comme une année, un code postal, un code connu par exemple. Tu sembles avoir retenu un choix alphabétique par auteur dans les listes déroulantes qui risque de "fausser" les résultats du vote, les utilisateurs pourraient ne pas voir tous les nommés de la listes, dont la répétition de sélection risque de lasser l'utilisateur avant qu'il arrive au bout (15 listes déroulantes avec XX choix avant de saisir ses infos personnelle Smiley smile ).

Puisqu'il s'agit d'une présélection il faudrait peut-être prévoir un mode de sélection différent, pourquoi pas un vote sur chaque oeuvre. Ce qui changerait radicalement le type de sélection Smiley smile
Je ne suis pas certaine de saisir ce que tu entends par vote sur chaque oeuvre. Tu parles de case à cocher? C'est qu'il y a environ 500 oeuvres au total, divisé en 5 listes.

Sinon, peux-tu me montrer un exemple?

Merci Smiley smile
Modifié par Mireldar (24 Feb 2008 - 04:33)
Administrateur
Bonjour,

j'ai édité l'adresse mail en ligne 3 pour éviter les robots à spam.
Bonjour,

la meilleur chose à faire à mon humble avis est de commencer par le Valider, en effet le code actuel est pas vraiment propre et ne va donc pas facilité la réparation des problèmes.
Je renvois le sujet.

Mon formulaire est validé, mais je ne le reçois toujours pas dans mon courriel Smiley decu
Mireldar a écrit :
Je renvois le sujet.

Mon formulaire est validé, mais je ne le reçois toujours pas dans mon courriel Smiley decu


Pour la validation, moi il me dit toujours: Failed validation, 62 Errors


Pour ton problème de mail, as-tu essayé de créer une bête page
<?php

mail('toto', 'mail de test', 'test test', 'From: toto <toto>');

?>



Histoire de s'assurer que la fonction mail est activée, configurée et fonctionnelle ?
Si c'est le cas cela vaut la peine d'examiner ton code, sinon il faut partir sur une autre piste comme une classe php utilisant un serveur SMTP.
Modifié par Necromantik (04 Mar 2008 - 19:06)
Je me suis envoyé un formulaire normal et ça fonctionne. Le problème est dans le code.

La validation montre plusieurs erreurs. Je n'arrive pas à les corriger, les lignes et les colonnes ne coïncident pas avec celles de mon notepad.

Qu'est ce que je dois installer pour pouvoir le lire?
En fait je reçois le formulaire, avec le nom et l'adresse de la personne qui me l'envoie. Ce sont les sélections qu'il fait que je ne reçois pas.
Je ne comprends vraiment pas les corrections qu'il veut que j'apporte sur les > les ' et les < J'ai essayé de faire genre ceci /> mais ça me fait une erreur de plus Smiley decu
niveau validation, il s'agit des lignes et colonnes du html généré, donc en ignorant le php.

Pour ton formulaire, l'ordre est-il important (choix n°1 plus avantagé que n°2) ou non ?
Non, l'ordre n'est pas important.

Pour la validation, mes < > ' et " sont rejetés à cause de mon meta

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

Mais si j'enlève la méta, le formulaire est invalidable
Bon bon bon, *retrousse ses manches*

Je vais faire en vrac, conseils, réglage de problème, etc. Prends ce qui t'intéresse.


En premier lieu la manière de stocker les données est pas adaptée à mon sens, dispersées un peu partout dans le code.
Je propose l'organisation suivante: un tableau contenant tous les romans et un contenant toutes les catégories le tout stocké dans un fichier à part. Un exemple en "image":

// Romans
$romans = array (
  'Amiot, Renée - Nous serons tous des loups-garous',
  'Bacon, Annie - Terra Incognita, tome 1 -Les naufragés de Chélon',
  'Allard, Matt - Beauté fatale [FA], in Nocturne, hors-série 1',
  'Allard, Matt - Fragments [FA], in Horrifique # 56'
);
// Catégories, index0: nom, index1: liste des romans à inclure
$categories = array (
  array('Meilleur roman', array(0, 1)),
  array('Meilleure nouvelle ou novella', array(2, 3))
);



Depuis cette manière de stocker il devient très facile de créer le formulaire.
Je propose le code suivant qui utilise plutôt une séléction à choix multiple au lieu de plusieurs listes déroulantes.

foreach($categories as $catId => $catData) {
	echo '<h3>', $catData[0], '</h3>', '<p>',
	'<select multiple="multiple" name="liste[', $catId, '][]" size="', count($catData[1])+1, '">';

	foreach($catData[1] as $romanId) {
		echo '<option value="'.$romanId.'">'.$romans[$romanId].'</option>';
	}

	echo '<option class="no" value="-1">-Ne rien sélectionner-</option>';
	echo '</select></p>';
}


Ensuite le traitement du formulaire est nettement plus simple à gérer avec les exceptions php.
Exemple:

if(isset($_POST["envoyer"])) {
  try {
    if(erreur) {
      throw new Exception('Une erreur est survenue');
    }
  } catch (Exception $e) {
    $erreur = $e->getMessage();
  }
}



Tout ce qui est affiché depuis php doit être passé par "htmlspecialchars" afin d'éviter des erreurs avec < ou > par exemple:

$roman = 'Super liver > mais qui bug';
echo htmlspecialchars($roman);



Pour que ton code HTML soit valide, lisible, etc le mieux est d'utiliser les tabulations. A chaque ouverture de balise on indente, à la fermeture on réduit. Ne pas oublier que les balises finissant en /> sont auto-fermantes. Exemple:

<html>
  <head>
    <title>Hello world</title>
  </head>
  <body>
    <img src="toto" alt="" />
  </body>
</html>


Enfin la mise en page se fait via css les attribut de type align="" sont dépréciés en XHTML.



J'ai appliqué la plupart de ces points et zippé le tout à toi de voir ce que tu peux en tirer.
Merci beaucoup pour ton aide, c'est très gentil Smiley smile

Je n'ai pas accès au zip dont tu parles, j'imagine que le site est protégé contre ce genre de téléchargement.

J'ai quand même coller ton code dans mon php et ça semble marcher Smiley smile Je vais me pencher dessus un peu plus demain.

Merci Smiley smile je commençais à me décourager.
Le zip est sur mon site et devrait normalement accepter les téléchargements.

Ceci dit si ça ne marche pas envoie-moi une adresse email par message privé Smiley cligne .

Et de rien Smiley langue
En attendant des nouvelles de mon hébergeur à propos de php5 (je me doute que ce sera long Smiley decu ), j'ai essayé de refaire le formulaire en html.

Ça fonctionne, je le reçois dans mon courrier. Woupi, enfin. Il est juste ici

Par contre, comme tu peux voir, il y a juste un problème. Je n'arrive pas à définir la largeur de mes OPTION VALUE. Dans mon code, j'ai essayé width ou cols un peu partout, rien ne va.

<p><TABLE width="600" cols="72" align="center">	
    <TR><TD width="600" cols="72"><h3>Meilleur ouvrage ou essais</h3></TD></TR>
	<TR><TD width="600" cols="72"><SELECT name="ouvrage" width="600">
		<OPTION VALUE="selectionner" width="600">[sélectionner]</OPTION>
		<OPTION VALUE="Allard, Jérôme-Olivier - Le Cycle d’Elric : un aller simple pour le multivers, in Solaris 162 - La Fanfic: quand le fan devient auteur, in Solaris 164 - Lectures, in Solaris 163" width="600">Allard, Jérôme-Olivier - Le Cycle d’Elric : un aller simple pour le multivers, in Solaris 162 - La Fanfic: quand le fan devient auteur, in Solaris 164 - Lectures, in Solaris 163</OPTION>
		<OPTION VALUE="Boudreau, Josée - Derniers Lus, in Brins d'éternité #17" width="600">Boudreau, Josée - Derniers Lus, in Brins d'éternité #17</OPTION>
	</SELECT></TD></TR>


Halala Smiley decu
Pages :