Recherche
Peut être aimerez-vous...
Sections du site
Sites Neamar
Lisez ces articles !
| Insertions mySQL faciles |
|
| Programmation et tuning - Programmation Web |
| Écrit par Neamar |
| Samedi, 02 Janvier 2010 23:56 |
|
Mettons-nous bien d'accord, réaliser un formulaire d'insertion pour une table SQL peut très vite devenir lassant. 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. 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 baseTout d'abord, préparons des fonctions qui sont toujours utiles pour un formulaire. Attributs name et idPour 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éroulantesLes 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 '<select ' . nameID($Name) . '>'; foreach($Tableau as $Val=>$Option) echo '<option value="' . $Val . '">' . $Option . '</option>'; echo '</select>'; } Boutons radioRelativement 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 '<input type="radio" name="' . $Name . '" value="' . $Val . '" id="' . $Val . '" /> <label for="' . $Val . '">' . $Option . '</label>'; } Insertion en tableMuni de nos outils, nous allons pouvoir créer le formulaire à proprement parler. Récuperer la structure de la tableIl 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… //Récupérer la structure de la table $Structure=mysql_query('DESCRIBE ' . $Table)or die(mysql_error()); L'affichage du formulaireTout d'abord, ouvrir le formulaire. Rien d'étrange ici… echo '<form method="post" action="">'; Ensuite, boucler sur les différents champs de la table. //Pour chacune des clés de la table while($Colonne=mysql_fetch_assoc($Structure)) { //Exclure l'ID qui est en autoi increment et n'a pas à être spécifié if($Colonne['Field']!='ID') { //Afficher un label echo '<label for="' . $Colonne['Field'] . '" style="float:left; width:350px;">' . $Colonne['Field'] . ' : </label>'; //Traiter les différentes possibilités. //Cf. Suite de l'article } echo ' '; } Type de clé : Clé étrangèreC'est le cas le plus complexe : on va récupérer toutes les valeurs disponibles dans la table mère et les afficher. Pour rappel, la convention ici pour les clés étrangères est Table_Clé. if(strpos($Colonne['Field'],'_')!==false)//Clé étrangère { //Syntaxe : TABLE_Cle $Delimiteur=strpos($Colonne['Field'],'_'); $Table=substr($Colonne['Field'],0,$Delimiteur); $Cle=substr($Colonne['Field'],$Delimiteur+1); $Possibilites=mysql_query('SELECT ' . $Cle . ' FROM ' . $Table); $PossibilitesCombo=array(); while($Possibilite=mysql_fetch_assoc($Possibilites)) { $PossibilitesCombo[$Possibilite[$Cle]] = $Possibilite[$Cle]; } makeCombo($Colonne['Field'],$PossibilitesCombo); } Type de clé : VARCHARLe varchar est très simple à gérer : elseif(strpos($Colonne['Type'],'varchar')!==false)//Type VARCHAR echo '<input type="text" ' . nameID($Colonne['Field']) . ' />'; Type de clé : TEXTPour le text, on est généreux et on affiche un textarea afin de ne pas se sentir à l'étroit elseif($Colonne['Type']=='text')//Type TEXT echo ' <textarea cols="25" rows="5" style="width:90%;" ' . nameID($Colonne['Field']) . '></textarea>'; Type de clé : BOOLLe type bool existe en mySQL, mais il est géré de façon interne par un tinyint(1) ; toutes les valeurs différentes de 0 sont considérées comme vraies. Dans notre cas, on affiche deux boutons radio « lisibles » : elseif($Colonne['Type']=='tinyint(1)')//Type BOOL makeRadio($Colonne['Field'],array('1'=>'Oui','0'=>'Non')); Autres possibilitésJe fais volontairement abstraction de quelques cas courants (int et enum) qui peuvent être facilement gérés ; le but ici n'étant pas d'alourdir inutilement un article déjà chargé. Et enfin, finir le formulaire : echo '<input type="submit" value="Ajouter une ligne sur ' . $Table . '" />'; echo '</form>'; L'enregistrement des donnéesFini ? Non ! Il faut encore enregistrer les données fournies par l'utilisateur ! 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= '<p>Ligne correctement ajoutée.</p>'; } //Formulaire d'ajout de lignes sur la table $_GET['Table'] echo '<p><a href="insertion.php">Retour aux choix des tables</a></p>'; echo '<p>' . $Msg . '</p>'; echo '<form method="post" action="">'; $Structure=mysql_query('DESCRIBE ' . $Table)or die(mysql_error()); //Récupérer la structure de la table while($Colonne=mysql_fetch_assoc($Structure)) { if($Colonne['Field']!='ID') { echo '<label for="' . $Colonne['Field'] . '" style="float:left; width:350px;">' . $Colonne['Field'] . ' : </label>'; if(strpos($Colonne['Field'],'_')!==false)//Clé étrangère { //Syntaxe : TABLE_Cle $Delimiteur=strpos($Colonne['Field'],'_'); $Table=substr($Colonne['Field'],0,$Delimiteur); $Cle=substr($Colonne['Field'],$Delimiteur+1); $Possibilites=mysql_query('SELECT ' . $Cle . ' FROM ' . $Table); $PossibilitesCombo=array(); while($Possibilite=mysql_fetch_assoc($Possibilites)) { $PossibilitesCombo[$Possibilite[$Cle]] = $Possibilite[$Cle]; } makeCombo($Colonne['Field'],$PossibilitesCombo); } elseif(strpos($Colonne['Type'],'varchar')!==false)//Type VARCHAR echo '<input type="text" ' . nameID($Colonne['Field']) . ' />'; elseif($Colonne['Type']=='text')//Type TEXT echo ' <textarea cols="25" rows="5" style="width:90%;" ' . nameID($Colonne['Field']) . '></textarea>'; elseif($Colonne['Type']=='tinyint(1)')//Type BOOL makeRadio($Colonne['Field'],array('1'=>'Oui','0'=>'Non')); else echo 'ERREUR, type de colonne inconnu.'; } echo ' '; } echo '<input type="submit" value="Ajouter une ligne sur ' . $Table . '" />'; echo '</form>'; |
| Mise à jour le Dimanche, 07 Février 2010 18:14 |
