PDO et LOAD DATA LOCAL INFILE ne fonctionne pas
J'ai juste essayé de CHARGER les DONNÉES de LOCL INFILE avec pdo. N'a pas fonctionné pour moi. Voici ma fonction
function connect($db_name,$db_host,$db_user,$db_pass)
{
try
{
$this->connect = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
$this->connect->exec("LOAD DATA LOCAL INFILE 'http://localhost/testoo.csv'
INTO TABLE 'parsed'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
('name','link','price','brand','imageurl')");
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
Pour l'instant rien ne se passe. La même requête fonctionne avec la normale mysql_query. Tous les pointeurs pour ce problème?
Avez-vous un message d'erreur? Avez-vous des rapports d'erreur est allumé?
Merci pour ça, attiré l'erreur maintenant! "PDO::exec() [pdo.exec]: LOAD DATA LOCAL INFILE interdit"
Un fichier à un serveur web n'est pas ce que j'avais à définir en tant que fichier local... est-il vraiment travailler avec l'héritage de l'extension?
si c'est une vis de php... il suffit d'exécuter le formulaire de requête du client CLI... vite fait bien fait. 🙂
Merci pour ça, attiré l'erreur maintenant! "PDO::exec() [pdo.exec]: LOAD DATA LOCAL INFILE interdit"
Un fichier à un serveur web n'est pas ce que j'avais à définir en tant que fichier local... est-il vraiment travailler avec l'héritage de l'extension?
<?php $server = "localhost"; $benutzername = "root"; $passwort = ""; $datenbank = "zanox"; mysql_connect($server,$benutzername,$passwort) or die ("No Connection"); mysql_select_db($datenbank) or die ("No Database found!"); // Datenbankanweisung $sql = "LOAD DATA LOCAL INFILE 'http://localhost/test1.csv' INTO TABLE de FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' (name,link,price,brand,imageurl)"; $db = mysql_query($sql) or die (mysql_error()); ?>
c'est mon ancien code. Ça marchait très biensi c'est une vis de php... il suffit d'exécuter le formulaire de requête du client CLI... vite fait bien fait. 🙂
OriginalL'auteur Johnny000 | 2012-11-19
Vous devez vous connecter pour publier un commentaire.
2019 Modifier
7 ans plus tard Sammitch ici pour vous dire que ma réponse est brut. Je ne peux même pas comprendre ce que le diable, je parlais avec "
fgetcsv()
de l'utilisation des ressources". Il est possible que il y a 7 ans PHP manquait un peu de l'OI flux optimisations qui est d'aujourd'hui, mais je suis prêt à être qu'il était de contraintes de ressources, sans rapport avec PHP.Jay Dhameliya la réponse ci-dessous est probablement la façon dont vous voulez aller.
LOAD DATA INFILE
devrait blast les données directement dans mySQL aussi vite que possible.Par souci d'exhaustivité, en supposant qu'il n'y est quelque chose de prévention de la consommation de
LOAD DATA INFILE
[comme l'énorme trou de sécurité a récemment découvert] et que vous voulez charger efficacement de données à partir d'un fichier, vous aurez probablement envie de l'effet de levier des opérations par lots IO index et de l'écrit. Par exemple:Avoir tout groupées en une seule transaction est toujours une partie de la raison avec
LOAD DATA INFILE
est si rapide, ainsi que probablement une grande partie de @Benjamin suggestion de l'utilisation des insertions étendues.Original Brut Réponse
Alternative: Utiliser
fgetcsv()
et de créer les inserts de la programmation.edit:
Pour éviter l'utilisation de la ressource de problèmes avec
fgetcsv()
[parce qu'il essaie de lire le fichier en entier à la fois] vous pouvez créer une boucle similaire à ci-dessous pour lire/insérer des morceaux gérables.De cette façon seulement
$chunksize
lignes sont conservés en mémoire à un moment donné.Vous aurez probablement besoin de plus de code pour gérer les choses comme encapsulé chaînes contenant des virgules et des sauts de ligne, mais si vous ne pouvez pas obtenir
LOAD DATA LOCAL INFILE
de travail je ne vois pas beaucoup d'autres choix.C'est parce qu'elle va d'abord essayer de charger tous les 80 MO en RAM. Double-alternative est d'utiliser
fgets()
pour charger X lignes, créer/exécuter inserts, répétez jusqu'à ce que les expressions du FOLKLORE.Mise à jour de ma réponse avec un peu de code sur le dessus de ma tête.
Ce seront toujours moyen de ralentir. Je dois faire une périodiquement à l'importation d'un fichier CSV avec 3.000.000+ lignes. Ma première tentative avec une boucle foreach et
fgets()
prendrait toute la nuit, alors queLOAD DATA LOCAL
obtient le travail fait en quelques minutes.Vous pourriez être surpris par les résultats de référence, ce qui est ce que j'ai fait dans le lien ci-dessus! Insertions étendues sera toujours beaucoup plus rapide. Et je n'ai utiliser une transaction et non émulé déclarations préparées à l'avance dans tous les cas!
OriginalL'auteur Sammitch
Attribut de jeu
PDO::MYSQL_ATTR_LOCAL_INFILE
AOP options de connexion:Je suggère également la lecture de cette réponse en liaison avec la ci-dessus pour aider à comprendre la configuration nécessaire: stackoverflow.com/questions/6017032/...
OriginalL'auteur Jay Dhameliya
J'ai eu le même problème. Mon serveur MySQL a le droit local-infile conf,
PHP/PDO
avait le droitPDO::MYSQL_ATTR_LOCAL_INFILE
conf trop.La solution a été de (ré)installer php5-mysqlnd.
...et cela a fonctionné 🙂
A travaillé pour moi aussi! merci! +1
OriginalL'auteur Marc Necker