begin process at 2010 02 10 12:09:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > GÉNÉRATEUR SQL D'INSERTION OU DE MISE À JOUR

GÉNÉRATEUR SQL D'INSERTION OU DE MISE À JOUR


 Information sur la source

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Base de données Classé sous :SQL, INSERT, UPDATE, Générateur, requêtes Niveau :Initié Date de création :10/03/2008 Date de mise à jour :10/03/2008 15:42:10 Vu :9 801

Auteur : 8Tnerolf8

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 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

GÉNÉRATEUR HTML DE MAP POUR IMAGE CLIQUABLE
Source avec Zip PORTAGE PDO DE MES ANCIENNES PUBLICATIONS
EQUIVALENT DE INNERHTML JAVASCRIPT, MAIS GLOBAL
EXTRACTION/INSERTION DE CONDITIONS SQL DANS UNE REQUÊTE
DÉTERMINATION DU CHEMIN D'INDEXAGE MENANT À UNE VALEUR DANS ...

 Sources de la même categorie

Source avec Zip EXTEND MYSQLI par petibras
Source avec Zip CLASSE DE COMMANDES PEAR DB par pascalmintrosse
Source avec Zip AFFICHER LE RÉSULTAT D'UNE REQUÊTE SQL SUR PLUSIEURS PAGE par karimmass
Source avec Zip SQLDIFF : MIGRATION, VERSIONNING ET SYNCHRONISATION DE LA ST... par aKheNathOn
Source avec Zip RÉSEAU AMICAL par Fidji56

 Sources en rapport avec celle ci

SEARCH QUERY COMPOSER par Centauriel
Source avec Zip INTERFACE ADMIN par mitchmitch74
Source avec Zip CLASSE SQL par benjycorp
Source avec Zip GÉNÉRATEUR DE MOTS CLÉS (TAGS) À PARTIR DE FICHIER HTML OU B... par Galip
Source avec Zip REQUÊTEUR PHP par zenith11

Commentaires et avis

Commentaire de UNi le 17/03/2008 09:31:22 6/10

J'ai fait plus ou moins la même chose mais en orienté objet.

Pourquoi ne pas avoir travaillé avec un tableau associatif ??
Car si il manque un champ ou si on ne connait pas tout les champs on ne pourra jamais faire la requête.

Commentaire de 8Tnerolf8 le 17/03/2008 19:54:14

Bonsoir Uni

Je n'ai pas travaillé avec un tableau associatif car le principe de ce générateur est de parcourir un tableau, et, voulant que le traitement soit généraliste, je ne voyais pas l'intérêt d'utiliser des clés autres que numériques, d'autant plus que le nom des champ est porté en indice [x][0].

Là où je te rejoins, c'est qu'il faut connaître au préalable les champs que l'on veut utiliser.

Cette fonction a été écrite pour éviter la fastidieuse rédaction du SQL standard d'insertion ou de mise à jour, surtout lorsque l'on a beaucoup de champs, ou bien si sur un même formulaire on a un bouton [Insérer] et un bouton [Modifier].

Commentaire de alexdachri le 18/03/2008 13:36:02

Bonjour , je recherche un code source pour une application en java qui consiste a extraire la derniere ligne d'une (et plusieurs )table(s) en relation entre elle .
c pour l'affichage des alertes généré par snort (IDS) qui sont enregistrés dans une base de données .
et merci.

Commentaire de 8Tnerolf8 le 19/03/2008 05:51:58

Bonjour Alexdachri

Je ne connais pas Java, par contre, ce que tu peux faire pour récupérer la dernière ligne de tes tables est :

- Dans ton SQL de requête mettre des relations entre les tables (INNER JOIN par exemple).
- Classer par ORDER DESC ou ASC suivant si tu veux prendre la première ou dernière ligne de résultat que tu associe à un LIMIT 0,1.
- Utiliser, si c'est possible les fonctions suivantes :
    - MIN
    - MAX
    - La fonction LAST_INSERT_ID (spécifique MySQL)

En espérant avoir pu t'éclairer, je te souhaite une bonne journée.

 Ajouter un commentaire


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&lt;?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&#233;de un apostro Update [ par refkaben ] Bonjour &#224; tous;J'ai une requete Update, le syntaxe me parrait correcte mais &#231;a ne fait rien, c&#224;d que les valeurs des&nbsp;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


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales