remplir le champs de clé étrangère d'une table

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

remplir le champs de clé étrangère d'une table

Par mknaite  -  5 reponses  -  Le 22/08/2018 11:49  -  Editer  - 

Bonjour à tous,
Je suis un débutant stagiaire, travaillant sur une base de données MYSQL. J'utilise Scripts php pour alimenter les tables de ma base de données à partir des fichiers CSV(un fichier CSV sert à alimenter uniquement une table).
J'ai plusieurs tables qui sont liées par de clés étrangères. Je parviens à remplir correctement les tables qui n'ont pas de clés étrangères.
Cependant, dès que je cherche à remplir celles qui ont des clés étrangères, elles ne sont jamais alimentées, mon script affiche des message:

    #1452 - Cannot add or update a child row: a foreign key constraint fails (`db2018`.`metier_personnel`, CONSTRAINT `Metier_personnel_Segment_metier_FK` FOREIGN KEY (`id_segment`) REFERENCES `segment_metier` (`id_segment`))  

Ci-dessous le scritp de création des deux tables:

    CREATE TABLE Segment_metier(  
            id_segment      Int  Auto_increment  NOT NULL ,  
            Code_segment    Varchar (11) NOT NULL ,  
            Libelle_segment Varchar (255) NOT NULL  
        ,CONSTRAINT Segment_metier_PK PRIMARY KEY (id_segment)  
    )ENGINE=InnoDB;  


    #------------------------------------------------------------  
    # Table: Metier_personnel  
    #------------------------------------------------------------  

    CREATE TABLE Metier_personnel(  
            id_metier  Int  Auto_increment  NOT NULL ,  
            Code_EG    Varchar (255) NOT NULL ,  
            Libelle_EG Varchar (255) NOT NULL ,  
            id_segment Int NOT NULL  
        ,CONSTRAINT Metier_personnel_PK PRIMARY KEY (id_metier)  

        ,CONSTRAINT Metier_personnel_Segment_metier_FK FOREIGN KEY (id_segment) REFERENCES Segment_metier(id_segment)  
    )ENGINE=InnoDB;  

Ci-dessous les script pour pour alimenter les deux tables liées par une clé étrangère:
A) Script pour alimenter la table Segment_metier avec id auto-increment

    <?php  

    $servername = "localhost";  
    $username = "";  
    $password = "";  
    $dbname = "";  

    // Create connection  
    $conn = mysqli_connect($servername, $username, $password, $dbname);  
    if (isset($_POST["import"])) {  

        $fileName = $_FILES["file"]["tmp_name"];  

        if ($_FILES["file"]["size"] > 0) {  

            $file = fopen($fileName, "a+");  
               $j = 0;      
            while (($data = fgetcsv($file, 1000, ",")) !== FALSE)  
            {   

                if ($j>0) {  
                    $i = 0;  

                    foreach($data as $i => $valeur){  

                        echo $i[0].$i[1].'<br />';   

                       $values=explode(';', $valeur,2);  


                $Code_segment=$values[0];  
                $Libelle_segment=$values[1];           


                $sqlInsert = "INSERT into segment_metier(Code_segment,Libelle_segment)  
                       values ('" . $Code_segment . "','" . $Libelle_segment . "')";  


                         $result = mysqli_query($conn, $sqlInsert);  

                if (!is_null($result)) {  


                    $type = "success";  
                    $message = "Les données CSV sont intégrées à la base avec succès!";  
                    echo $type." : ".$message."<br/>";  
                } else {  
                    $type = "error";  
                    $message = "Problem in Importing CSV Data";  
                    echo $type." : ".$message."<br/>";  
                }  

            }  
        }  
        $j++;  
        }  
        fclose($file);  

        }  
        mysqli_close($conn);  
    }  
    ?>  
    <!DOCTYPE html>  
    <html>  

    <head>  

    </head>  

    <body>  
        <h2>Importer un fichier CSV à ma base</h2>  

        <div class="outer-scontainer">  
            <div class="row">  

                <form class="form-horizontal" action="" method="post"  
                    name="frmCSVImport" id="frmCSVImport" enctype="multipart/form-data">  
                    <div class="input-row">  
                        <label class="col-md-4 control-label">Selectionner le CSV  
                            </label> <input type="file" name="file"  
                            id="file" accept=".csv">  
                        <button type="submit" id="submit" name="import"  
                            class="btn-submit">Import</button>  
                        <br />  

                    </div>  

                </form>  

            </div>  

        </div>  

    </body>  

    </html>  

