Mangeur de cigogne Hébergement du site en PHP et Mysql par WDMédia-hébergement
Vous aussi adpotez les éléPHPants de Vincent Pontier !


Rechercher dans le forum

Mots-clés :

Trouver :
un de ces termes tous les termes

Depuis :
7 j 15 j 30 j


Retour à l'index du forum

Générer dynamiquement une requête SQL

Message original de Julian

Le : 14/11/2008 à 10:50:58

Dejà lu 260 fois avant vous

Hello,

Voilà mon projet : A partir d'une simple base de donné mysql, je veux, en un minimum de page, générer automatiquement les formulaires d'ajout/modification des différentes tables.

Ce que je sais faire : Générer les formulaires via un seul script. Le formulaire à chaque fois se génèrent bien, si j'ai une liste, je sais l'afficher correctement, si j'ai un longtext, l'affichage me sort bien un champ text de plusieurs lignes etc.. L'affichage des formulaires de mes différentes sections fonctionne très bien (j'ai du trouver quelques astuces, pour les listes par exemple, elles même alimentés par des tables).

Là où je bloque : Lorsque je clique sur mon bouton "envoyer", je dois arriver sur un script qui doit me générer dynamiquement une requête sql du type :
$sql="INSERT INTO $module_récupéré (id0,val1, val2) VALUES ('','$val1','$val2')";

Ici, $module_récupéré est le nom de ma table. Je sais la récupérer, via un get dans le bouton envoyer de mon formulaire, là où ça se corce, c'est que je ne vois pas du tout comment générer le reste de la requête.. Je sais lister dynamiquement les différents champs en fonction de ma table, en revanche, je ne vois pas du tout comment assembler ma requête.

Voilà ce que j'ai pour l'instant :
<?php
include "config.inc.php";
$module_récupéré $_GET['module'];
$fields mysql_list_fields($table$module_récupéré$db);
$columns mysql_num_fields($fields);
/* liste de mes champs */
for ($i 0$i $columns$i++) 
{
        
$namefield mysql_field_name($fields$i);
        echo 
$namefield",";
}

/* ce que je voudrais générer :
    $sql="INSERT INTO $module_récupéré (id0,etc) VALUES ('','$etc')";
     
    mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
    mysql_close();
    */
?>



Comment faire ? des idées ?

Re: Générer dynamiquement une requête SQL

Réponse de Maljuna Kris

Le : 14/11/2008 à 11:21:34

Saluton,
Vaste chantier !
Si tu as généré dynamiquement le formulaire tu dois avoir une idée des champs de saisie que tu récupères dans $_POST ou $_GET (en fonction de la méthode du formulaire).
Nous, pas le moins du monde.

Re: Générer dynamiquement une requête SQL

Réponse de Julian

Le : 14/11/2008 à 15:59:44

Bon, j'ai encore réfléchis à mon problème.. Finalement il n'existe pas de fonction toute faite, je code donc la mienne. Pour l'instant, je sait générer l'équivalent de "(id,val1,val2,val3,etc..)" dynamiquement. Mais, sous forme de tableau pour l'instant.

<?php
include "config.inc.php";
$module_récupéré $_GET['module'];
$fields mysql_list_fields($table$module_récupéré$db);
$columns mysql_num_fields($fields);

for (
$i 0$i $columns$i++) 
{
        
$namefield mysql_field_name($fields$i);
        
$namefield $namefield.",";
        
$tableau[$i] = $namefield;
}
$lasttab sizeof($tableau) - 1;
$tableau[0] = "(".$tableau[0];
$tableau[$lasttab] = substr($tableau[$lasttab], 0, -1);
$tableau[$lasttab] = $tableau[$lasttab].")";
for (
$i 0$i $columns$i++) 
{
        echo 
$tableau[$i];
}
?>


Sur ma table "bu_lst", le formulaire s'affiche bien, et quand je clique sur "envoyer" (pour arriver à la page du code cidessus et intégrer le bousin dans mysql), mon echo renvoi ceci : (id0,nom_bu,adresse_bu,contact_bu)

Mais il le fait sous forme de tableau, moi je voudrais transformer ça en chaine, pour ensuite concaténer mes autres bouts de requête pour former la requete finale.

