IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[CSV] paumé dans les emplacements de fichiers


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 421
    Par défaut [CSV] paumé dans les emplacements de fichiers
    Je suis paumé dans les emplacements de fichiers.

    Je voudrais tout simplement le récupérer un fichier dans un répertoire 'transferts' (déposé par FTP) au moyen d'un programme PHP et le charger dans une base MySQL avec un LOAD DATA INFILE.

    Le répertoire par défaut de PHP (getcwd) est c:\applications\easyphp1-8\www\monsite\ (pourquoi ça m'indique un c:\... et pas un localhost\... ?)
    mais celui de MySQL est C:\applications\EasyPHP1-8\mysql\data\mabase\

    Alors déjà là c'est mal barré : je mets le répertoire 'transferts' dans lequel des 2 ?

    Ensuite si j'indique un chemin complet au LOAD DATA INFILE les / disparaissent ! Donc impossible de placer le fichier ailleurs qu'à la base du répertoire par défaut.


    Bref, j'y comprends rien. Pour faire simple : où puis-je créer un répertoire 'transferts' connu aussi bien de PHP et MySQL et comment je peux y accéder ?

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par Peanut
    Le répertoire par défaut de PHP (getcwd) est c:\applications\easyphp1-8\www\monsite\ (pourquoi ça m'indique un c:\... et pas un localhost\... ?)
    Il n'existe pas de répertoire par défaut, getcwd vous renvoie le chemin complet correspondant au répertoire courant (appelé .) par rapport au script qui est exécuté.

    Un chemin de type c:\applications\easyphp1-8\www\monsite\ permet d'accéder à un fichier (inclue les répertoires) sur votre système de fichiers local. Une URL, http://localhost/monsite/ par exemple, est spécifique à un protocole (HTTP ici) et met en relation des informations ou documents avec celle-ci qui n'ont pas forcément de rapport direct avec votre système de fichiers.

    Comment passez-vous de PHP à MySQL précisément (avez-vous du code à nous montrer) ? Utilisez-vous des chemins relatifs (par rapport au répertoire courant) ou absolus (par rapport à la racine) ? Avez-vous éventuellement utilisé la fonction realpath afin de passer d'un chemin relatif à un chemin absolu ?

    PS : la documentation des requêtes LOAD DATA

  3. #3
    Membre éclairé
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 421
    Par défaut
    Merci déjà pour ces précisions.

    Comment passez-vous de PHP à MySQL précisément (avez-vous du code à nous montrer) ? Utilisez-vous des chemins relatifs (par rapport au répertoire courant) ou absolus (par rapport à la racine) ? Avez-vous éventuellement utilisé la fonction realpath afin de passer d'un chemin relatif à un chemin absolu ?
    J'ai pas vraiment de code intéressant à montrer puisque je ne sais justement pas si je dois mettre des chemins relatifs (relatifs à quoi surtout ?) ou absolus.
    En plus je bosse en local là, mais je dois livrer ce programme sur un serveur mutualisé alors je ne suis même pas sûr du comportement au final.
    Donc voilà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    //gestion du fichier de données
    $fic = 'clients_' . $date . '.csv';
     
    //echo "*** Répertoire racine : " . $_SERVER['DOCUMENT_ROOT'] . "<br>";
    //echo "*** Répertoire de travail : " . getcwd() . "<br>";
     
    $rep = getcwd();
    str_replace("\\", "/", $rep); // Unix -> Windows
     
    $repfic = $rep. '\\transferts\\' . $fic;
    //echo "*** $repfic<br>";
     
    if (!file_exists("$repfic"))
    {
    	//echo "<font color='red'>Le fichier $repfic n'existe pas !</font><br>";
    	//exit;
    }
     
    //connexion à la BD
    $link = mysql_connect('localhost', 'x', 'x') or die('Impossible de se connecter : ' . mysql_error());
     
    ...
     
    $charger = "LOAD DATA INFILE 'mabase/transferts/$fic' INTO TABLE customers FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n' (customer_number)";
    //echo "*** load : $charger<br>";
    mysql_query($charger) or rollback(mysql_error());
    echo "Fichier $fic chargé.<br>";
     
    ...
    Le LOAD DATA INFILE de ce code fonctionne uniquement car j'ai placé mon fichier CSV dans un sous-répertoire de C:\applications\EasyPHP1-8\mysql\data.
    Mais
    1) le responsable du site me dit qu'il n'a probablement pas les droits pour accéder à ces répertoires, mais uniquement aux répertoires de PHP (c:\applications\easyphp1-8\www\monsite\)
    2) de toutes façons je n'arrive pas à connaître ce chemin à partir de PHP. (cf. le file_exists que j'ai dû mettre en commentaire)


    Au final il faudrait juste que je sache quoi passer précisemment en paramètre du LOAD DATA INFILE pour que ça fonctionne avec un fichier accessible de PHP (donc dans c:\applications\easyphp1-8\www\monsite\), et sans que ça me vire les / du chemin...

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    J'ai créé la table suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- 
    -- Structure de la table `customers`
    -- 
     
    CREATE TABLE `customers` (
      `id` varchar(10) NOT NULL default '',
      `nom` varchar(80) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    J'ai créé le fichier CSV suivant (nommé clients_2007.csv) que j'ai placé dans le même répertoire que mon script (sinon adaptez le chemin) :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dupon00001;DUPONT
    tartan00001;TARTANPION

    J'ai écrit le script PHP suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $date = date('Y'); // A changer ?
    $fic = 'clients_' . $date . '.csv';
     
    mysql_connect('localhost', 'mon_login', 'mon_mdp') or die(mysql_error());
    mysql_select_db('ma_base') or die(mysql_error());
     
    $sql = sprintf('LOAD DATA INFILE "%s" INTO TABLE customers FIELDS TERMINATED BY ";" LINES TERMINATED BY "\n" (id,nom)', mysql_real_escape_string(realpath($fic)));
    mysql_query($sql) or die(mysql_error() . ' : ' . $sql);
     
    mysql_close();
    ?>
    J'obtiens bien dans ma table :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `customers` (`id`, `nom`) VALUES ('dupon00001', 'DUPONT');
    INSERT INTO `customers` (`id`, `nom`) VALUES ('tartan0000', 'TARTANPION');

    Le fichier doit exister (sinon vous n'aurez rien entre INFILE et INTO) et vous devez disposer du droit File (ne se fixe apparemment qu'au niveau de la base via la table user de la base mysql, sur les versions 4.1 tout du moins).

  5. #5
    Membre éclairé
    Avatar de Peanut
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 421
    Par défaut
    OK, la seule différence que je vois c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_real_escape_string(realpath($fic))
    (pourtant j'avais bien essayé de faire la même chose mais a la mano, pas avec des fonctions, donc j'ai peut-être raté un truc)

    J'essayerai de rajouter ça (j'ai pas d'accès en ce moment), merci.


    PS : j'ai également un soucis avec les droits FILE pour un utilisateur autre que root, mais c'est une autre histoire...

Discussions similaires

  1. Permettre "/" dans les noms de fichier
    Par rodj dans le forum Administration système
    Réponses: 10
    Dernier message: 23/08/2006, 09h44
  2. Paumé dans les relations
    Par spekal dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/08/2006, 14h55
  3. [BATCH] Espaces dans les noms de fichiers :|
    Par andlio dans le forum Windows
    Réponses: 1
    Dernier message: 03/08/2006, 03h42
  4. Réponses: 6
    Dernier message: 03/05/2006, 11h01
  5. Caractères transformés dans les chemins de fichier
    Par canabral dans le forum Langage
    Réponses: 4
    Dernier message: 15/12/2005, 15h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo