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"?
Modifié par nkm (22 Aug 2018 - 11:26)