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).
Bonjour et Merci,
En fait, mon problème est partiellement résolu grâce au conseil de Cyrano sur un autre forum.
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.
Le but est de fournir à php plusieurs fichier
foreach ($currentFile as $filename) {
    $handle = fopen($filename,"r");
}

donc essaye de faire passer plusieurs fichier dans ton formulaire
Solution alternative.

Tu demandes au client combien de fichier il souhaite traiter dans un formulaire:

Nombre de fichiers :
        <input type="number" style ="width:50px; text-align:center " required min ="1" max="12" step="1" name="file_count" value="1">


Tu lui affiches autant d'input type file que demandés de cette façon :

<?php
            for($i=0; $i<$file_count;$i++){
              echo "<tr><td>
             Fichier à upload :
            <input type='file' style='vertical-align: middle; padding-top:8px' name ='csvFile[]'/>              </td></tr>";
            }
?>


Ensuite tu traites le tout dans ton controleur PHP

<?php
      if(!empty($_POST['nom_du_submit']){
            $i = 0;
            while($i < count($_POST['csvFile'])) {
                /** Ta fonction qui traite les csv pour chaque fichier */
            $i++;
       }

Je trouve le foreach intéressant pour traiter de fichiers dans ce cas.
 ,>       


l'attribut name="csvFile[]" va créer un tableau avec tous les fichiers envoyés sous la forme
$_POST['csvFile0'] pour autant de fichiers récupérés là où avec name="file" bah y en a un seul non gérable dynamiquement.

Bien évidemment c'est utilisable à toutes les sauces (tu demandes le nombre de personnes à inscrire et tu génères autant de formulaires et [] est la méthode de base en php pour push dans un array. La seule limite c'est ton php.ini qui l'impose quant à la taille et au nombre de fichiers que tu peux recevoir.

Si tu veux faire le tout en une page t'as juste besoin de mettre des isset($_POST[ce_que_tu_cherches]) dans des formulaires différents et des echo au bon endroit qui afficheront les différentes parties du formulaire.
Modifié par Athos_is_coding (25 Aug 2018 - 05:21)