B) Script pour alimenter la table Metier_personnel qui a comme clé étrangère la l'id de la table Segment_metier

    <?php  

    $servername = "localhost";  
    $username = "";  
    $password = "";  
    $dbname = "";  

    // Create connection  
    $conn = mysqli_connect($servername, $username, $password, $dbname);  
    if (isset($_POST["import"])) {  

        $fileName = $_FILES["file"]["tmp_name"];  

        if ($_FILES["file"]["size"] > 0) {  

            $file = fopen($fileName, "a+");  
               $j = 0;      
            while (($data = fgetcsv($file, 1000, ",")) !== FALSE)  
            {   

                if ($j>0) {  
                    $i = 0;  

                    foreach($data as $i => $valeur){  

                        echo $i[0].$i[1].'<br />';   



                $values=explode(';', $valeur,2);  


                $Code_EG=$values[0];  
                $Libelle_EG=$values[1];  





                 $sqlInsert = "INSERT into metier_personnel(Code_EG,Libelle_EG)  
                       values ('" . $Code_EG . "','" . $Libelle_EG . "')";  

                         $result = mysqli_query($conn, $sqlInsert);  

                if (!is_null($result)) {  


                    $type = "success";  
                    $message = "Les données CSV sont intégrées à la base avec succès!";  
                    echo $type." : ".$message."<br/>";  
                } else {  
                    $type = "error";  
                    $message = "Problem in Importing CSV Data";  
                    echo $type." : ".$message."<br/>";  
                }  

            }  
        }  
        $j++;  
        }  
        fclose($file);  

        }  
        mysqli_close($conn);  
    }  
    ?>  
    <!DOCTYPE html>  
    <html>  

    <head>  

    </head>  

    <body>  
        <h2>Importer un fichier CSV à ma base</h2>  

        <div class="outer-scontainer">  
            <div class="row">  

                <form class="form-horizontal" action="" method="post"  
                    name="frmCSVImport" id="frmCSVImport" enctype="multipart/form-data">  
                    <div class="input-row">  
                        <label class="col-md-4 control-label">Selectionner le CSV  
                            </label> <input type="file" name="file"  
                            id="file" accept=".csv">  
                        <button type="submit" id="submit" name="import"  
                            class="btn-submit">Import</button>  
                        <br />  

                    </div>  

                </form>  

            </div>  

        </div>  

    </body>  

    </html>  

NB: Je précise que je reconnais que mon script qui alimente la table "Metier_personnel" ne tient pas en compte le champs de la clé étrangère dans ma table.
En fait, tout simplement je ne sais pas comment le faire.
J'ai fait des recherches, je m'aperçois que ce serait possible peut-être avec PDO : PDO::lastInsertId() ou mysqli_insert_id(), mais j'ai essayé, mais je ne sais vraiment pas comment le faire fonctionner avec mon script.

Quelqu'un a-t-il une solution pour que mon script puisse alimenter automatiquement le champs de la clé étrangère dans ma table"Metier_personnel" en se référant à "l'id auto-increment" de la table "Segment-metier"? Merci.

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 22/08/2018 21:23  -  Haut de page  - 

Salut,
il est indispensable de récupérer la valeur de la clé étrangère avant de faire l'insertion, faute de quoi, il y aura bien entendu une erreur, cette dernière étant due à la structure même de a table qui indique que cette clé étrangère est obligatoire :

...
id_segment Int NOT NULL
...

Donc, une fois l'insertion de la ligne dans la table Segment_metier, il faut récupérer la valeur de la clé primaire générée avec la fonction mysqli_insert_id
Voir pour ce faire la documentation correspondante.

 
Par mknaite  -  Le 23/08/2018 12:08  -  Haut de page  - 

