Re: [LA-discussions] PB php mysql

[ Thread Index | Date Index | More linuxarverne.org/discussions Archives ]


 jean-luc boutin wrote:
Bonsoir à tous,

pour bien commencer l'année je vous soumets un petit problème auquel je suis confronté.

je cherche à importer dans une table les données d'un fichier txt que je télécharge et dont le caractère séparateur de champs est "\".. Voici le script que j'utilise et qui marche parfaitement lorsque ce caractère est ";".


<?php
$serveur = mysql_connect("localhost","user","passwd");
if (!$serveur)
{
die('Non connecté : ' . mysql_error());
}

$db = mysql_select_db('competition', $serveur);
if (!$db)
{
die ('Impossible d\'utiliser la base : ' . mysql_error());
}

$sql = "LOAD DATA INFILE \"afifede.txt\" REPLACE INTO TABLE afifede FIELDS TERMINATED BY ';' IGNORE 1 LINES";
$result = mysql_query($sql);
if (!$result)
{
die ( 'Erreur' .mysql_error());
}
mysql_close();
?>

je n'ai par contre trouvé aucune solution lorsque ce caractère est l'antislash quoique ma requette fonctionne lorsque je passe par phpmyadmin. Je voudrais m'éviter l'étape qui consiste à modifier le caractère séparateur de champs dans le fichier afifede.txt .

Merci pour votre aide

jean-luc

---
Liste de discussions de LinuxArverne
http://wiki.linuxarverne.org/listes_de_diffusion

Bonsoir Jean-Luc

Ce qu'il aurait été intéressant de voir, c'est le code qui ne fonctionne pas, histoire qu'on évite de te le re-proposer... Il me semble que le caractère \ est utilisé comme caractère d'échappement dans les chaînes de caractères PHP et que par conséquent il faut le doubler lorsque tu veux en insérer un dans une chaîne :

$sql = "LOAD DATA INFILE \"afifede.txt\" REPLACE INTO TABLE afifede FIELDS TERMINATED BY '\\' IGNORE 1 LINES";

Par eilleurs il me semble que le séparateur de chaînes en SQL est l'apostrophe ("single-quote") donc je verrais plutôt :

$sql = "LOAD DATA INFILE 'afifede.txt' REPLACE INTO TABLE afifede FIELDS TERMINATED BY '\\' IGNORE 1 LINES";

Problème : il se peut que la fonction mysql_query fasse également de l'échappement avec le caractère \ ce qui obligerait à écrire plutôt ceci :

$sql = "LOAD DATA INFILE 'afifede.txt' REPLACE INTO TABLE afifede FIELDS TERMINATED BY '\\\\' IGNORE 1 LINES";

.... ce qui semble monstrueux mais n'est malheureusement pas inhabituel dans certains programmes où l'on multiplie les endroits où sont retraitées les chaînes de caractères. Voilà, n'étant pas sûr de mon coup j'ai multiplié les possibilités, mais je crois qu'il y a de bonnes chances pour que l'une d'entre elles soit la bonne... du moins je l'espère !

Je profite de ce message pour vous souhaiter plein de bonnes choses pour 2010, dans tous les domaines !
  =^.^=



---
Liste de discussions de LinuxArverne
http://wiki.linuxarverne.org/listes_de_diffusion


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/