|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
Bonjour,
Je suis confronté à un problème qui me prend la tête et que je ne réussi pas à résoudre, j'espère donc trouver une réponse sur ce forum. Je veux insérer dans ma base de donnée un grand nombre de ligne (plus de 3000) venant d'un fichier texte. J'ai donc trouver le saint graal : LOAD DATA INFILE. Seulement, il y a des caractères spéciaux dans ce fichier, tel que "&" et et les simples quote, et lors de mes requêtes suivantes j'ai des messages d'erreurs (ben oui, le simple quote me ferme ma requête, car il n'a pas été échappé avec un antislash). Voici mon code actuel, qui fait bien l'ajout dans la table temp et qui permet de remplir les autres tables, mais dès que je rajoute la ligne commenter (celle du FIELDS ESCAPED BY), plus rien ne fonctionne (et pourtant je n'ai aucun message d'erreur). Code :
TheDeadMan |
||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
comment est crée le SITE_utf8.txt ?
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
C'est vrai que j'aurais du le préciser dans mon premier message.
Ce fichier est crée par SAP, suite à un requête SQL toute bête. En fait, le résultat s'affiche dans une fenêtre sous la forme d'une table, et la seule chose que l'on peut faire c'est "fichier/exporter", aucun réglage possible... D'ailleurs, ça me pose problème concernant l'encodage, SAP encodant le fichier en UTF-16... je suis obligé de passer par Notepad++ et de le convertir en UTF-8 (si quelqu'un à une solution automatisé en passant par Php, merci !) Voici les premières lignes du fichier : Code :
|
||
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
si t'as des caractère spéciaux dans ton CSV et que SAP ne les échappes pas, ca va être difficile puisque le CSV n'est pas valide
pour le charset utilise l'option CHARACTER SET
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
Hum, pour le character set, je fais "... INTO TABLE TEMP CHARACTER SET utf8" ? (je peux pas tester ce soir).
Par contre, pour les caractères spéciaux, je comprends pas, ce n'est justement pas le rôle du ESCAPED BY '\' d'échapper les caractères spéciaux s'il en trouve ? Sinon, il faudrait analyser le fichier caractère par caractère (ou ligne par ligne, mais la faut trouver les fonctions adéquates) et ajouter un / avant chaque caractère spéciaux. Peut être chercher du côté des regex ? |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Je pense plutôt que c'est pour spécifier comment les caractères ont été échappés dans le document original.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
00
|
|
|
#7 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
le caractère échappement c'est uniquement quand la chaine contient le séparateur de champs ou de lignes
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#8 | |
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
Ok, je l'avais pas compris comme ça... maintenant je comprends pourquoi ça fonctionné pas...
Je vais donc devoir passer par un autre moyen, que pensez-vous de mes propositions ? Ça prendra pas trop de temps ? Citation:
|
|
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
montre plutôt une ligne qui ne fonctionne pas,
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
Par exemple, avec la ligne :
Code :
1263 145 Décoration Maison d'autrefois 280439 LOT 4 HORLOGES MARGAUX N10 Code :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'autrefois' AND groupe_produit=groupe' at line 1' in /xxxxxx/xxxx/xxxxx/client_categories.php:76 Stack trace: #0 /homez.428/enescofr/enescofr/client_categories.php(76): PDO->query('SELECT num FROM...') #1 {main} thrown in /xxx/xxxx/xxxxx/client_categories.php on line 76 Mais ça je viens de comprendre, c'est parce que je passe la catégorie et la sous catégorie en Get, le & foire donc tout, il faut que je le transforme lors de l'affichage du lien (je pense qu'après la requête fonctionnera). Ce qui laisse le problème des quotes, quelles soit simple ou double (je crois avoir vu des doubles dans le fichier). Par ailleurs, totalement HS, j'ai des photos des articles qui doivent être affichés, et je voudrais créer des miniatures. J'ai bien un script qui fonctionne, mais déjà rien que pour redimensionner 5 images ça devait mettre 15sec, alors qu'en fait j'en ai autant que le nombre d'article à redimensionner, soit plus de 3000. Une idée ? |
|
|
00
|
|
|
#11 | |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
Sinon en php tu vas vite être limité par le temps limite autorisé pour ton script (à moins aussi de le faire en local auquel cas tu peux modifier ce paramètre assez facilement). Donc il faudra faire des petits lots de x photos et répéter ton script n fois. Si tu ne veux pas déclencher ton script manuellement (300 fois si tu fais des lots de 10 photos), tu pourras utiliser un cron.
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
Oui j'ai pensé à ça pour le faire la première fois sur les 3000 images, mais par la suite, le but est d'automatiser tout ça, donc quand il y aura 200 ou 300 nouvelles images il faudra passer par Php, et la ça va coincer quand même...
Sinon, personne a d'idée pour échapper ces *&ù$^* de caractères spéciaux ?
|
|
|
00
|
|
|
#13 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
normalement t'as pas besoin d’échapper les valeurs
t'as essayé avec un simple INSERT en requete préparée
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
Pourquoi j'aurais pas besoin d'échapper les valeurs ?
J'ai cette requête : Code :
SELECT num, description, life_cycle_code FROM categories, articles WHERE categories.groupe_produit = articles.groupe AND sub_cat='" . $_GET['sub_categories'] . "'; Code :
SELECT num, description, life_cycle_code FROM categories, articles WHERE categories.groupe_produit = articles.groupe AND sub_cat='Maison d'autrefois'; Avant l'arrêt du script au bout de 30sec, il n'avait rentré que 300 lignes je crois. Et je vois pas en quoi passer par un INSERT changera le problème du ' qui n'est pas échappé. |
|
|
00
|
|
|
#15 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
montre comment tu faisais avec tes 3000 lignes
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#16 | ||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
J'ai pas mal cherché, mais j'ai pas retrouvé.
C'était tellement lent j'ai pas du le garder ^^ En gros, ça faisait ça : Code :
Et c'est ultra lent ! |
||
|
|
00
|
|
|
#17 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
normale tu fais pas de requête préparée, et pour parsé du CSV c'est fgetcsv pas explode, de plus que le '\t' est faux, ça devait pas faire grand chose
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#18 | ||||
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
Le explode, c'est pas du tout ce que je faisait, mais je m'en rappelle plus.
Par contre je connaissais pas fgetcsv, merci ! Mais au final, la requête préparé elle va quand même gueuler sur le ' non ? EDIT : J'ai étudié le fgetcvs, j'ai même utilisé l'exemple : Code :
Code :
Parce que là, je vais mettre tout ça dans ma BDD, mais je le fais déjà actuellement ! Le problème, c'est lorsque l'utilisateur clique sur une sous catégories (elle son listé sur une page), ça affiche tous les produits de cette sous catégories, c'est lors de cette requête que ça plante. J'ai cette requête : Code :
SELECT num, description, life_cycle_code FROM categories, articles WHERE categories.groupe_produit = articles.groupe AND sub_cat='" . $_GET['sub_categories'] . "'; Code :
SELECT num, description, life_cycle_code FROM categories, articles WHERE categories.groupe_produit = articles.groupe AND sub_cat='Maison d'autrefois'; |
||||
|
|
00
|
|
|
#19 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
en requete préparé t'as pas besoin d’échappé les caractères, donc fait une requete préparée.
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#20 |
|
Invité de passage
![]() Inscription : mai 2011 Messages : 13 ![]() |
Bon ben juste après avoir posté mon message j'ai testé une requête préparé... et ça a fonctionné !
Merci beaucoup ! Mais maintenant j'ai un autre problème : Maintenant, le lien vers la sous catégorie "Maison d'autrefois" s'affiche sans problème, mais le lien en lui même n'est pas bon, en effet, les liens son créés ainsi : Code :
echo "<a href='client_categories.php?page=0&categories=" . $_GET['categories'] . "&sub_categories=" . $sub_cat . "&enter=yes' >" . $sub_cat . " (" . $rep_nombre->rowCount() . ")<a/> <br />"; Code :
http://localhost/client_categories.php?page=0&categories=D%E9coration&sub_categories=Maison%20d
Code :
http://localhost/client_categories.php?page=0&categories=D%E9coration&sub_categories=Chick%20&%20Fun&enter=yes
Comment faire ? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com