8791 sujets

Développement web côté serveur, CMS

Bonjour et merci d'avance pour votre aide,

Voilà, j'ai déjà demandé sur le siteduzero mais j'ai été très mal accueillis donc je viens chez vous car je sias que vous êtes beaucoup plus sympatique! J'ai réalisé un formulaire d'inscription en ligne PHP/MYSQL pour une course à pied (de la fête de mon village), j'aimerais que vous me dites de ce que vous pensez de mon code.

Fonctionnement: inscription via formulaire qui enregistre le tout dans une table, email de confirmation de l'inscription, récupération des données sous forme de tableau.

Par contre, sur ma page "inscription_en_ligne2.php" j'ai essayé de me protégé des injections sql mais bon je ne sais pas trop, je me suis aidé de cette page: http://www.art-toon.fr/tutos-12-33.html .

Et au niveau de ma structure sql, il vaut meiux que j'utilisé ça:


CREATE TABLE `site_inscriptions` (
  `id` int(20) NOT NULL auto_increment,
  `Nom` text(100) NOT NULL,
  `Prenom` text(100) NOT NULL,
  `Adresse` text(100) NOT NULL,
  `Ville` text(100) NOT NULL,
  `Code_Postal` text(100) NOT NULL,
  `Telephone` text(100) NOT NULL,
  `Email` text(100) NOT NULL,
  `Sexe` text(100) NOT NULL,
  `Club_ou_Association` text(100) NOT NULL,
  `Licencie_Licence` text(100) NOT NULL,
  `Federation` text(100) NOT NULL,
  `Sapeurs_Pompiers` text(100) NOT NULL,
  `Annee_de_Naissance` text(100) NOT NULL,
  `Course` text(100) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


Ou ça:

CREATE TABLE `site_inscriptions` (
  `id` int(20) NOT NULL auto_increment,
  `Nom` varchar(100) NOT NULL,
  `Prenom` varchar(100) NOT NULL,
  `Adresse` varchar(100) NOT NULL,
  `Ville` varchar(100) NOT NULL,
  `Code_Postal` varchar(100) NOT NULL,
  `Telephone` varchar(100) NOT NULL,
  `Email` varchar(100) NOT NULL,
  `Sexe` varchar(100) NOT NULL,
  `Club_ou_Association` varchar(100) NOT NULL,
  `Licencie_Licence` varchar(100) NOT NULL,
  `Federation` varchar(100) NOT NULL,
  `Sapeurs_Pompiers` varchar(100) NOT NULL,
  `Annee_de_Naissance` varchar(100) NOT NULL,
  `Course` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


Ou autre chose ?

Et puis pour finir (oui je sais, j'en demande beaucoup Smiley lol ) comment faire des champs obligatoire pour formulaire en PHP?

Source: http://www.coursedelarhubarbe.fr/formulaire.zip

Merci encore
Modérateur
Salut Itachi68,

À mon humble avis les deux structures de tables sont bonnes.

En ce qui concerne les injections sql, je te propose de regarder de plus près la fonction htmlentities. Elle permet d'éviter beaucoup de déboire.

Pour les champs obligatoires, tu as plusieurs alternatives : regex, variables définies ou pas, longueur de la variable, ...

Exemple :


if (!isset($_REQUEST['nom'])){// issset test s'il y a une valeur dans la variable $_REQUEST['nom']
 $erreur[]="Veuillez inscrire correctement votre nom";
 return $erreur;
}


@+
Hello Itachi68 Smiley cligne ,

Pour ce qui est de l'injection tu peux voir ce post.

Pour la structure, ni l'un ni l'autre Smiley lol :
- les types de colonnes sont importants pour tes traitements futurs. Une zone Année de naissance devrait être en YEAR et pas de type caractère de même qu'une date de naissance devrait être de type DATE...
- il est de plus inutile de réserver 100 octets avec un VARCHAR(100) pour une zone qui ne dépassera jamais 1 (Sexe) ou 5 (Code Postal). Ne parlons pas du type text qui va carrément réserver 65535 octets Smiley biggol ! Plus drôle encore, ton id INT(20) permet que 99.999.999.999.999.999.999 personnes s'inscrivent... je suppose que ça inclue les martiens et autres jupitériens Smiley ravi ?
Le plus simple est de (re)lire la doc mysql.

Pour les champs de formulaire obligatoires, voir cet exemple.

Et pour finir, utilises plutôt htmlspecialchars() que htmlentities.

A+ Smiley smile
Modifié par Heyoan (13 Apr 2008 - 21:31)
Merci tous le monde ! Désolé pour le retard, j'étais parti en vacances.

Es-ce mieux comme structure sql ???
CREATE TABLE `site_inscriptions` (
  `id` tinyint(255) NOT NULL auto_increment,
  `Nom` varchar(30) NOT NULL,
  `Prenom` varchar(30) NOT NULL,
  `Adresse` varchar(50) NOT NULL,
  `Ville` varchar(100) NOT NULL,
  `Code_Postal` tinyint(5) NOT NULL,
  `Telephone` varchar(20) NOT NULL,
  `Email` varchar(50) NOT NULL,
  `Sexe` tinytext NOT NULL,
  `Club_ou_Association` varchar(50) NOT NULL,
  `Licencie_Licence` varchar(30) NOT NULL,
  `Federation` varchar(15) NOT NULL,
  `Sapeurs_Pompiers` varchar(50) NOT NULL,
  `Annee_de_Naissance` tinyint(4) NOT NULL,
  `Course` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=54 DEFAULT CHARSET=latin1 AUTO_INCREMENT=54 ;


Et pour les champs obligatoire, j'ai trouvé une autre méthode qui marche bien, merci quand même pour ta méthode Heyoan.

  if(empty($nom) || empty($prenom) || empty($adresse) || empty($ville) || empty($cp) || empty($email) || empty($naissance))
{
print("<center>Veuillez remplir tous les champs marqu&eacute;s d'un &eacute;toile (*)<br /><a href=\"javascript:window.history.go(-1)\" style=\"color:#065800;text-decoration:none;\"><strong>[Retourner au formulaire]</strong></a></center>");
exit();
} 
Re',

la structure est bien meilleure sauf :
- pour id un SMALLINT(5) au lieu de 255 me semble amplement suffisant (disons MEDIUMINT(6) en étant très optimistes Smiley cligne ).
- pour Sexe plutôt un booleen ou un enum('F','M').
- d'une manière générale tu peux rajouter l'attribut UNSIGNED pour les numériques non signés.

Pour les champs obligatoires ton test est suffisant sauf si tu as un jour besoin de préciser un peu plus le message d'erreur. Par exemple "L'adresse email est invalide !"

En voyant le javascript:window.history.go(-1) je me permets de te redire ce qui était dans l'autre post : pour se simplifier la vie (réaffichage des champs, Javascript désactivé, etc...) il vaut mieux tout faire sur la même page.

A+
Modifié par Heyoan (13 Apr 2008 - 21:31)
Modérateur
Salut,

Juste 2 petites précisions :
* Je pense qu'il est utile de garder les valeurs du formulaire lorsque l'utilisateur ne rempli pas correctement ton formulaire (c'est très énervant de tout ressaisir).
* En ce qui concerne l'année de naissance, je pense également qu'il serait judicieux de placer cette dernière dans un menu select. Sinon une REGEX est pas mal non plus.

++
Modifié par Nolem (12 Apr 2008 - 19:46)