Créer un formulaire à partir d'une requete sql

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 167 fois - Téléchargée 29 fois

Contenu du snippet

Dans la continuité de la création de mon site j'ai été amené à développé cette fonction permettant de créer un formulaire à partir d'une requete SQL

Source / Exemple :


//--- Affiche une requete SQL 
function AfficherFormulaire($sql,$nbChampsEnMoins=0, $TailleMax=0){
	
	$rst = mysql_query($sql);
	
	if (!$rst){
	   echo "Erreur :" . mysql_error() . "<br>";
	   
	}else{	
		//--- Nombre d'enregistrements	
		$nbLig = mysql_num_rows($rst);
		
		//--- Nombre de colonnes			
		$nbCol = mysql_num_fields($rst) - $nbChampsEnMoins;
		
		//--- Début du tableau
		echo '<table width="100%" cellpadding="0" cellspacing="0">';
		
		//--- Affichage noms des colonnes
		$i = 0;
		echo '<tr>';
		for ($j = 0; $j < $nbCol; $j++)
		{ 
		   	$type  = mysql_field_type($rst, $j);
		   	$name  = mysql_field_name($rst, $j);
		   	$len  = mysql_field_len($rst, $j);
	  		$flags = mysql_field_flags($rst, $j);

			//--- Zone de texte
			if ($type == 'string' && $len > 1){
				echo '<tr>';
				echo '	<td width="30%">'. $name . ' :';
				if ($flags == 'not_null') echo '*';
				echo '	</td>';
				echo '	<td>';
				echo '		<input type="text" name="'. $name . '"';
				echo '			value="' . $_POST[$name] . '"';
				echo '			maxlength="' . $len . '"';
				if ($len > $TailleMax){
					echo '			size="' . $TailleMax . '"></td>';
				}else{
					echo '			size="' . $len . '"></td>';
				}
				echo '	<td width="20%"></td>';
				echo '</tr>';
				
			//--- Case à cocher
			}elseif ($type == 'int' && $len == 1){
				echo '<tr>';
				echo '	<td width="30%">'. $name . ' :</td>';
				echo '	<td>';
				echo '		<input type="checkbox" name="'. $name . '"';
				echo '			value="1"';
				if ($_POST[$name] == '1'){
					echo '			checked';
				}
				echo '	class="checkbox"></td>';
				echo '	<td width="20%"></td>';
				echo '</tr>';
				
			//--- Zone de texte numérique
			}elseif ($type == 'int'){
				echo '<tr>';
				echo '	<td width="30%">'. $name . ' :';
				if ($flags == 'not_null') echo '*';
				echo '	</td>';
				echo '	<td>';
				echo '		<input type="text" name="'. $name . '"';
				echo '			value="' . $_POST[$name] . '"';
				echo '			maxlength="' . $len . '"';
				if ($len > $TailleMax){
					echo ' size="' . $TailleMax . '"></td>';
				}else{
					echo ' size="' . $len . '" onChange="if (isNaN(this.value)) this.value = \'\' ;"></td>';
				}
				echo '	<td width="20%"></td>';
				echo '</tr>';
				
			//--- Case à cocher
			}
		}
		echo '</tr>';

		//--- Fin du tableau
		echo '</table>';
	}
}

Conclusion :


paramètres :

$sql = la chaine de requete
$nbChampsEnMoins - Si dans notre requete on ne souhaite pas afficher les $nbChampsEnMoins derniers champs
$TailleMax = Taille maximum autorisé pour les zones de texte

informations complémentaires:
les champs de type string crée de zone de texte
les champs de type int et de longueur 1 sont considérés comme des case à cocher (soit 0 soit 1)
Les champs de type int de longueur supérieure à 1 sont des zones numériques, si la valeur n'est pas saisi correctement elle est automatiquement effacée

les champs not_null sont suivi d'un * signifiant obligatoire

A voir également

Ajouter un commentaire

Commentaires

galadriann
Messages postés
87
Date d'inscription
mercredi 7 mai 2003
Statut
Membre
Dernière intervention
12 juin 2006
-
Au lieu de mettre ton $nbChampsEnMoins, pourquoi ne pas plutot compter les champs retourner par ta requete ? ou alors passer les champs a afficher dans un array :

function AfficherFormulaire($sql,$Champs)

Ainsi tu pourrais meme ajouter la taille des champs directement dans l'array en passant le nom du champs comme cle et la taille comme valeur ( champs=> 10, champs2=>20, ...)

Ce serait aussi bien de faire un fonction d'abstration de base de donnees dans ton code. Si on passe sur Posgrep, il faut tout changer ...

Sinon un exemple serait interessant ...

Je vais essayer de tester ...

je note apres ...

a+
ranouf
Messages postés
237
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
31 août 2009
-
Par contre j'ai pas encore géré la textarea, ça sera dans la prochaine version !!!

un petit exemple de la table :

$sql = '';
$sql .= ' SELECT Page, Titre, Afficher, Position, Description, Keywords';
$sql .= ' FROM Menu';
$sql .= ' Where 1=2'; // Renvoie une requete vide donc moins de ressources utilisées !
AfficherFormulaire ($sql, 0, 30);

Ensuite, je préfère utilisé en nombre de champs en moins mais si tu veux l'adpater pour qu'elle gere une liste de champs acceptés (ou non acceptés) tu peux reprendre mon code et poser un nouvelle source, il n'y a pas de pb !:-)

Concernant la taille, en fait j'ai une taille maximale du champs a respecter pour éviter que mes cadres soient élargis. Si la taille du champs est inférieur à la taille maximale alors il récupere la taille du champs !

Merci pour tes commentaires, j'avais pas pensé à gérer ça dans un array, mais c vrai que ça peut etre une bonne idée.

@+
FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3 -
"Ce serait aussi bien de faire un fonction d'abstration de base de donnees dans ton code. Si on passe sur Posgrep, il faut tout changer ..." On parle pas de savoir manier SQL la quand même !
Si tu veux une couche d'abstraction, j'en ai fait une : http://www.phpcs.com/code.aspx?ID=33135 . T'as juste à faire une classe étendu avec les fonctions pour pgsql et ca passera tout seul. (écrire quelques bouts de code en plus n'a jamais tué personne :p)
Après, tu modifies un peu sa fonction, et hop. Tu l'as comme ca ton abstraction de BDD ! :)

Cependant, je vais faire un reproche tout bète : utiliser un tableau pour faire un formulaire :o J'aurais préféré un truc à base de CSS mais bon... c'est déja pas mal quand même :)
ranouf
Messages postés
237
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
31 août 2009
-
Apres il suffit de l'adapter, j'ai fait un truc de base pour que le développeur landa s'y retrouve.

Si d'autres on envie de la faire évoluer, ya pas de pb au contraire ça me fera plaisir de voir sur la source, d'apres la source de ranouf :)

Posgrep je connais pas donc si tu veux t'y mettre pas de pb !


@++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.