Seulement je vois pas comment passer l'intégralité de mon tableau dans une simple chaine.

Re: Générer dynamiquement une requête SQL

Réponse de Maljuna Kris

Le : 14/11/2008 à 16:34:56

Saluton,
implode() est ton amie.

Re: Générer dynamiquement une requête SQL

Réponse de Julian

Le : 14/11/2008 à 16:52:38

Oui, mais je ne vois pas comment l'utiliser dans mon cas. Si on prend l'exemple suivant :

<?php
$array 
= array('id0,nom_bu','adresse_bu','contact_bu');  
$comma_separated implode(","$array);  
echo 
$comma_separated;
?>



Ca, ça marche. Oui, mais ça marche que dans le cas où je connais à l'avance le contenu de mon tableau.. Moi je ne le connais pas. En fait, je ne sais que récupérer (id0,nom_bu,adresse_bu,contact_bu) dans un tableau, où $t[0] vaut (id0, $t[1] vaut nom_bu etc..

Avec array, j'aurais besoin d'un truc du genre $array = array(tous mes champs);

Re: Générer dynamiquement une requête SQL

Réponse de jad

Le : 14/11/2008 à 17:19:50

hello

array_push($tab_dest,$tab_src[0],...)

PS : ton script m'interaisse tu le partage ou pas ??

Re: Générer dynamiquement une requête SQL

Réponse de Julian

Le : 14/11/2008 à 17:27:44

Bon, j'ai finis par y arriver :)

Mais j'ai encore un soucis !

Voici le formulaire que me génère ma page general.php :

<form action="ajout.php?module=bu_lst" method="post" name="ajout">nom_bu <input name="nom_bu" type="text" size="51"/><br>adresse_bu <input name="adresse_bu" type="text" size="51"/><br>contact_bu <input name="contact_bu" type="text" size="51"/><br><input type="submit" name="Submit" value="Envoyer"></form>


Et voici la requête SQL que me génère mon autre page :

INSERT INTO bu_lst(id0,nom_bu,adresse_bu,contact_bu) VALUES ('','$nom_bu','$adresse_bu','$contact_bu')


La requête ne renvoi pas d'erreur.. Mais, autant le champs "id0" s'incrémente bien, autant le reste ne suit pas. Pour "nom_bu", j'ai comme donnée "$nom_bu" et non pas "Paris", comme je l'attendais..

Où est-ce que ça foire ? Je pense que mon formulaire n'est pas bon, je vois que ça, pourtant.. il m'a l'air correct comme ça. Vous ne pensez quoi ? Pourquoi je n'arrive pas à récupérer mes variables ?

Re: Générer dynamiquement une requête SQL

Réponse de mcAllan

Le : 14/11/2008 à 18:29:04

Bonsoir,

Un petit echo de la requête te donnerai peut-être des indications...

Récupère-tu bien les variables dans $_POST ?

$nom_bu = $_POST['nom_bu'];
Suivit des contrôles et des protections adéquates ?

Alain.

Re: Générer dynamiquement une requête SQL

Réponse de Julian

Le : 14/11/2008 à 19:09:49

C'est ça qui me manque en effet. Je bloque sur ce dernier truc, et ça sera opérationnel.

Mon echo $sql me renvoi :
INSERT INTO bu_lst(id0,nom_bu,adresse_bu,contact_bu) VALUES ('','$nom_bu','$adresse_bu','$contact_bu')


Donc il faudrait que je fasse un truc comme ça $namefield = $_POST['namefieldl'] dans ma boucle.. mais ça ne marche pas.

Voilà le script complet, du moins la partie "action" :

<?php
include "config.inc.php";
$module_récupéré $_GET['module'];
$fields mysql_list_fields($table$module_récupéré$db);
$columns mysql_num_fields($fields);

for (
$i 0$i $columns$i++) 
{
        
$namefield mysql_field_name($fields$i);
        
$tableau[$i] = $namefield;
        
$tableau2[$i] = "'$".$namefield."'";

}
$lasttab sizeof($tableau) - 1;
$tableau[0] = "(".$tableau[0];
$tableau[$lasttab] = $tableau[$lasttab].")";
$var1tab implode(","$tableau);
    
$tableau2[0] = "(''";
$tableau2[$lasttab] = $tableau2[$lasttab].")";
$var2tab implode(","$tableau2);