Merci Cyrano,

J'ai fait exactement comme tu l'as dit en me servant du API php.net, je parviens à afficher par ordre les id_segment.

Cependant, mon problème n'est pas toujours résolu. Je voudrais que, une fois que les id_segment sont récupérés, qu'ils puissent être injectés directement dans la "table metier_personnel" qui a comme clé étrangère "id_segment".
Je ne sais pas comment le faire, aidez-moi, s'il vous plaît!

Ci-dessous le code source de table segment(modifié en incluant mysqli_insert_id)

    <?php  

    $servername = "localhost";  
    $username = "";  
    $password = "";  
    $dbname = "";  

    // Create connection  
    $conn = mysqli_connect($servername, $username, $password, $dbname);  
    if (isset($_POST["import"])) {  

        $fileName = $_FILES["file"]["tmp_name"];  

        if ($_FILES["file"]["size"] > 0) {  

            $file = fopen($fileName, "a+");  
               $j = 0;      
            while (($data = fgetcsv($file, 1000, ",")) !== FALSE)  
            {   

                if ($j>0) {  
                    $i = 0;  

                    foreach($data as $i => $valeur){  

                        echo $i[0].$i[1].'<br />';   

                       $values=explode(';', $valeur,2);  


                $Code_segment=$values[0];  
                $Libelle_segment=$values[1];           


                $sqlInsert = "INSERT into segment_metier(Code_segment,Libelle_segment)  
                       values ('" . $Code_segment . "','" . $Libelle_segment . "')";  


                         $result = mysqli_query($conn, $sqlInsert);  

                         $last_id = mysqli_insert_id($conn);  

                         printf ("Le nouvel enregistrement a l'id %d.\n",  $last_id);  
                        /* if(mysqli_insert_id($conn)){  
                             $sqlInsert = "INSERT into metier_personnel values (mysql_insert_id)";  
                         }*/  


                if (!is_null($result)) {  


                    $type = "success";  
                    $message = "Les données CSV sont intégrées à la base avec succès!";  
                    echo $type." : ".$message."<br/>";  
                } else {  
                    $type = "error";  
                    $message = "Problem in Importing CSV Data";  
                    echo $type." : ".$message."<br/>";  
                }  

            }  
        }  
        $j++;  
        }  
        fclose($file);  

        }  
        mysqli_close($conn);  
    }  
    ?>  
    <!DOCTYPE html>  
    <html>  

    <head>  

    </head>  

    <body>  
        <h2>Importer un fichier CSV à ma base</h2>  

        <div class="outer-scontainer">  
            <div class="row">  

                <form class="form-horizontal" action="" method="post"  
                    name="frmCSVImport" id="frmCSVImport" enctype="multipart/form-data">  
                    <div class="input-row">  
                        <label class="col-md-4 control-label">Selectionner le CSV  
                            </label> <input type="file" name="file"  
                            id="file" accept=".csv">  
                        <button type="submit" id="submit" name="import"  
                            class="btn-submit">Import</button>  
                        <br />  

                    </div>  

                </form>  

            </div>  

        </div>  

    </body>  

    </html>  

