Forum Clubic

Importation de BDD (page 2)

oui oui c’est ce que je fais…

Le problème, je crois, c’est que MySQL ne va pas chercher le fichier “base.csv” dans ton répertoire web (logique), il va aller le chercher dans son répertoire de travail à lui (voir la documentation MySQL pour savoir lequel).


[MySQL 5.0 Reference Manual: 12.2.5. LOAD DATA INFILE Syntax[/url] ([url=http://dev.mysql.com/doc/refman/5.0/fr/load-data.html]version française, un poil moins complète](http://dev.mysql.com/doc/refman/5.0/en/load-data.html)) :[quote=""] The LOCAL keyword, if specified, is interpreted with respect to the client end of the connection:
* If LOCAL is specified, the file is read by the client program on the client host and sent to the server. The file can be given as a full pathname to specify its exact location. If given as a relative pathname, the name is interpreted relative to the directory in which the client program was started. (Pas possible avec la couche Web (Apache/PHP))
* If LOCAL is not specified, the file must be located on the server host and is read directly by the server. The server uses the following rules to locate the file:
      o If the filename is an absolute pathname, the server uses it as given.
      o If the filename is a relative pathname with one or more leading components, the server searches for the file relative to the server's data directory.
      o If a filename with no leading components is given, the server looks for the file in the database directory of the default database.

Note that, in the non-LOCAL case, these rules mean that a file named as ./myfile.txt is read from the server’s data directory, whereas the file named as myfile.txt is read from the database directory of the default database. For example, if db1 is the default database, the following LOAD DATA statement reads the file data.txt from the database directory for db1, even though the statement explicitly loads the file into a table in the db2 database:

LOAD DATA INFILE ‘data.txt’ INTO TABLE db2.my_table;

Windows pathnames are specified using forward slashes rather than backslashes. If you do use backslashes, you must double them.

For security reasons, when reading text files located on the server, the files must either reside in the database directory or be readable by all. Also, to use LOAD DATA INFILE on server files, you must have the FILE privilege. See Section 5.4.3, “Privileges Provided by MySQL”.

Using LOCAL is a bit slower than letting the server access the files directly, because the contents of the file must be sent over the connection by the client to the server. On the other hand, you do not need the FILE privilege to load local files.

With LOCAL, the default behavior is the same as if IGNORE is specified; this is because the server has no way to stop transmission of the file in the middle of the operation. IGNORE is explained further later in this section.

LOCAL works only if your server and your client both have been enabled to allow it. For example, if mysqld was started with --local-infile=0, LOCAL does not work. See Section 5.3.4, “Security Issues with LOAD DATA LOCAL”.
[/quote]
Sachant dans le cas de figure qui nous intéresse, le client MySQL est notre couche Web (Apache/PHP) et qu’il n’est pas interactif (ne vas pas initier de demande d’upload de fichier à l’utilisateur pour l’envoyer au serveur)
Edité le 26/05/2008 à 13:32

bon j’ai pas tt compris le texte que tu as mis…c’est impossible c’est de ca qu’il s’agit ?

Bah en gros, avec ta commande LOAD DATA INFILE tu demande à MySQL de remplir une table avec le contenu d’un fichier (en lui demandant de s’occuper du fichier pour toi : l’ouvrir, le lire, etc.).
Or, afin que MySQL puisse le trouve, ce fichier ne peut pas être n’importe où.
Dit toi que ça n’est pas parce qu’il est atteignable par PHP qu’il l’est également par le serveur MySQL (les deux serveurs peuvent être sur des machines différentes par exemple).
En l’occurrence là, il est demandé qu’il soit situé sur la machine faisant tourner le serveur :

  • Soit n’importe où sur le disque de la machine serveur (en donnant le chemin d’accès complet)
  • Soit dans le dossier “data” du logiciel serveur MySQL (en donnant un chemin d’accès relatif)
  • Soit dans le dossier de la base de donnée par défaut " (en ne donnant que le nom du fichier)

Généralement moi, pour importer un fichier .csv dans une table MySQL je transforme chaque ligne du fichier .csv en ordre SQL INSERT INTO que j’exécute par un mysql_query(). Ca n’est pas aussi performant/rapide que la commande LOAD DATA INFILE mais ça marche dans tous les cas.

dans une boucle ?? tu peux juste me mettre un bout de code pour me montrer stp…

Un pseudo-code/PHP ça donnerait un truc dans ce style (syntaxe SQL du INSERT INTO à vérifier) :

$fichier = 'données.csv';
$enregistrements = array();
pour chaque ligne $ligne de $fichier :
	$enregistrements[] = '(\'' . implode('\',\'', explode(';', $ligne)) . '\')';
finpour

$sql = 'INSERT INTO `tabl` ('champ1', 'champ2', ...) VALUES ' . implode(',', $enregistrements);

function read_csv( $filename, $separateur) // transfert le fichier dans un tableau{
if ( $FILE=fopen($filename,“r” ) ) // ouverture du fichier
{ while ($ARRAY[]=fgetcsv($FILE,1024,$separateur)); // lire ligne par ligne et coupe colonne par colonne
fclose($FILE) ; // ferme le fichier
array_pop($ARRAY); // efface la derniere ligne
return ($ARRAY) ; // renvoie le tableau }
else
{ /* le fichier n’existe pas */
echo “Fichier introuvable !
Importation stoppée.”;
exit(); }}
puis dans une deuxieme partie :

for($i=0;$i<count($array);$i++){
insert into tatable (champ1,champ2,…) values ($array[$i][0],$array[$i] [1],…)
}
Le code pourrait marché mais il ne reconai plus $array dans le ligne du pour…