$sql "INSERT INTO $module_récupéré$var1tab VALUES $var2tab";
echo 
$sql;
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
mysql_close();
?>



Là je sèche.. Comment passer mes variables en $_post ?

Re: Générer dynamiquement une requête SQL

Réponse de mcAllan

Le : 15/11/2008 à 10:28:15

Salut,

Par exemple, dans ta boucle, à la place de

$tableau2[$i] = "'$".$namefield."'";

Tu peux insérer directement les valeurs de $_POST en vérifiant et protégeant :

<?php
for ($i 0$i $columns$i++) 
{
        
$namefield mysql_field_name($fields$i);
        
$tableau[$i] = $namefield;
        
        if(isset(
$_POST[$namefield])){
            
$tableau2[$i] = "'".mysql_real_escape_string($_POST[$namefield])."'";
        }else{
            
$tableau2[$i] = '';
        }
}
//...
?>



Alain.

Re: Générer dynamiquement une requête SQL

Réponse de julian

Le : 15/11/2008 à 11:21:44

Ok, c'est exactement ça qu'il me manquait.. j'avais fait un truc similaire mais j'avais du me planter, le
$namefield = mysql_field_name($fields, $i);
$tableau[$i] = $namefield;
je l'avais inclu dans le if..

merci !

Re: Générer dynamiquement une requête SQL

Réponse de mcAllan

Le : 15/11/2008 à 11:51:31

Hmm, si un des champs de formulaire n'est pas transmis, la requête va générer une erreur.

Il vaudrai mieux :
...
}else{
$tableau2[$i] = "''";
}
...


A ce moment là tu simplifie un peu la suite :

<?php
$lasttab 
sizeof($tableau) - 1;
$tableau[0] = "(".$tableau[0];
$tableau[$lasttab] = $tableau[$lasttab].")";
$var1tab implode(","$tableau);
    
$tableau2[0] = "(''";
$tableau2[$lasttab] = $tableau2[$lasttab].")";
$var2tab implode(","$tableau2); 
?>



en évitant de calculer $lasttab, et plus besoin d'ajouter '' pour l'id0

<?php

$var1tab 
"(" implode(","$tableau) . ")";
$var2tab "(" implode(","$tableau2) . ")";

?>



Alain.

Re: Générer dynamiquement une requête SQL

Réponse de mcAllan

Le : 15/11/2008 à 12:09:36

Une dernière remarque,
tu risque d'avoir quelques soucis avec des champs numériques ou des champs de type date mal formatés à la saisie (et peut-être d'autre) :-)
Retour à l'index du forum


Ajouter une réponse

Nom :

Email :

Titre :

Message :

Combien font 3 + 2 ?

Mise en forme : gras = [b]...[/b], italic = [i]...[/i], souligné = [u]...[/u], citation = [quote]...[/quote], lien = [url]liens_externe[/url] ou [url nom=texte]liens_externe[/url], code source : [code]...[/code]

Recevoir les réponses par mail :
Oui Non

Mémoriser mon nom et mon email :
Oui Non

 

Charte des forums PHPDébutant

Bienvenue à vous,

Vous voici donc prêt à poster sur les forums de PHPDébutant. Avant toute chose, merci de prendre le temps de lire les quelques lignes qui suivent.

Attention, à partir du moment ou vous postez dans les forums, vous acceptez la présente charte. Si votre message est modéré ou supprimé, vous ne pourrez pas dire que vous n'étiez pas au courant des règles !

Pourquoi une charte

Le but de cette charte est simple : que ces forums restent cordiaux et que les personnes aidant les autres ne se sentent pas lésées, insultées, critiquées. Pour que ces forums fonctionnent, il faut des personnes qui répondent aux questions. Pour que celles ci restent sur le forum, il faut les traiter avec respect, et ne pas les confondre avec des bonnes poires, esclaves, etc...

Mesures de régulation

  • Un nouveau message ne disant pas bonjour, ou insultant, dont le titre est tout en majuscules, pourra être supprimé sans justification (raisons non limitatives).
  • Prenez le temps de vérifier que la question que vous allez poser n'a pas déjà été posée, à l'aide du formulaire de recherche.
  • Prenez également le temps de vérifier que la réponse à votre question ne se trouve pas dans les tutoriaux. Nous ne pouvons pas répeter pour chaque visiteur tous les cours, il sont écrits, profitez-en (dans l'ordre tant qu'à faire) !
  • Nous ne faisons pas de scripts tout prêts. Nous aidons et vous guidons pour que vous puissiez trouver vous même la réponse, ce qui est beaucoup plus formateur.
  • Si vous comptez poster un message publicitaire, abstenez-vous. Au mieux le message sera supprimé, au pire les habitués descendront votre service en flamme.
  • Pour tout message de recrutement, précisez bien votre demande. Inutile de poster pour trouver un développeur pour faire gratuitement votre site de webmastering qui vous rapportera plein de sous. Les seuls coups de mains donnés en développement sont pour des associations ou des sujets passionnant un développeur.
  • Toute personne tenant des propos racistes ou illicites sera bannie et pourra faire l'objet de poursuites.
  • L'humour étant très présent sur ces forums, ne réagissez pas violemment à des propos qui pourraient être à prendre au second degré et avec de l'humour.
  • Attention aux trolls ! Leur multiplication peut entraîner la mort des forums, et sans forum, plus d'aide !
  • Respectez les thèmes des forums. Pensez aussi à vérifier que votre message n'a pas été déplacé si vous le croyez effacé.

Conseils

  • N'oubliez pas que les personnes à qui vous vous adressez sont des bénévoles qui donnent de leur temps pour vous. Si vous êtes méchants avec eux, il n'aideront plus et vous n'aurez plus d'aide !
  • Ne soyez pas pressé. Nous avons une vie aussi, et nous ne sommes par forcément tout le temps disponibles.
  • N'oubliez pas que les smileys sont la pour faire comprendre l'humeur dans laquelle vous rédigez un message. Il est indispensable de mettre des smileys quand vous faites de l'humour, sinon le message pourrait être mal perçu (ca serait quand même idiot de plomber l'ambiance en faisant de l'humour !).
  • Surveillez votre orthographe, nous ne vous demandons pas d'être littéraire, mais que votre message soit au moins compréhensible. Evitez à tout prix le style SMS.
  • Expliquez clairement le problème, ce n'est pas toujours facile, mais mieux vaut essayer de le faire le plus possible.
  • Ne postez pas de questions trop vagues du genre "comment faire un forum". Cela ne sert à rien, cela ne s'explique pas sur un coin de forum.
  • Mettez un titre clair, correspondant au sujet que vous allez poster. A l'aide, au secours, etc... ne sont pas d'une grande utilité pour ceux qui vont vous aider. Parfois nous passons en coup de vent, et si nous ne savons pas ce que va contenir le message, nous ne le regarderons même pas.
  • Ne mettez par [URGENT] ou autre joyeuseté du genre dans vos titres de messages. Cela irrite les gens (il y'a plus urgent dans la vie, pensez aux gens qui meurent de faim ou ayant besoin des pompiers, ça c'est urgent), et vous n'aurez pas votre réponse plus vite pour autant.
  • Si vous connaissez déjà à quel domaine votre question d'adresse (par exemple mysql, html, php, javascript), n'hésitez pas à le marquer au début de votre message, avec un [html] par exemple (notez les minuscules).
  • Ne dites pas "ça marche pas". Il y a toujours des raisons. Je vous invite à consulter le tutorial "ça marche pas" qui vous aidera à mieux expliquer votre problème.
  • Ne postez pas 36000 lignes de code. Sur le forum, le code apparaît non coloré et sans indentation, ce qui est illisible. Au dessus de 5 lignes, plus personne ne lit et vous n'aurez pas de réponse. Utilisez le wall
  • En règle générale restez courtois et clair, n'oubliez pas que la politesse fait partie de la vie courante. Il est de bon ton de dire bonjour même pour une réponse, même plusieurs fois dans la journée (ceux qui vous lisent n'ont pas forcément lu vos autres messsages)

La Fin

Avec tout ces conseils vous augmenterez les chances de réponse, leur pertinence et leur rapidité

Voilà, ça sera tout, bonne écriture :)

Fermer les règles et poster un message


www.phpdebutant.org © 2009 - L'équipe de phpDebutant - Hébergement : WDMédia-hébergement