Mettons-nous bien d'accord, réaliser un formulaire d'insertion pour une table SQL peut très vite devenir lassant.
C'est marrant une fois, deux fois… après, on se fatigue de devoir gérer manuellement les form, input et autres label.
Il y a des fois pour lesquelles on est obligé de faire un formulaire personnalisé, mais dans la grande majorité des cas on peut se contenter d'un formulaire générique.
Dans cet article, nous supposerons que l'on ne connaît que le nom de la table dans laquelle on veut insérer des données.
Il faudra donc récupérer la structure de la table, afficher un formulaire en fonction des différents types et si nécessaire préparer les jointures sur les clés étrangères.
Afin de simplifier le problème, on se fixera quelques conventions : pas de tinytext mais des varchar, pas d'enum (même si les gérer n'est pas difficile), une clé primary auto_increment nommée ID, et une convention claire pour les clés étrangères (le nom de la clé correspond à la table « mère » suivie d'un underscore et de la clé, par exemple Auteurs_Pseudo).
Cet article a été amélioré, revu et mis à l'intérieur d'une classe pour une utilisation plus simple. Le module est devenu plus puissant et se nomme désormais EasySQL.
Fonctions de base
Tout d'abord, préparons des fonctions qui sont toujours utiles pour un formulaire.
Attributs name et id
Pour chaque élément de formulaire, le name et l'id sont normalement égaux (à l'exception des boutons radio, qui seront traités à part). On peut donc faire une fonction qui nous renverra ce code :
//Fonction de convénience pour ajouter les attributs name et id à un formulaire. function nameId($Name) { return 'name="' . $Name . '" id="' . $Name . '"'; }
Listes déroulantes
Les listes déroulantes peuvent aussi être longues à taper manuellement. Voici une fonction qui prend en paramètre un tableau associatif et renvoie le code correct (la valeur correspond à la clé du tableau, l'affichage à la valeur).
//Crée un combobox avec les options fournies dans le tableau function makeCombo($Name,$Tableau) { echo ''; }
Boutons radio
Relativement similaire à la liste déroulante, ce code renvoie des boutons type radio (un seul cochable).
//Créer une liste de boutons radios avec les options fournies dans le tableau function makeRadio($Name,$Tableau) { foreach($Tableau as $Val=>$Option) echo ' '; }
Insertion en table
Muni de nos outils, nous allons pouvoir créer le formulaire à proprement parler.
Récuperer la structure de la table
Il y a une instruction mySQL pour récupérer la structure d'une table, il s'agit de DESCRIBE. Cette instruction renvoie chacune des colonnes de la table, avec sa description intégrale : type, not null, auto_increment, nom…
Les résultats intéressants sont Field (le nom du champ) et Type (le type des données).
//Récupérer la structure de la table $Structure=mysql_query('DESCRIBE ' . $Table)or die(mysql_error());
L'affichage du formulaire
Tout d'abord, ouvrir le formulaire. Rien d'étrange ici…
echo '';
L'enregistrement des données
Fini ? Non ! Il faut encore enregistrer les données fournies par l'utilisateur !
Toujours dans un souci de concision, nous considérerons ici que la personne qui entre les données est une personne digne de confiance et pas complètement manchot, on ne fera donc pas de gestion d'erreurs avancées. Attention à protéger vos champs avant de les enregistrer si les magic_quotes ne sont pas activées !
if(count($_POST)!=0) { //Sécuriser les données si pas de magic_quotes : $_POST=array_map(mysql_real_escape_string,$_POST); //Enregistrer la ligne si des données ont été envoyées //Préparer la requête $SQL='INSERT INTO ' . $Table . ' VALUES(""'; foreach($_POST as $Val) $SQL .=',"' . $Val . '"'; $SQL .=')'; //Et l'exécuter mysql_query($SQL)or die('<pre>' . $SQL . '</pre>Erreur : ' . mysql_error()); }
Pour conclure ce mini-tuto, voici le code global de l'application :
if(count($_POST)!=0) { //Sécuriser les données $_POST=array_map(mysql_real_escape_string,$_POST); //Enregistrer la ligne si des données ont été envoyées $SQL='INSERT INTO ' . $Table . ' VALUES(""'; foreach($_POST as $Val) $SQL .=',"' . $Val . '"'; $SQL .=')'; mysql_query($SQL)or die('<pre>' . $SQL . '</pre>Erreur : ' . mysql_error()); $Msg= '';Ligne correctement ajoutée.
'; } //Formulaire d'ajout de lignes sur la table $_GET['Table'] echo ''; echo '' . $Msg . '
'; echo '