ci-dessous le script qui alimente la table metier_personnel qui doit recevoir les id_segment recupérés avec la fonction mysqli_insert_id.

    <?php  

    $servername = "localhost";  
    $username = "";  
    $password = "";  
    $dbname = "";  

    // Create connection  
    $conn = mysqli_connect($servername, $username, $password, $dbname);  
    if (isset($_POST["import"])) {  

        $fileName = $_FILES["file"]["tmp_name"];  

        if ($_FILES["file"]["size"] > 0) {  

            $file = fopen($fileName, "a+");  
               $j = 0;      
            while (($data = fgetcsv($file, 1000, ",")) !== FALSE)  
            {   

                if ($j>0) {  
                    $i = 0;  

                    foreach($data as $i => $valeur){  

                        echo $i[0].$i[1].'<br />';   



                $values=explode(';', $valeur,2);  


                $Code_EG=$values[0];  
                $Libelle_EG=$values[1];  





                 $sqlInsert = "INSERT into metier_personnel(Code_EG,Libelle_EG)  
                       values ('" . $Code_EG . "','" . $Libelle_EG . "')";  

                         $result = mysqli_query($conn, $sqlInsert);  





                if (!is_null($result)) {  


                    $type = "success";  
                    $message = "Les données CSV sont intégrées à la base avec succès!";  
                    echo $type." : ".$message."<br/>";  
                } else {  
                    $type = "error";  
                    $message = "Problem in Importing CSV Data";  
                    echo $type." : ".$message."<br/>";  
                }  

            }  
        }  
        $j++;  
        }  
        fclose($file);  

        }  
        mysqli_close($conn);  
    }  
    ?>  
    <!DOCTYPE html>  
    <html>  

    <head>  

    </head>  

    <body>  
        <h2>Importer un fichier CSV à ma base</h2>  

        <div class="outer-scontainer">  
            <div class="row">  

                <form class="form-horizontal" action="" method="post"  
                    name="frmCSVImport" id="frmCSVImport" enctype="multipart/form-data">  
                    <div class="input-row">  
                        <label class="col-md-4 control-label">Selectionner le CSV  
                            </label> <input type="file" name="file"  
                            id="file" accept=".csv">  
                        <button type="submit" id="submit" name="import"  
                            class="btn-submit">Import</button>  
                        <br />  

                    </div>  

                </form>  

            </div>  

        </div>  

    </body>  

    </html>  

Aidez-moi s'il vous plaît.
J'ai même essayé avec API PDO, c'est pareil, je parviens à afficher last_id de table id_segment, mais je ne parviens pas à les injecter dans la colonne de la clé étrangère de la table "metier_personnel".

Merci à tous.

 
Par Cyrano  -  Le 23/08/2018 12:29  -  Haut de page  - 

Ben une fois les identifiant récupérés, il s'agirait de les mettre dans la requête d'insertion, ça n'est pas magique et ça ne se fera pas tout seul.

Là, je vois ceci :

$sqlInsert = "INSERT into metier_personnel(Code_EG,Libelle_EG)  
              values ('" . $Code_EG . "','" . $Libelle_EG . "')";

Je vois bien l'insertion de deux colonnes, mais pas de la clé étrangère, donc ça ne peut bien entendu pas fonctionner.

Un peu de logique serait fort utile en l'occurrence.

 
Par mknaite  -  Le 24/08/2018 16:09  -  Haut de page  - 

Merci Cyrano et à tous ceux qui pourront m'aider.

En fait, mon problème est partiellement résolu grâce au conseil de Cyrano.
j'ai pu remplir les champs des clés étrangères dans 4 tables liées.
Précision:
Un seul fichier csv sert à alimenter les 4 tables. Sachant que le formulaire que j'utilise permet d'importer un seul fichier csv à la fois et pas plusieurs.
Donc, les deux autres tables qui refusent d'être remplies à cause de contrainte d'intégrité, ont comme sources d'alimentation deux fichiers csv différents. Or, mon script ne peut traiter qu'un seul fichier csv(il a atteint sa limite).

