Accueil > > > GÉNÉRATEUR SQL D'INSERTION OU DE MISE À JOUR
GÉNÉRATEUR SQL D'INSERTION OU DE MISE À JOUR
Information sur la source
Description
Cette fonction permet de générer automatiquement un SQL INSERT ou UPDATE par l'entremise d'un tableau contenant le nom et les valeurs des champs à traiter. Elle est accompagnée d'une fonction, "Verif_Interg_Tbl", qui vérifie l'intégrité du tableau passé en paramètre. Cette fonction ppeut être désactivée en commentant la ligne if(!Verif_Interg_Tbl($Crit_Requete,$Nbre_champs_at tendus) || $Nbre_Champs==0 ) die('Le tableau n\' a pas '.$Nbre_champs_attendus.' colonnes par ligne, ou bien le nombre de lignes attendu n\'est pas atteint.');
Source
- <?php
- function Verif_Interg_Tbl(&$Tbl,$Nbre_Col=0,$Nbre_Lignes=0)
- {
- //Cette fonction vérifie que le nombre de colonnes et/ou de lignes attendues dans un tableau sont bien là
- $Lignes=sizeof($Tbl);
- if($Nbre_Lignes>0 && $Lignes!=$Nbre_Lignes) return false;//Les colonnes
-
- foreach($Tbl as $Colonne)
- {
- if($Nbre_Col>0 && sizeof($Colonne)!=$Nbre_Col)return false; //Les colonnes des lignes du tableau
- }
- return true;
- }
- Function CIU($Nom_table,$Crit_Requete,$Nbre_champs_attendus,$Type_SQL='U',$R_Insert='')
- {
- /*Cette fonction permet de contruire une insertion ou une mise à jour d'enregistrement en construisant le SQL
- La structure de $Crit_Requete est la suivante avec x=[Indice du champ]:
- $Crit_Requete[x][0] : Nom du champ
- $Crit_Requete[x][1] : Valeur du champ
- $Crit_Requete[x][2] : Caractère déterminant le type de variable du champ ('' pour Booléen ou Numérique, '\'' pour Date et pour String)
- $Nbre_champs_attendus sert à vérifier l'intégrité du tableau $Crit_Requete en indiquant combien de champs ce dernier est sensé contenir
- $Type_SQL détermine le type de SQL à générer (n'importe quelle valeur pour INSERT, "U" pour UPDATE)
- $R_Insert sert si l'on veut faire une requête du type
- INSERT INTO Table (Champ1,Champ2)
- SELECT Champ3,Champ4
- FROM Table2
- */
- $Nbre_Champs=sizeof($Crit_Requete);
- $Len_R_Insert=strlen($R_Insert);
- if(!is_numeric($Nbre_champs_attendus)) die('Le nombre de champs doit être un entier (par de décimale s\'il vous plaît)');
- //Au cas où l'on a une décimale
- $Nbre_champs_attendus=intval($Nbre_champs_attendus);
- if(empty($Nom_table)) die('Il faut spécifier la table sur laquelle va porter la requête !');
- //On vérifie l'intégrité du tableau
- if(!Verif_Interg_Tbl($Crit_Requete,$Nbre_champs_attendus) || $Nbre_Champs==0 ) die('Le tableau n\' a pas '.$Nbre_champs_attendus.' colonnes par ligne, ou bien le nombre de lignes attendu n\'est pas atteint.');
-
- foreach($Crit_Requete as $Cle=>$Valeur)
- {
- $Len_Nom_Champ[]=strlen($Valeur[0]);
- $Len_Val_Champ[]=strlen($Valeur[1]);
-
- if($Len_Nom_Champ[$Cle]>0) $Drapeau_Champ=true;
-
- if($Valeur[2]!='' && $Valeur[2]!='\'') $Drapeau_Caract=true;
- }
-
- if($Drapeau_Caract)
- {
- echo 'Vos types de variables sont mal renseignés !<br>Caractères trouvés:<br>';
- foreach($Crit_Requete as $Valeur)
- {
- echo $Valeur[2].'<br>';
- }
- echo 'Il faut que ces caractères soient \'<b><u>[Vide]</u></b>\' pour Booléen ou Numérique, \'<b><u>\'</u></b>\' pour Date et String';
- die();
- }
-
- if($Type_SQL!='U')
- {
- if(($Nbre_Champs==0 || ($Nbre_Champs>0 && !$Drapeau_Champ)) && $Len_R_Insert==0)//Pas de tableau de champs et pas de SQL du type 'SELECT * FROM...
- {
- die('Il faut qu\'il y ait au moins un champ à exploiter ou un SQL d\'insertion pour construire la requête INSERT !');
- }
- }
- else //UPDATE
- {
- if($Nbre_Champs==0 ||($Nbre_Champs>0 && !$Drapeau_Champ))
- {
- die('Il faut indiquer au moins un champs à mettre à jour pour la requête UPDATE !');
- }
- }
- //On construit le SQL
- if($Type_SQL!="U" && $Drapeau_Champ)//SQL type INSERT INTO Table (Champ) VALUES(Val)
- {
- $SQL=array('INSERT INTO '.$Nom_table.' (',' VALUES (');
-
- foreach($Crit_Requete as $Cle=>$Valeur)
- {
- if($Len_Nom_Champ[$Cle]>0)
- {
- $SQL[0] .= $Valeur[0].',';
- $SQL[1] .= empty($Valeur[1]) && !is_numeric(($Valeur[1]) && $Valeur[1]!='0') ? 'NULL,' : $Valeur[2].addslashes($Valeur[1]).$Valeur[2].',';
- }
- }
-
-
- if($Nbre_Champs>0 && $Drapeau_Champ)
- {
- $SQL[0]=substr($SQL[0],0,strlen($SQL[0])-1).')';//On ferme les parenthèses pour la liste des champs
- $SQL[1]=substr($SQL[1],0,strlen($SQL[1])-1).')';//On ferme les parenthèses pour la liste des valeurs des champs
- }
- //Si $R_Insert est défini on n'utilise pas SQL[1] car on ne peut avoir INSERT INTO Table Champ VALUES(Val) SELECT....
- !empty($R_Insert) ? $Result=$SQL[0].' '.addslashes($R_Insert):$Result=$SQL[0].' '.$SQL[1];
- return $Result;
- }
- else
- {
- $SQL='UPDATE '.$Nom_table.' SET ';
- foreach($Crit_Requete as $Cle=>$Valeur)
- {
- if($Len_Nom_Champ[$Cle]>0)
- {
- $SQL.=$Valeur[0].'=';
- $SQL.=$Len_Val_Champ[$Cle]==0 ? 'NULL,':$Valeur[2].addslashes($Valeur[1]).$Valeur[2].',';
- }
- }
- $SQL=substr($SQL,0,strlen($SQL)-1).' '.addslashes($R_Insert); //strlen($SQL)-1) pour ôter la dernière virgule insérée
- //$R_Insert Pour avoir d'éventuelles conditions de mise à jour
- return $SQL;
- }
- }
- ?>
<?php
function Verif_Interg_Tbl(&$Tbl,$Nbre_Col=0,$Nbre_Lignes=0)
{
//Cette fonction vérifie que le nombre de colonnes et/ou de lignes attendues dans un tableau sont bien là
$Lignes=sizeof($Tbl);
if($Nbre_Lignes>0 && $Lignes!=$Nbre_Lignes) return false;//Les colonnes
foreach($Tbl as $Colonne)
{
if($Nbre_Col>0 && sizeof($Colonne)!=$Nbre_Col)return false; //Les colonnes des lignes du tableau
}
return true;
}
Function CIU($Nom_table,$Crit_Requete,$Nbre_champs_attendus,$Type_SQL='U',$R_Insert='')
{
/*Cette fonction permet de contruire une insertion ou une mise à jour d'enregistrement en construisant le SQL
La structure de $Crit_Requete est la suivante avec x=[Indice du champ]:
$Crit_Requete[x][0] : Nom du champ
$Crit_Requete[x][1] : Valeur du champ
$Crit_Requete[x][2] : Caractère déterminant le type de variable du champ ('' pour Booléen ou Numérique, '\'' pour Date et pour String)
$Nbre_champs_attendus sert à vérifier l'intégrité du tableau $Crit_Requete en indiquant combien de champs ce dernier est sensé contenir
$Type_SQL détermine le type de SQL à générer (n'importe quelle valeur pour INSERT, "U" pour UPDATE)
$R_Insert sert si l'on veut faire une requête du type
INSERT INTO Table (Champ1,Champ2)
SELECT Champ3,Champ4
FROM Table2
*/
$Nbre_Champs=sizeof($Crit_Requete);
$Len_R_Insert=strlen($R_Insert);
if(!is_numeric($Nbre_champs_attendus)) die('Le nombre de champs doit être un entier (par de décimale s\'il vous plaît)');
//Au cas où l'on a une décimale
$Nbre_champs_attendus=intval($Nbre_champs_attendus);
if(empty($Nom_table)) die('Il faut spécifier la table sur laquelle va porter la requête !');
//On vérifie l'intégrité du tableau
if(!Verif_Interg_Tbl($Crit_Requete,$Nbre_champs_attendus) || $Nbre_Champs==0 ) die('Le tableau n\' a pas '.$Nbre_champs_attendus.' colonnes par ligne, ou bien le nombre de lignes attendu n\'est pas atteint.');
foreach($Crit_Requete as $Cle=>$Valeur)
{
$Len_Nom_Champ[]=strlen($Valeur[0]);
$Len_Val_Champ[]=strlen($Valeur[1]);
if($Len_Nom_Champ[$Cle]>0) $Drapeau_Champ=true;
if($Valeur[2]!='' && $Valeur[2]!='\'') $Drapeau_Caract=true;
}
if($Drapeau_Caract)
{
echo 'Vos types de variables sont mal renseignés !<br>Caractères trouvés:<br>';
foreach($Crit_Requete as $Valeur)
{
echo $Valeur[2].'<br>';
}
echo 'Il faut que ces caractères soient \'<b><u>[Vide]</u></b>\' pour Booléen ou Numérique, \'<b><u>\'</u></b>\' pour Date et String';
die();
}
if($Type_SQL!='U')
{
if(($Nbre_Champs==0 || ($Nbre_Champs>0 && !$Drapeau_Champ)) && $Len_R_Insert==0)//Pas de tableau de champs et pas de SQL du type 'SELECT * FROM...
{
die('Il faut qu\'il y ait au moins un champ à exploiter ou un SQL d\'insertion pour construire la requête INSERT !');
}
}
else //UPDATE
{
if($Nbre_Champs==0 ||($Nbre_Champs>0 && !$Drapeau_Champ))
{
die('Il faut indiquer au moins un champs à mettre à jour pour la requête UPDATE !');
}
}
//On construit le SQL
if($Type_SQL!="U" && $Drapeau_Champ)//SQL type INSERT INTO Table (Champ) VALUES(Val)
{
$SQL=array('INSERT INTO '.$Nom_table.' (',' VALUES (');
foreach($Crit_Requete as $Cle=>$Valeur)
{
if($Len_Nom_Champ[$Cle]>0)
{
$SQL[0] .= $Valeur[0].',';
$SQL[1] .= empty($Valeur[1]) && !is_numeric(($Valeur[1]) && $Valeur[1]!='0') ? 'NULL,' : $Valeur[2].addslashes($Valeur[1]).$Valeur[2].',';
}
}
if($Nbre_Champs>0 && $Drapeau_Champ)
{
$SQL[0]=substr($SQL[0],0,strlen($SQL[0])-1).')';//On ferme les parenthèses pour la liste des champs
$SQL[1]=substr($SQL[1],0,strlen($SQL[1])-1).')';//On ferme les parenthèses pour la liste des valeurs des champs
}
//Si $R_Insert est défini on n'utilise pas SQL[1] car on ne peut avoir INSERT INTO Table Champ VALUES(Val) SELECT....
!empty($R_Insert) ? $Result=$SQL[0].' '.addslashes($R_Insert):$Result=$SQL[0].' '.$SQL[1];
return $Result;
}
else
{
$SQL='UPDATE '.$Nom_table.' SET ';
foreach($Crit_Requete as $Cle=>$Valeur)
{
if($Len_Nom_Champ[$Cle]>0)
{
$SQL.=$Valeur[0].'=';
$SQL.=$Len_Val_Champ[$Cle]==0 ? 'NULL,':$Valeur[2].addslashes($Valeur[1]).$Valeur[2].',';
}
}
$SQL=substr($SQL,0,strlen($SQL)-1).' '.addslashes($R_Insert); //strlen($SQL)-1) pour ôter la dernière virgule insérée
//$R_Insert Pour avoir d'éventuelles conditions de mise à jour
return $SQL;
}
}
?>
Conclusion
En partant du tableau suivant: $Tbl[0][0]='Champ1';$Tbl[0][1]=3.14156;$T bl[0][2]=''; $Tbl[1][0]='Champ2';$Tbl[1][1]='1970- 03-25';$Tbl[1][2]='\''; $Tbl[2][0]='Champ3';$Tbl[2 ][1]='z';$Tbl[2][2]='\'';
Exemple pour une Mise à jour :
CIU('La_table',$Tbl,3,'U','WHERE Ta_soeur=\'Elle bat l\'beurre\'')
donnera
UPDATE La_table SET Champ1=3.14156,Champ2='1970-03-25',Champ3='z' where Ta_soeur='Elle bat l\'beurre'
Vous pouvez aussi combiner ma fonction Place_Cond_SQL
Exemple : Place_cond_SQL(CIU('La_table',$Tbl,3,'U'),$Test,"F iltre='OCB'")
Historique
- 10 mars 2008 13:41:21 :
- Correction de l'exemple d'utilisation avec Place_Cond_SQL qui était érronné.
- 10 mars 2008 15:42:10 :
- Changement du caractère déterminant les chaines de type DATE ainsi que de la structure des valeurs Date de l'exemple.
En effet, j'avais utilisé la syntaxe SQL Microsoft au lieu de celle propre à MysSQL.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
PROBLEME UPDATE [ par g0belin ]
JE FAIS SA:$requete2= "UPDATE membre SET cle = $id WHERE LIKE '%$login%'";ET SA ME DIS SA:Réponse serveur SQL : You have an error in your SQL syntax n
un insert qui pose probleme [ par h2h ]
jai un probleme pour concaténer des valeurs dans mon insert de ma basevoici mon code<?php$connec=mysql_connect("localhost","*****","********");$i=0
INSERT puis UPDATE [ par bricethenetman ]
Salut j'ai un formulaire d'inscription qui aurait pu se réduire à une page mais pour des soucis d'esthetique je l'ai divisé en deux form_inscr.php et
Requêtes SQL [ par Nightm4re ]
Tout d'abord, bonjour à tous...Je suis en train de travailler à un script PHP et j'ai besooin d'un petit renseignement que je n'arrive pas à trouver p
php bizarre.. à l'aide. [ par bossun ]
salut, j'ai 2 requetes... une insert l'autre update... 1. $sql ="Insert ...."; $result = mysql_query($sql); 2.$sqlUpd ="Update..." $result2 = mysql_q
insert into [ par ptifennec ]
Bonjour, j' affiche 3 liste_box où je demande à l'utilisateur de rentrer 3 mots clés... ces derniers sont réferencés dans une base de données d'une ta
bonjour j'ai un probleme avec un INSERT INTO [ par timolerigolo ]
Bonjour,Voila j'ai une page d'inscription avec 2 INSERT INTO et je voudrais alimanté 2 requéte SQL mé le problème cé que sa alimante que une seule req
Besoin Aide PHP update & insert [ par Dexterage ]
Bonjour a tous !voila jai un tit soucis, en fait qd je fais une requete insert ou update, et qu'un de mes champs de formulaire posséde un apostro
Update [ par refkaben ]
Bonjour à tous;J'ai une requete Update, le syntaxe me parrait correcte mais ça ne fait rien, càd que les valeurs des champs que je
[MySQL]Peut-on mettre une condition IF dans un UPDATE? [ par shidame ]
Bonjour,Je suis actuellement sur la programation d'un jeu de rôle en ligne, et chaque joueur possède des PA (Point d'action), il faut que leur PA resp
|
Derniers Blogs
TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : IMPORT CSVRE : IMPORT CSV par ykhider
Cliquez pour lire la suite par ykhider
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|