Générateur sql d'insertion ou de mise à jour

Contenu du snippet

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_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.');

Source / Exemple :


<?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;$Tbl[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,"Filtre='OCB'")

A voir également

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.