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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| ////////////////////////////////////////////////// GESTION DU PAYS ////////////////////////////////////////////////////
// Création de l'index des pays
$sql = <<<SQL
SELECT
-- Attention, ordre des colonnes important
-- pour le résultat obtenu avec PDO::fetchAll(PDO::FETCH_KEY_PAIR)
COU_country, -- En 1er la colonne qui permettra d'indexer l'ID, ici idéalement le code pays sur 3 caractères
COU_ident -- En 2nd l'ID à retrouver
FROM COU_country
SQL;
$index_countries = $pdo->query($sql)->fetchAll(PDO::FETCH_KEY_PAIR);
// $index_countries contient les couples ["nom/code pays" => "ID"] ou un tableau vide si table vide
// => On retrouve l'ID selon le nom/code du pays
// Préparation de la requête d'insertion du pays
$sql = <<<SQL
INSERT INTO COU_country (COU_country_alpha3, COU_country, COU_region)
VALUES (:code, :name, :region)
SQL;
$insert_country = $pdo->prepare($sql);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////// GESTION DE L'UTILISATEUR //////////////////////////////////////////////
// Création de l'index des utilisateurs
$sql = <<<SQL
SELECT
-- Attention, ordre des colonnes important
-- pour le résultat obtenu avec PDO::fetchAll(PDO::FETCH_KEY_PAIR)
US_sesa, -- En 1er la colonne qui permettra d'indexer l'ID
US_ident -- En 2nd l'ID à retrouver
FROM US_user
SQL;
$index_users = $pdo->query($sql)->fetchAll(PDO::FETCH_KEY_PAIR);
// $index_users contient les couples ["SESA utilisateur" => "ID"] ou un tableau vide si table vide
// => On retrouve l'ID selon le SESA de l'utilisateur
// Préparation de l'insertion de l'utilisateur
$sql = <<<SQL
INSERT INTO US_user (US_sesa, US_firstname, US_lastname, OZ_ident, COU_ident)
VALUES (:sesa, :firstname, :lastname, :idoz, :idcou)
SQL;
$insert_user = $pdo->prepare($sql);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////// GESTION DE L'ORGANISATION ///////////////////////////////////////////////
// Création de l'index des organisations
$sql = <<<SQL
SELECT
-- Attention, ordre des colonnes important
-- pour le résultat obtenu avec PDO::fetchAll(PDO::FETCH_KEY_PAIR)
OZ_organization, -- En 1er la colonne qui permettra d'indexer l'ID
OZ_ident -- En 2nd l'ID à retrouver
FROM OZ_organization
SQL;
$index_organizations = $pdo->query($sql)->fetchAll(PDO::FETCH_KEY_PAIR);
// $index_organizations contient les couples ["nom organization" => "ID"] ou un tableau vide si table vide
// => On retrouve l'ID selon le nom de l'organisation
// Préparation de l'insertion de l'organisation
// À FAIRE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////// PARCOURS DU CSV ////////////////////////////////////////////////////
$csv_file = 'fichier-source.csv';
$csv_handler = fopen($csv_file, 'r');
$csv_separator = ',';
$csv_enclosure = '"';
$csv_escape = '';
if (fread($csv_handler, 3) !== "\xEF\xBB\xBF") { // 3 premiers octets ne correspondent pas au BOM ?
// Si BOM absent on lit le fichier depuis le début
rewind($csv_handler); // Retour au début du fichier
} // Sinon on poursuit après le BOM
$header = fgetcsv($csv_handler, 0, $csv_separator, $csv_enclosure, $csv_escape);
// Je ne connaîs pas le nom de tes colonnes CSV, à adapter dans la boucle lors des accès $csv_entry->...
while ($csv_entry = fgetcsv($csv_handler, 0, $csv_separator, $csv_enclosure, $csv_escape)) {
// Pour pouvoir accéder aux colonnes du CSV en fait $csv_entry->column_name
$csv_entry = (object)array_combine($header, $csv_entry);
// Il faut commencer le traitement par les tables qui ne dépendent pas des tables précédentes
// Sinon tu vas te retrouver avec des clefs inconnues
//////////////// TRAITEMENT DU PAYS DU CSV
// Commençons par la table des pays, qui ne dépend d'aucune autre table
// J'imagine que ton CSV a une colonne "country_code"
if (!isset($index_countries[$csv_entry->country_code])) { // Si pays pas encore indexé, et donc pas encore en base
$insert_country->execute([ // On l'insère en base
':code' => $csv_entry->country_code, // J'imagine que ton CSV a une colonne "country_code"
':name' => $csv_entry->country_name, // J'imagine que ton CSV a une colonne "country_name"
':region' => $csv_entry->country_region, // J'imagine que ton CSV a une colonne "country_region"
]);
$country_id = $pdo->lastInsertId(); // Obtention de l'ID généré par MySQL lors de l'insertion
$index_countries[$csv_entry->country_code] = $country_id; // Indexation de l'ID pays selon le code pays
} else {
$country_id = $index_countries[$csv_entry->country_code];
}
// Arrivé ici on a $country_id valorisé, la table à jour, et l'index à jour
// On poursuit avec une autre table indépendante, ou qui dépend de COU_country seule (puisque cette dernière est à jour)
//////////////// TRAITEMENT DE L'ORGANISATION DU CSV
// On poursuit avec l'organisation qui ne dépend d'aucune autre table
if (!isset($index_organizations[$csv_entry->organization_name])) {
$insert_organization->execute([':name' => $csv_entry->organization_name]);
$organization_id = $pdo->lastInsertId();
$index_organizations[$csv_entry->organization_name] = $organization_id;
} else {
$organization_id = $index_organizations[$csv_entry->organization_name];
}
// Arrivé ici on a $organization_id valorisé, la table à jour, et l'index à jour
// On poursuit avec une autre table indépendante, ou qui dépend seulement de COU_country et/ou OZ_organization (puisque ces dernières sont à jour)
//////////////// TRAITEMENT DE L'UTILISATEUR DU CSV
// Imaginons que US_user n'a pas d'autres dépendances que le pays et l'organisation
// C'est pour l'EXEMPLE de la réutilisation de $country_id et $organization_id
// COMME TOUT LE RESTE IL FAUDRA ADAPTER
if (!isset($index_users[$csv_entry->user_sesa])) {
$insert_user->execute([
':sesa' => $csv_entry->user_sesa,
':firstname' => $csv_entry->user_firstname,
':lastname' => $csv_entry->user_lastname,
// Et c'est là que tout se joue...
// Utilisation des ID des clefs étrangères récupérées plus haut
':organization' => $organization_id,
':country' => $country_id,
]);
$user_id = $pdo->lastInsertId();
$index_users[$csv_entry->user_sesa] = $user_id;
} else {
$user_id = $index_users[$csv_entry->user_sesa];
}
// Arrivé ici on a $user_id valorisé, la table à jour, et l'index à jour
// On poursuit avec une autre table indépendante ou dépendant selon des pays/organisation/utilsateur
// ...
} |
Partager