2010-04-30 5 views
2

J'essaie de lire dans une série de fichiers texte délimité par des tabulations dans des tables MySQL existantes. Le code que j'ai est assez simple:Lire le fichier texte délimité par tabulation dans la table MySQL avec PHP

$lines = file("import/file_to_import.txt"); 

foreach ($lines as $line_num => $line) { 
    if($line_num > 1) { 
     $arr = explode("\t", $line); 
     $sql = sprintf("INSERT INTO my_table VALUES('%s', '%s', '%s', %s, %s);", trim((string)$arr[0]), trim((string)$arr[1]), trim((string)$arr[2]), trim((string)$arr[3]), trim((string)$arr[4])); 
     mysql_query($sql, $database) or die(mysql_error()); 
    } 
} 

Mais peu importe ce que je fais (d'où la coulée avant chaque variable dans l'instruction sprintf) je reçois le « Vous avez une erreur dans votre syntaxe SQL, vérifiez le manuel correspond à la version de votre serveur MySQL pour la bonne syntaxe à utiliser près de '' à la ligne 1 "erreur.

Je fais écho au code, je le colle dans un éditeur MySQL et ça marche bien, ça ne s'exécutera pas à partir du script PHP.

Qu'est-ce que je fais mal ??

Si

MISE À JOUR: Voici le echoe'd SQL de:

INSERT INTO wheelbase (WheelBaseCode, LanguageCode, WheelBaseDescription) VALUES ('A1', 'GBEN', '2.50-2.99m') 
INSERT INTO wheelbase (WheelBaseCode, LanguageCode, WheelBaseDescription) VALUES ('A2', 'GBEN', '3.00-3.49m') 
INSERT INTO wheelbase (WheelBaseCode, LanguageCode, WheelBaseDescription) VALUES ('A3', 'GBEN', '3.50-3.99m') 
INSERT INTO wheelbase (WheelBaseCode, LanguageCode, WheelBaseDescription) VALUES ('A4', 'GBEN', '4.00-4.49m') 

Fait intéressant, j'ai maintenant créer le nombre correct de lignes dans la table, mais les valeurs qu'il insère sont vides.

Cela peut-il être un problème d'encodage dans le fichier texte source?

Répondre

2

Vous n'avez pas besoin de la chaîne de caractères, les données seront déjà des chaînes.

Assurez-vous qu'il n'y a pas de guillemets dans les données du fichier. Écho de la chaîne SQL avant de l'exécuter pour voir s'il y a quelque chose qui ne va pas.

Modifier le SQL:

"INSERT INTO my_table (`field1Name`, `field2Name`, `field3Name`, `field4Name`, `field5Name`) VALUES('%s', '%s', '%s', '%s', '%s');" 

Ce changement inclut les noms de champs, et citant les deux dernières valeurs.

+0

Je sais que je n'ai pas besoin de la fonte, c'était là juste pour m'assurer que je ne deviendrais pas fou. Votre code devrait fonctionner aussi bien que le mien, mais ce n'est pas le cas. Je n'ai pas besoin de spécifier les noms de champs car j'insère dans les cinq champs (donc je peux juste faire INSERT INTO my_table VALUES). En outre, les deux derniers sont de type DOUBLE, pas VARCHAR. Il n'y a pas de guillemets dans les données, et même si je ne traite que les premières lignes, je reçois toujours l'erreur. –

+1

Eh bien, renvoyez les requêtes avant de les exécuter. Ajoutez-les à votre question. –

+0

Avez mis à jour le poste avec le SQL –

0

Je n'aime pas votre méthode en général. Peut-être que vous corrigez votre "premier" problème avec les lignes manquantes. Quel est le caractère spécial comme '' backslash ou injection SQL? Je pense que vous devriez utiliser des instructions préparées que PDO fournit et appelez le "bindValue" de l'instruction.Il est une bibliothèque PHP stable et buildin.Vous pouvez également utiliser dbTube. org à la place qui est un outil d'importation graphique

voeux

Shutter

0

de PHP.net.

<?php 
    fputcsv($fp, $foo, "\t"); 
?> 

vous avez juste oublié que les guillemets simples sont littéraux ... ce qui signifie que tout ce qui sortira sera \t serait \t parce que \ dans ce cas serait seulement utilisé pour échapper mais si vous utilisez des guillemets alors cela fonctionnerait .

+0

Attendez, des guillemets simples entre guillemets doubles? –

Questions connexes