Je vous mets le script qui fonctionne et les script des deux autres tables qui vont recevoir comme clé étrangère la clé(auto_increment) de la table"infos_personnel.
les voici:

    <?php  


        $servername = "localhost";  

        $username = "";  

        $password = "";  

        $dbname = "";  

        //making an array with the data received, to use as named placeholders   for INSERT by PDO.  

    if (isset($_POST["import"])) {  

        $fileName = $_FILES["file"]["tmp_name"];  
        if ($_FILES["file"]["size"] > 0) {  

        $file = fopen($fileName, "a+");  
           $j = 0;      
        while (($data = fgetcsv($file, 1000, ",")) !== FALSE)  
        {   
            if ($j>0) {  
            $i = 0;  

            foreach($data as $i => $valeur){  

                echo $i[0].$i[1].'<br />';  

         try {  
         // preparing database handle $dbh  

         /*$dbh*/$conn = new PDO("mysql:host=$servername;dbname=$dbname",  

         $username,$password);  
        // set the PDO error mode to exception  

       /* $dbh*/$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  


    // // prepare sql and bind parameters  
       $stmt = $conn->prepare("INSERT INTO segment_metier (Code_segment, Libelle_segment)  
        VALUES (:Code_segment, :Libelle_segment)");  
        $stmt->bindParam(':Code_segment', $Code_segment);  
        $stmt->bindParam(':Libelle_segment', $Libelle_segment);  

            $values=explode(';', $valeur,21);  

                $Code_segment=$values[0];  
                $Libelle_segment=$values[1];  

                $stmt->execute();  

        $currentID = $conn->lastInsertId();  
         /*------First Last_id->segment_metier*/  

        $stmt1 = $conn->prepare("INSERT INTO metier_personnel (Code_EG,Libelle_EG,id_segment)  
        VALUES (:Code_EG,:Libelle_EG,:id_segment)");  
        $stmt1->bindParam(':Code_EG', $Code_EG);  
        $stmt1->bindParam(':Libelle_EG', $Libelle_EG);  
        $stmt1->bindParam(':id_segment', $currentID);  

         /*   $values=explode(';', $valeur,2);*/  

                $Code_EG=$values[2];  
                $Libelle_EG=$values[3];  

                $stmt1->execute();  
                /*------Second Last_id->metier_personnel->destiné à la table "infos_personnel"*/    
                $currentID = $conn->lastInsertId();  
                 $currentIDm=$currentID;  
                /*---------infos_site---------------------*/  
                $stmt2 = $conn->prepare("INSERT INTO infos_site(Tipi,Libelle_site)  
        VALUES (:Tipi,:Libelle_site)");  
        $stmt2->bindParam(':Tipi', $Tipi);  
        $stmt2->bindParam(':Libelle_site', $Libelle_site);  
        /*$stmt1->bindParam(':id_segment', $currentID);*/  

         /*   $values=explode(';', $valeur,2);*/  

                $Tipi=$values[4];  
                $Libelle_site=$values[5];  

                $stmt2->execute();  
                  /*---Third Last_id->infos_site->destiné à la table"infos_personnel"*/  
                  $currentID = $conn->lastInsertId();  
                  $currentIDs=$currentID;  
                 /*---------infos_personnel---------------------*/  

        $stmt3 = $conn->prepare("INSERT INTO infos_personnel(Nom,Prenom,Cuid,Mail,Entite,TelFixe,TelMobile,Cuid_md,Mail_md,Type_personnel,Categorie_GIR,Code_GIR,Code_tipi,Domaine_GIR,Entite_client,id_site,id_metier)  
        VALUES (:Nom,:Prenom,:Cuid,:Mail,:Entite,:TelFixe,:TelMobile,:Cuid_md,:Mail_md,:Type_personnel,:Categorie_GIR,:Code_GIR,:Code_tipi,:Domaine_GIR,:Entite_client,:id_site,:id_metier)");  
        $stmt3->bindParam(':Nom', $Nom);  
        $stmt3->bindParam(':Prenom', $Prenom);  
        $stmt3->bindParam(':Cuid', $Cuid);  
        $stmt3->bindParam(':Mail', $Mail);  
        $stmt3->bindParam(':Entite', $Entite);  
        $stmt3->bindParam(':TelFixe', $TelFixe);  
        $stmt3->bindParam(':TelMobile', $TelMobile);  
        $stmt3->bindParam(':Cuid_md', $Cuid_md);  
        $stmt3->bindParam(':Mail_md', $Mail_md);  
        $stmt3->bindParam(':Type_personnel', $Type_personnel);  
        $stmt3->bindParam(':Categorie_GIR', $Categorie_GIR);  
        $stmt3->bindParam(':Code_GIR', $Code_GIR);  
        $stmt3->bindParam(':Code_tipi', $Code_tipi);  
        $stmt3->bindParam(':Domaine_GIR', $Domaine_GIR);  
        $stmt3->bindParam(':Entite_client', $Entite_client);  
        $stmt3->bindParam(':id_site',   $currentIDs);  
        $stmt3->bindParam(':id_metier', $currentIDm);  

         /*   $values=explode(';', $valeur,2);*/  

                $Nom=$values[6];  
                $Prenom=$values[7];  
                $Cuid=$values[8];  
                $Mail=$values[9];  
                $Entite=$values[10];  
                $TelFixe=$values[11];  
                $TelMobile=$values[12];  
                $Cuid_md=$values[13];  
                $Mail_md=$values[14];  
                $Type_personnel=$values[15];  
                $Categorie_GIR=$values[16];  
                $Code_GIR=$values[17];  
                $Code_tipi=$values[18];  
                $Domaine_GIR=$values[19];                 
                $Entite_client=$values[20];  
              /*  $Type_btmail=$values[21];*/  
              $stmt3->execute();  
              /*---Fourth  Last_id->infos_personnel->destiné aux tables"premium" & poste de travail*/  
               $currentID = $conn->lastInsertId();  
               $currentIDpers=$currentID;  

        echo "New record created successfully";  
        }  
        catch(PDOException $e)  
        {  
        echo"Error:"  . $e->getMessage();  
        }  
    }  
    }  
      $j++;  
    }  
     fclose($file);  

    }  


        $conn = null;  
    }  

        ?>  


    <!DOCTYPE html>  
    <html>  

    <head>  
    </head>  

    <body>  
        <h2>Importer un fichier CSV à ma base</h2>  


        <div class="outer-scontainer">  
            <div class="row">  

                <form class="form-horizontal" action="" method="post"  
                    name="frmCSVImport" id="frmCSVImport" enctype="multipart/form-data">  
                    <div class="input-row">  
                        <label class="col-md-4 control-label">Selectionner le CSV  
                            </label> <input type="file" name="file"  
                            id="file" accept=".csv">  
                        <button type="submit" id="submit" name="import"  
                            class="btn-submit">Import</button>  
                        <br />  

                    </div>  

                </form>  

            </div>  

        </div>  

    </body>  

    </html>  

NB: les deux en jeu sont:

1) Infos_personnel qui fournit sa clé primaire à la table "premium
2) premium qui recoit la clé étrangère, mais réfuse d'être remplie.

error: #1452 Can not add or update child rows foreign key constraint
)

    <?php  
     /*session_start();*/  

        $servername = "localhost";  

        $username = "root";  

        $password = "";  

        $dbname = "db2018";  

        //making an array with the data received, to use as named placeholders   for INSERT by PDO.  

    if (isset($_POST["import"])) {  

        $fileName = $_FILES["file"]["tmp_name"];  
        if ($_FILES["file"]["size"] > 0) {  

        $file = fopen($fileName, "a+");  
           $j = 0;      
        while (($data = fgetcsv($file, 1000, ",")) !== FALSE)  
        {   
            if ($j>0) {  
            $i = 0;  

            foreach($data as $i => $valeur){  

                echo $i[0].$i[1].'<br />'; // Pour faire mumuse mais ca sert a rien de l'afficher print_r le fait bien tout seul  


         try {  
         // preparing database handle $dbh  
        $conn = new PDO("mysql:host=$servername;dbname=$dbname",  

         $username,$password);  
        // set the PDO error mode to exception  

       /* $dbh*/$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  




    // // prepare sql and bind parameters  
       $stmt = $conn->prepare("INSERT INTO premium (Cuid_premium,Mail_premium,Mobile_premium,pers_id)  
        VALUES (:Cuid_premium,:Mail_premium,:Mobile_premium,:pers_id)");  
        $stmt->bindParam(':Cuid_premium', $Cuid_premium);  
        $stmt->bindParam(':Mail_premium', $Mail_premium);  
        $stmt->bindParam(':Mobile_premium', $Mobile_premium);  
        $stmt->bindParam(':pers_id', $currentID);  

              $values=explode(';', $valeur,3);  

                $Cuid_premium=$values[0];  
                $Mail_premium=$values[1];  
                $Mobile_premium=$values[2];  

                $stmt->execute();  



        echo "New record created successfully";  
        }  
        catch(PDOException $e)  
        {  
        echo"Error:"  . $e->getMessage();  
        }  
    }  
    }  
      $j++;  
    }  
     fclose($file);  

    }  


        $conn = null;  
    }  

        ?>  


    <!DOCTYPE html>  
    <html>  

    <head>  
    </head>  

    <body>  
        <h2>Importer un fichier CSV à ma base</h2>  


        <div class="outer-scontainer">  
            <div class="row">  

                <form class="form-horizontal" action="" method="post"  
                    name="frmCSVImport" id="frmCSVImport" enctype="multipart/form-data">  
                    <div class="input-row">  
                        <label class="col-md-4 control-label">Selectionner le CSV  
                            </label> <input type="file" name="file"  
                            id="file" accept=".csv">  
                        <button type="submit" id="submit" name="import"  
                            class="btn-submit">Import</button>  
                        <br />  

                    </div>  

                </form>  

            </div>  

        </div>  

    </body>  

    </html>  

Avez-vous une idée pour que je puisse exécuter deux ou plusieurs fichiers à la fois dans un même formulaire?

Je précise que la parent et la table fille ont chacune un fichier csv à part.

Merci.

 
Par Cyrano  -  Le 24/08/2018 16:47  -  Haut de page  - 

Il faut impérativement remplir les données dans les tables dans le bon ordre. Si certaines tables comportent des clés étrangère, il est impératif que les valeurs de clé primaire des autres tables correspondant à ces clés étrangères soient alimentées au préalable.

Ça implique deux options :
La première option possible implique qu'entre les fichiers CSV des éléments communs permettent d'identifier dans le fichier A à quelle ligne du fichier B, ou inversement, peu importe. Il faut donc que le traitement PHP reçoive les fichiers dans le bon ordre et alimente les tables. Lorsqu'il doit être inséré une clé étrangère, il faut effectuer une requête préalable pour identifier la ligne de la table X correspond à la ligne du fichier csv traitée pour récupérer la clé primaire et construire la requête d'insertion dans la table Y avec la valeur valide de clé étrangère.

Autre option : à partir des fichiers CSV, construire un fichier CSV unique : dans un tableur, alimenter autant d'onglets qu'il y a de fichiers CSV : créer un onglet supplémentaire qui regroupe les données de tous les autres en faisant correspondre les clés communes.

Exemple : mettons que j'aie deux fichiers CSV, l'un avec des noms, l'autre avec des adresses. Logiquement, dans le fichier de noms, je dois avoir une référence à une adresse du second fichier qui correspondent

noms.csv
+-----+-----+---------+---------+
|  \  | Nom | Prénom  | Adresse |
+-----+-----+---------+---------+
|   1 | Xxx | Pierre  | 1       |
|   2 | Zzz | Paul    | 2       |
| ... | ... |         | ...     |
|   n | Nnn | Jacques | Naa     |
+-----+-----+---------+---------+

adresses.csv
+-----+--------+-------------+-----------+------------+
|  \  | numero | voie        | commune   | codepostal |
+-----+--------+-------------+-----------+------------+
|   1 | 123    | Rue truc    | Issy      | 12340      |
|   2 | 345    | Blvd Machin | Ailleurs  | 23450      |
| ... | ...    | ...         | ...       | .....      |
|   n | Nnn    | Avenue xxx  | Autrepart | 45670      |
+-----+--------+-------------+-----------+------------+

Dans cet exemple, j'ai une clé dans le fichier d'adresses que je retrouve dans le fichier de noms.
Donc je vais d'abord insérer les adresses dans la table appropriée mais ça sous-entend que la clé du fichier devient la clé primaire dans la table, ou bien que je trouve une manière de conserver quelque part la correspondance entre cette clé et la clé primaire générée à l'insertion.

Ensuite, pour insérer les noms, je vais récupérer la valeur de cette clé, identifier la clé primaire dans la table des adresses pour pouvoir construire la requête d'insertion de nom avec la bonne clé étrangère.

Voilà, c'est l'idée générale qu'il reste maintenant à adapter, je ne peux guère m'avancer plus loin n'ayant aucune idée de la structure des fichiers CSV qui doivent être traités.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !