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 '
';

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 '';
		//Traiter les différentes possibilités.
		//Cf. Suite de l'article
	}
	echo '
'; }

Type de clé : Clé étrangère

C'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é : VARCHAR

Le varchar est très simple à gérer :

elseif(strpos($Colonne['Type'],'varchar')!==false)//Type VARCHAR
	echo '';

Type de clé : TEXT

Pour 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 '
';

Type de clé : BOOL

Le 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és

Je 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 '';
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 '

Retour aux choix des tables

'; echo '

' . $Msg . '

'; echo '
'; $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 ''; 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 ''; elseif($Colonne['Type']=='text')//Type TEXT echo '
'; elseif($Colonne['Type']=='tinyint(1)')//Type BOOL makeRadio($Colonne['Field'],array('1'=>'Oui','0'=>'Non')); else echo 'ERREUR, type de colonne inconnu.'; } echo '
'; } echo ''; echo '
';