J'ai bien fait le changement. OK! Maintenant je fais une commande SQL via phpMyAdmin dans laquelle je donne le chemin du fichier à charger comme suit:
LOAD DATA INFILE 'C:\Users\Jean Claude\Documents\ADNA06\Développements\FormationWamp\intersection_258464'
J'obtiens le message suivant:
#29 - File 'c:\wamp64\bin\mysql\mysql5.7.36\data\UsersJean ClaudeDocumentsADNA06DéveloppementsFormationWampintersection_258464' not found (Errcode: 2 - No such file or directory)
Il ne cherche pas le fichier là où je l'ai défini. Comment faire? Aurais-je le même problème en exécutant LOAD DADA via un script PHP? Merci.
J'ai mis le fichier dans le répertoire 'c:\wamp64\bin\mysql\mysql5.7.36\data\ValPic (ValPic est la base de donneés courante). Ca marche, mais ce n'est évidemment pas la chose à faire.
Donc vous proposez tmp. Il faut donc spécifier le fichier avec le chemin: 'c:\wamp64\tmp\nom du fichier
Encore moi. Vous avez dû trouver mon dernier envoi de peu d'intérêt et j'en conviens, ce n'est pas d'un niveau époustouflant. Mais sincèrement, mon application va nécessiter l'usage de plusieurs fichiers externes lus par LOAD DATA INFILE. J'ai un problème avec la localisation idéale de ces fichiers. Pour le moment je n'ai eu du succès qu'en les stockant dans c:\wamp64\bin\mysql\mysql5.7.36\data\ValPic (ValPic étant la base de données sur laquelle je travaille). Je doute que ce soit approprié. Supposant comme vous le suggérez de les placer dans tmp, comment dois-je spécifier le chemin pour que MySQL les trouve là dans ce répertoire? Mes notions de OS sont loin... Merci.
Donc tu crées ta base et ta table avec tes champs et tu adaptes ceci pour ton importation.
C'est une simple requête PDO et cela permet d'aller très vite pour importer.
<?php $databasehost = "localhost"; //Nom du serveur $databasename = "testcsv"; //Nom de la Base de Donnée $databasetable = "matable"; //Nom de la table qui aura été crée avec les champs $databaseusername="root"; //Nom Utilisateur $databasepassword = "test"; //Mot de Passe $fieldseparator = ","; //Type de Séparateur $lineseparator = "\n"; //Séparateur de Ligne exemple ici saut de ligne $csvfile = "myFile.csv"; //Nom du fichierCSV if(!file_exists($csvfile)) { die("Fichier introuvable. Assurez-vous que vous avez précisé le bon chemin pour ce Fichier." ); } try { $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", $databaseusername, $databasepassword, array( PDO::MYSQL_ATTR_LOCAL_INFILE => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); } catch (PDOException $e) { die("database connection failed: ".$e->getMessage()); } $affectedRows = $pdo->exec(" LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable` FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)." LINES TERMINATED BY ".$pdo->quote($lineseparator)); echo "Un total de $affectedRows a été chargé à partir du fichier csv.\n"; ?>
Bon courage.
Modifie 2 fois. Derniere modification le 29/06/2022 à 14:28 par maximus23.
Du courage il m'en faudra et je crois en avoir. Je vous remercie pour votre disponibilité. Ca a avancé, votre procédure semble fonctionner, mais à chaque avancée une question se pose. Au risque de vous importuner:
1) Comment faire pour ignorer n premières lignes?
2) Eliminant manuellement la ligne 1 j'ai 2 champs DATETIME que je retrouve à 0000-00-00 00:00:00. Ca avait fonctionné via phpMyAdmin
3) Une seule ligne est récupérée. Comment récupérer tout le fichier?
Je comprends que vous ne pouvez pas intervenir à tous les niveaux. Je suis cependant assez satisfait car vous m'avez mis sur la bonne piste et avec un peu de perspicacité je suis arrivé à la solution, la principale conclusion étant qu'il ne faut pas que la table de destination soit définie avec une clé. Ci-dessous le code auquel j'ai abouti avec succès:
<html> <head> <title>Cours PHP / MySQL</title> <meta charset="utf-8"> <link rel="stylesheet" href="cours.css"> </head> <body> <h1>Bases de données MySQL</h1> <?php $databasehost = "formation"; //Nom du serveur $databasename = "ValPic"; //Nom de la Base de Donnée $databasetable = "Survols_Temp"; //Nom de la table qui aura été crée avec les champs $databaseusername="root"; //Nom Utilisateur $databasepassword = ""; //Mot de Passe $fieldseparator = ";"; //Type de Séparateur $enclosing = '"' ; //Type de Séparateur $lineseparator = "\r\n"; //Séparateur de Ligne exemple ici saut de ligne $lineignore = 1; //Nombre de lignes à ignorer echo $lineignore; $csvfile = "C:\wamp64\importcsv\intersection_270758_Long_Avec_Titre.csv"; //Nom du fichierCSV if(!file_exists($csvfile)) { die("Fichier introuvable. Assurez-vous que vous avez précisé le bon chemin pour ce Fichier." ); } try { $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", $databaseusername, $databasepassword, array( PDO::MYSQL_ATTR_LOCAL_INFILE => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); } catch (PDOException $e) { die("database connection failed: ".$e->getMessage()); } print "$pdo->quote($lineignore) "; print "$pdo->quote($csvfile) "; $affectedRows = $pdo->exec(" LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable` FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)." ENCLOSED BY ".$pdo->quote($enclosing)." LINES TERMINATED BY ".$pdo->quote($lineseparator)." IGNORE $lineignore LINES" echo "Un total de $affectedRows a été chargé à partir du fichier csv.\n"; ?> </body> </html>