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:
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
)
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.
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.