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

PHP & Base de données Discussion :

LOAD DATA INFILE


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut LOAD DATA INFILE
    Bonjour cher développeur !

    J'utilise actuellement ce script pour charger mes données en vitesse éclaire ..

    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
    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
    <?php
    $host ='mysql4.000webhost.com'; //database location
    $user ='xxxxxxxxxxx'; //database username
    $pass ='xxxxxxxxxxx'; //database password
    $db ='xxxxxxxxxxx'; //database name
     $monde=$_GET['monde'];
    $link_stats=mysql_connect($host, $user, $pass) or die ('Erreur : '.mysql_error());
    mysql_select_db($db) or die ('Erreur : '.mysql_error());
     
     
    $monde_database ='alpha'; //database name
    $nom_url_fichiers = array(  
    					array(  'Index' => "fichier1", 
    							'Nom_Table' => "alliances_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/alliances.txt" 
    					),
    					array(  'Index' => "fichier2", 
    							'Nom_Table' => "towns_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/towns.txt" 
    					),   
    					array(  'Index' => "fichier3", 
    							'Nom_Table' => "players_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/players.txt" 
    					),
    					array(  'Index' => "fichier4", 
    							'Nom_Table' => "conquers",
    							'Url_Fichier' => "../mondes/$monde/data/conquers.txt"
    					),   
    					array(  'Index' => "fichier5", 
    							'Nom_Table' => "player_kills_att_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/player_kills_att.txt" 
    					),   
    					array(  'Index' => "fichier6", 
    							'Nom_Table' => "player_kills_def_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/player_kills_def.txt" 
    					),
    					array(  'Index' => "fichier7", 
    							'Nom_Table' => "player_kills_all_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/player_kills_all.txt"
    					),   
    					array(  'Index' => "fichier8", 
    							'Nom_Table' => "alliance_kills_att_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/alliance_kills_att.txt" 
    					),   
    					array(  'Index' => "fichier9", 
    							'Nom_Table' => "alliance_kills_def_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/alliance_kills_def.txt" 
    					),
    					array(  'Index' => "fichier10", 
    							'Nom_Table' => "alliance_kills_all_$monde_database",
    							'Url_Fichier' => "../mondes/$monde/data/alliance_kills_all.txt"
    					),   
    					);
     
     
    foreach( $nom_url_fichiers as $fichiers ) {	
    		$urlfichier = $fichiers['Url_Fichier'];
    		$nomtable = $fichiers['Nom_Table'];
    		mysql_query("TRUNCATE TABLE $nomtable");
    		$sql = "LOAD DATA INFILE '$urlfichier' INTO TABLE $nomtable FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\n'";
    		mysql_query($sql, $link_stats) or die('non mis à jour'.mysql_error());
    		}
     
    		echo ' Rendez-vous dans 1 h pour la prochaine MAJ !';
    Ceci marche très très bien sur mon local .. mais m'affiche sur mon hébergeur :
    non mis à jourAccess denied for user 'axxxxxx_gt'@'10.1.1.17' (using password: YES)
    Je ne comprends pas vu que les données de connexion sont exactes (j'ai vérifié 10 fois ^^)

    De plus, je voudrais savoir comment ajouter sur chaque ROW un 'ALPHA' ... qui correspondra au monde ...

    MERCI D'AVANCE !

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Par défaut
    Certainement un manque des droits nécessaires sur la base de ton utilisateur

  3. #3
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    A moment (dans la boucle) il y a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("TRUNCATE TABLE $nomtable");
    Puis après cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query($sql, $link_stats)
    Essai de rajouter la ressource de la connexion au 1er :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("TRUNCATE TABLE $nomtable", $link_stats);

    Sinon, rajoute des mysql_error() pour savoir quelle est la ligne de code et fonction qui génère cette erreur.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    Merci pour vos réponses !

    Ça bloque là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query("TRUNCATE TABLE $nomtable", $link_stats);
    Dès que je remplace LOAD DATA INFILE, ça marche --'

    Va falloir qu'on trouve ^^ Je sors le site bientôt

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Je ne vois pas trop.

    Est tu certain que lors de la boucle toutes les tables existent ?
    Faire un "truncate table toto" alors que "toto" n'existerait pas pourrait expliquer le problème.


    Ceci dit, ça a l'air d'être lié à un problème de droit.
    Peut être que tu n'as pas les droits suffisants pour exécuter un "truncate table" (juste des droits pour des insert, update, delete).
    Essai de voir avec un SHOW PRIVILEGES.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    J'ai l'impression que c'est le INFILE qu'il n'accepte pas ....

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    C'est bien ça !

    Il suffit de rechercher "accès denied LOAD DATA INFILE" pour comprendre que c'est une histoire de droit

    Vous avez une autre solution ? Vous qui avez toujours des idées de génie

  8. #8
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Vous avez une autre solution ?
    Si MySQL attend un chemin physique absolu, il n'y pas d'autres solutions que de lui fournir ce type de chemin (sinon, ça restera toujours hasardeux).

    Utilise des fonction (Php) comme dirname(), realpath() pour obtenir ce chemin physique.

    Le mieux est de définir une seule fois (et une bonne fois pour toute) le chemin physique où se trouve le serveur Web (le www) dans une variable ou une constante.
    Après ça il suffit de l'exploiter partout où cela est nécessaire.

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    Mon hébergeur vient de me dire que la fonction était autorisée

    J'ai mis des die partout et j'ai trouvé la ligne à erreur ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mysql_query($sql,$link_stats) or die('non mis à jour3'.mysql_error());

  10. #10
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Si cette erreur concerne LOAD DATA INFILE, fait en sorte de savoir si le fichier existe bien.
    Est-ce qu'il n'y aurait pas des restrictions sur ces fichiers ? Quel est leur CHMOD ?
    Utilises tu un chemin physique absolu (donc complet) comme dit précédemment ?
    Fais une alternative avec file_exists() par exemple.

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    Tu as raison ! C'est bien le path qui est faux !

    Je viens de tester chez moi le LOAD DATA INFILE qui me renvoyait directement à la root mysql contrairement au LOAD DATA LOCAL INFILE qui marche parfaitement (mais désactivé sur mon hébergeur ...)

    Chez moi, j'ai dû faire cela pour que ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "".$_SERVER['DOCUMENT_ROOT']."/stats/mondes/$monde/data/alliances.txt"
    Mais du coup, comment faire sur mon hébergeur mutualisé ?

  12. #12
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Je ne suis pas totalement convaincu que ça ne marcherait pas sur ton hébergeur.

    Fais des essai le plus basique qui possible, pour justement éviter toutes sortes de problème annexes.

    Créer par exemple une table genre "toto" (en local et serveur), avec un champ auto_increment genre "id_toto" et un autre champ "truc".
    Puis créer un fichier à importer genre toto.sql" avec une requête comme :
    INSERT INTO toto (truc) VALUE ('machin');
    Place le à la racine du serveur Web (généralement c'est www, ou phpdoc, public, etc ...).

    Puis pour les chemins, mets les "en dur". Tu dois les connaitre.
    La racine du serveur Web en local si tu est sur Windows devrait être du genre :
    C:/wamp/www/toto.sql
    Coté serveur c'est du genre : (ton hébergeur a dû te fournir ce chemin).
    /home/le_domaine/www/toto.sql
    Si tu ne le connais pas, suffit de créer un fichier Php à la racine du serveur Web (genre racine.php) avec ce code et pointer sur celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    echo 'Chemin phyqique : '.realpath('racine.php');
    ?>
    Puis exploiter ce chemin "en dur" dans le code SQL.


    Tout ça pour être certain que le chemin soit le bon, requête valide, etc ...
    Donc de faire des essai avec LOAD DATA INFILE et avec LOAD LOCAL INFILE.
    Puis espérer qu'une des 2 passe coté serveur.

    Théoriquement il ne faut pas utiliser LOCAL.
    Ca marche en local car MySQL/Php/Apache sont tous installés sur la même machine (localhost) et de plus tous les droits..
    Normalement LOAD DATA INFILE devrait fonctionner car lié au domaine (host), d'autant plus que ton hébergeur n'aurait pas mis de restriction la dessus.


    Cependant, et à tout hasard, fait des essais avec PDO ou/et MySQLi qui sont plus récents.
    Pour ma part les fonctions mysql_*, etc ..., c'est obsolète, car elle est juste maintenue, elle n'évolue plus, vouée même à disparaitre.
    Mais là sous réserve, pas sûr que ça soit lié à ça.

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut
    Merci pour ta réponse !

    On va trouver ! Je sais que c'est possible, les opérateurs affirment que ça marche ^^

    Voilà le code (ne marche pas encore ^^)

    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
    <?php
    require ('database_site.php');
     
    $nom_url_fichiers = array(  
    					array(  'Index' => "fichier1", 
    							'Nom_Table' => "ALPHA_alliances",
    							'Url_Fichier' => "/home/a6536850/public_html/fr/stats/cron/alliances.txt"
    					),
    					);
     
     
    foreach( $nom_url_fichiers as $fichiers ) {	
    		$urlfichier = $fichiers['Url_Fichier'] or die('non mis à jour1'.mysql_error());
    		$nomtable = $fichiers['Nom_Table'] or die('non mis à jour2'.mysql_error());
    		mysql_query("TRUNCATE TABLE $nomtable") or die('non mis à jour3'.mysql_error());
    		$sql = "LOAD DATA INFILE '$urlfichier' INTO TABLE $nomtable FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\n'" or die('non mis à jour4'.mysql_error());
            mysql_query($sql, $link_stats) or die('Problème avec LOAD DATA LOCAL INFILE</br></br>'.mysql_error());
    		}
     
    		echo ' Rendez-vous dans 1 h pour la prochaine MAJ !';
     
     
    		?>
    J'ai exprès modifié le nom de la table, et il m'a dit quelle n'existait pas ==> ça se connecte bien ^^


    Courage ! On va trouver !

  14. #14
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Pourquoi ne fais tu pas des essai plus basiques, histoire de savoir ce qui peu fonctionner ?

    C'est quand même absurde voir délirant d'avoir un retour d'erreur disant que la table n'existe pas alors qu'ici la seule et unique chose qu'on souhaite savoir c'est quel est le type de requête qui fonctionnerait.
    Tu te mets des bâtons dans les roues.

    Le minimum syndical serait mettre un chemin physique absolu 100% valide vers un fichier (txt ou sql) qui existe et qui se trouve là où on pointe, et que dans ce fichier on exécute un code SQL 100% valide c'est à dire qui ne provoquera pas d'erreur.
    Au final 1 seule requête SQL suffit.

    C'est possible de faire ça ?


    Quelque chose comme ceci suffirait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    require ('database_site.php');
     
    $fichier = '/home/a6536850/public_html/fr/stats/cron/alliances.txt';
    $sql = "LOAD DATA INFILE '$fichier' INTO TABLE ALPHA_alliances FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\n'" or die('Erreur : '.mysql_error($link_stats));
    mysql_query($sql, $link_stats);
    En partant du principe que le contenu (le code) dans ce fichier alliances.txt soit en phase avec les options (TERMINATED BY, etc ...).



    Pour ma part, créer un tableau pour après boucler on s'en fiche pas mal.
    Faire une 1er requête comme TRUNCATE, ça aussi on s'en fiche vraiment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $urlfichier = $fichiers['Url_Fichier'] or die('non mis à jour1'.mysql_error());
    $nomtable = $fichiers['Nom_Table'] or die('non mis à jour2'.mysql_error());
    Ces 2 codes ne servent à rien car illogiques.
    Si l'élément du tableau "Url_Fichier" provoque une erreur ça na va pas provoquer une erreur coté MySQL mais une erreur de Php.
    Appeler mysql_error() ici n'a pas de sens.

    Si le but est de tester la présence du fichier dont le chemin est contenu dans "Url_Fichier", ça se fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (file_exists($fichiers['Url_Fichier'])) {
        // Fichier existe
    }
    else {
        // Fichier existe pas
    }

Discussions similaires

  1. [LOAD DATA INFILE] clé auto incrémentés
    Par ashurai dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/02/2006, 17h17
  2. Réponses: 5
    Dernier message: 18/04/2005, 12h38
  3. probleme avec "LOAD DATA INFILE" et les b
    Par Koo dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/07/2004, 09h37
  4. Problème avec LOAD DATA INFILE
    Par ka0z dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 04/06/2004, 14h59
  5. petit soucis lors d'un LOAD DATA INFILE
    Par Jovial dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 04/06/2004, 11h58

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