IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Créer une Insertion dynamique


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 54
    Points
    54
    Par défaut Créer une Insertion dynamique
    Bonjour à tous,
    Il y a peu, je devait modifier les champs d'une table, sans savoir a l'avance combien de champs contenait cette table, j'avais posté, mais au final, personne n'avait pu m'aider, et j'avais trouvé la solution moi même... j'avais fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Tant qu'il y a des champs, on fait
    for($a=$colonneDepart+1; $a<$nombreTotalColonnes; $a++){
     
                      $updateSQL = "UPDATE $tableChoisie SET $nomDeColonne = '$value' WHERE $idTable='$idDemandee'";
                     mysql_select_db($database_maintenance, $maintenance);
                     $Result = mysql_query($updateSQL, $maintenance) or die(mysql_error());
    				}
    ce qui donnait pour effet qu'on mettait a jour chaque champs, dans une requette séparée...

    ici, je voudrais inserer un nouvel enregistrement, sans savoir a l'avance combien de champs il y aura dans la table... (Ceci afin de travailler n'importe quelle table que l'on pourrait ajouter...)
    Malheureusement, je patauge sévère...
    Bref, l'un d'entre vous aurait une idée à me suggérer???

    merci d'avance à tous...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 54
    Points
    54
    Par défaut
    Ce que tu peux faire c'est faire une fonction qui prend le nom de la table en paramétreset un tableau contenant tous les champs. Attention les champs doivent etre dnas le bonne ordre. Ensuite tu parcours ton tableau et tu formes ta requete. Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function insert($table, $champ)
    {
         $requete="INSERT INTO $table VALUES(";
         foreach($champ as $val)
         {
              $requete .="'$val',";
         }
         $requete = substr($requete, 0, $strlen($requete)-1);//On enleve le ; de trop 
         $requete .=")";
         mysql_select_db($database_maintenance, $maintenance);
         $Result = mysql_query($updateSQL, $maintenance) or die(mysql_error());
     
    }

  3. #3
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Salut!

    Oui...j'ai été devancé! t'as été plus vite que moi Psymon ;-)

    ou un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <?php
    /**
    *
    */
    function insertTable($table_name,$Tvalue){
    	foreach ($Tvalue as $key => $value){
    		$cols .= $key.",";
    		$values .= "'".$value."',";
    	}
    	$cols = substr_replace($cols, '', -1, 1);
    	$values = substr_replace($values, '', -1, 1);
    	$sql = "INSERT INTO {$table_name} ({$cols}) VALUES ({$values})";
    	echo $sql;
    }
     
    insertTable("matable",array("col1"=>"val1","col2"=>"val2","col3"=>"val3","col4"=>"val4"));
    ?>
    ++

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 50
    Points : 54
    Points
    54
    Par défaut
    Devancé possible mais ton code est meilleur ^^
    Juste une question : Comment marche substr_replace?

  5. #5
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Merci mais c juste de la courtoisie ;-)

    Je ne peux pas être plus explicite que la doc de php pour expliquer la fonction substr_replace

    ++

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    bon, j'ai compris en partie, mais j'ai un message d'erreur avec lequel je zone un peu...

    j'ai donc fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    //Si la variable  MM_insert existe
    if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
     
    	for($a=$colonneDepart+1;$a<$nombreTotalColonnes; $a++){
                              //on trouve le nom du champs
    		$nomDeColonne = mysql_field_name($rsColonnes, $a);
                              //on trouve le type de champs
    		$typeField =  mysql_field_type($rsColonnes, $a) ;
                              //on déclare la variable typeDate
    		$typeDate = 'date';
                                  //Si un le type d'un des champs est identique a la variable typeDate, de type date :)
    		    if($typeField==$typeDate){
                                                        //alors on le modifie en anglais, pour le serveur, via la page fonction.php
    				$set = $_POST[$nomDeColonne];
    				$Tvalue[] = dateEN($set);
    				} else {
                                                       //sinon...
    				$Tvalue[] = $_POST[$nomDeColonne];
    				}				
    				}
     
     
      //et la, on insert le tout dans la table avec la fonction insertTable	
      $insertSQL = insertTable("$tableChoisie",$Tvalue[]);
      mysql_select_db($database_maintenance, $maintenance);
      $Result1 = mysql_query($insertSQL, $maintenance) or die(mysql_error());
    la, dans ma page fonction.php, j'ai ajouté la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //Enregistrer dans la table choisie
    function insertTable($table_name,$Tvalue){
    	foreach ($Tvalue as $key => $value){
    		$cols .= $key.",";
    		$values .= "'".$value."',";
    	}
    	$cols = substr_replace($cols, '', -1, 1);
    	$values = substr_replace($values, '', -1, 1);
    	$sql = "INSERT INTO {$table_name} ({$cols}) VALUES ({$values})";
    	return $sql;
    }
    mais j'obtient ces messages d'erreur, pourtant, j'ai balayé mon array, et les données sont bien dedans...

    Warning: Invalid argument supplied for foreach() in d:\easyphp1-8\www\fonctions.php on line 49

    Notice: Undefined variable: cols in d:\easyphp1-8\www\fonctions.php on line 53

    Notice: Undefined variable: values in d:\easyphp1-8\www\fonctions.php on line 54

    Warning: Cannot modify header information - headers already sent by (output started at d:\easyphp1-8\www\fonctions.php:49) in d:\easyphp1-8\www\insert.php on line 177

    et la, be je bloque...

  7. #7
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Warning: Invalid argument supplied for foreach() in d:\easyphp1-8\www\fonctions.php on line 49

    L'argument passé au foreach n'est pas correct.


    Notice: Undefined variable: cols in d:\easyphp1-8\www\fonctions.php on line 53

    Notice: Undefined variable: values in d:\easyphp1-8\www\fonctions.php on line 54
    Les 2 notices sont du à la non initialisation des variables cols, et values


    Warning: Cannot modify header information - headers already sent by (output started at d:\easyphp1-8\www\fonctions.php:49) in d:\easyphp1-8\www\insert.php on line 177

    Dans ton fichier fonctions.php vérifie bien qu'il n'y ait pas d'espace ou de caractère invisible avant et après ton code php. il se pourrait que tu aies des espaces après la fermeture de ton code (?> )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <?php
    function insertTable($table_name,$Tvalue){
       	$cols = '';
    	$values = '';
    	if (is_array($Tvalue)){
    		var_dump($Tvalue); // commente cette ligne une fois les tests fait
    		foreach ($Tvalue as $key => $value){
    			$cols .= $key.",";
    			$values .= "'".$value."',";
    		}
    		$cols = substr_replace($cols, '', -1, 1);
    		$values = substr_replace($values, '', -1, 1);
    		$sql = "INSERT INTO {$table_name} ({$cols}) VALUES ({$values})";
    		return $sql;
    	}else{
    		return false;
    	}
    }
    ?>

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    oki....
    alors, je passais mon tableau comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $insertSQL = insertTable("$tableChoisie",$Tvalue[]);
    Evidement, les guillemets étaient de trop... ( Kén biess!)

    Ensuite, dans mon tableau, j'avais les index et les valeurs, mais j'avais besoin des noms de champs et des valeurs...
    bref, j'ai fait ceci, et maintenant, tout va bien..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //ma fonction
    //=========================
      function insertTable($table_name,$Tvalue, $TnomCol){
       	$cols = '';
    	$values = '';
    	if (is_array($Tvalue)){
    		//pour chaque valeur du tableau valeur
    		foreach ($Tvalue as $key => $value){
    			 $values .= "'".$value."',";
    		}
                              //pour chaque nom de colonne du tableau nom de colonne
    		foreach ($TnomCol as $key => $col){
    			$cols .= $col.",";
    		}
    		$cols = substr_replace($cols, '', -1, 1);
    		$values = substr_replace($values, '', -1, 1);
    		$sql = "INSERT INTO {$table_name} ({$cols}) VALUES ({$values})";
    		return $sql;
    		}
    		}
    //===========================
    //fin de ma fonction
    Mais dans mon for each, mon as $key ne me sert plus non? comment devrais-je l'écrire alors?
    J'ai aussi mes chiffres qui ne passent pas... uniquement les champs int...
    qui plus est, dans ma bd, mes nouvelles id d'insertions passe de 106 à 1169, mon champs id est auto-incrémenté...

  9. #9
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Citation Envoyé par godjojo Voir le message
    oki....
    alors, je passais mon tableau comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $insertSQL = insertTable("$tableChoisie",$Tvalue[]);
    ICI, ta fonction prend 2 paramètres.

    Evidement, les guillemets étaient de trop... ( Kén biess!)

    Ensuite, dans mon tableau, j'avais les index et les valeurs, mais j'avais besoin des noms de champs et des valeurs...
    bref, j'ai fait ceci, et maintenant, tout va bien..
    ICI, ta fonction prend 3 paramètres...
    Pourquoi as tu séparé les noms de colonnes des valeurs dans 2 tableaux?
    utilise un et unique tableau associant clé=>valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //ma fonction
    //=========================
      function insertTable($table_name,$Tvalue, $TnomCol){
       	$cols = '';
    	$values = '';
    	if (is_array($Tvalue)){
    		//pour chaque valeur du tableau valeur
    		foreach ($Tvalue as $key => $value){
    			 $values .= "'".$value."',";
    		}
                              //pour chaque nom de colonne du tableau nom de colonne
    		foreach ($TnomCol as $key => $col){
    			$cols .= $col.",";
    		}
    		$cols = substr_replace($cols, '', -1, 1);
    		$values = substr_replace($values, '', -1, 1);
    		$sql = "INSERT INTO {$table_name} ({$cols}) VALUES ({$values})";
    		return $sql;
    		}
    		}
    //===========================
    //fin de ma fonction
    Mais dans mon for each, mon as $key ne me sert plus non? comment devrais-je l'écrire alors?
    J'ai aussi mes chiffres qui ne passent pas... uniquement les champs int...
    qui plus est, dans ma bd, mes nouvelles id d'insertions passe de 106 à 1169, mon champs id est auto-incrémenté...
    Demande à PHP de t'afficher les requêtes qui sont envoyées au SGBB, tu comprendras....

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    oki, chose faite...
    Pour mon chiffre qui ne passait pas, je retirais la première valeur... donc, il ne passait aucune valeur dans mon champs de type int, de ce fait, toutes mes valeurs devenaient 0... donc ca, c'est réglé...
    Par contre, je ne comprends toujours pas pourquoi mon autoincrementation passe de 106 a 1169...
    Au niveau de mes tableau, je vais plonger dans un tuto (si tu as un lien d'ailleurs... ) , car je ne les maitrise pas bien...

  11. #11
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    A l'insertion d'un enregistrement, ne passe jamais de valeur pour le champ autoincrémenter.

    Puis-je voir la requête de création de ta table?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    pour l'insertion, je ne passe pas de valeur pour le champs id auto-incrémenté. j'ai juste aprés, un champs number dans lequel on stocke le numéro de l'engin... et qu'on peut modifier (lui), le cas échéant...

    voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO Levage (Number,Denomination,MarqueSchedule,MiseEnService,Cat,NumeroSerie,Cmu,Nsn,Localisation,Organisme,Nimma,DernierControle,Remarque) VALUES ('777777','ma denomination','ma schedule','ma mise en service','ma cat','mon num de serie','mon cmu','mon nsn','ma localisation','mon organisme','mon imma','2008-07-25','ma remarque')
    Donc, il y a un champs Id avant le champs Number...

    Ps:grand merci pour ta solicitude...

  13. #13
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    Ce que je voulais c'était voir la structure de ta table...

    Après il faudra voir toutes les requêtes s'exécutant sur cette table.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    oups, sorry, trop vite a la lecture, voici... (evidement, j'ai effacé les enregistrements supérieurs à 106)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE TABLE `levage` (
      `IdLevage` int(255) NOT NULL auto_increment,
      `Number` varchar(100) NOT NULL default '0',
      `Denomination` varchar(100) NOT NULL default '',
      `MarqueSchedule` varchar(100) NOT NULL default '',
      `MiseEnService` varchar(50) NOT NULL default '0000-00-00',
      `Cat` varchar(100) NOT NULL default '0',
      `NumeroSerie` varchar(100) NOT NULL default '',
      `Cmu` varchar(100) NOT NULL default '',
      `Nsn` varchar(100) NOT NULL default '',
      `Localisation` varchar(100) NOT NULL default '',
      `Organisme` varchar(100) NOT NULL default '',
      `Nimma` varchar(100) NOT NULL default '',
      `DernierControle` date NOT NULL default '0000-00-00',
      `Remarque` varchar(200) NOT NULL default '',
      PRIMARY KEY  (`IdLevage`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=106 ;

  15. #15
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    C bizarre parce que la valeur courante de l'autoincrement est à 106.
    Regarde du côté de la requête update.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 54
    Points
    54
    Par défaut
    je ne vois rien non plus... tu veux parler de l'update da ma table sql? je n'y ai jamais mis les doigts...
    note que cela fonctionne bien comme cela, l'id ne sert qu'au passage d'information, l'utilisateur ne le voit meme pas...

  17. #17
    Membre confirmé Avatar de defcon_suny
    Homme Profil pro
    Non pas trop...
    Inscrit en
    Décembre 2006
    Messages
    441
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Non pas trop...
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 441
    Points : 547
    Points
    547
    Par défaut
    affiche la quand meme, juste au cas ou...

Discussions similaires

  1. [VBA/VB] créer une page dynamiquement dans un WebBrowser
    Par SilkyRoad dans le forum Contribuez
    Réponses: 3
    Dernier message: 13/03/2013, 22h24
  2. créer une méthode dynamique delphi
    Par ougueye dans le forum Delphi
    Réponses: 4
    Dernier message: 09/04/2007, 14h33
  3. [reports] comment créer une requete dynamiquement
    Par lifeisgood dans le forum Reports
    Réponses: 4
    Dernier message: 31/01/2007, 12h15
  4. [Tableaux] Créer une ligne dynamiquement
    Par Lenaick dans le forum Langage
    Réponses: 11
    Dernier message: 24/01/2007, 10h58
  5. [WebForms]créer une formulaire dynamiquement
    Par lamiae18 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 16/01/2007, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo