• 締切済み

LOAD DATA LOCAL INFILE

LOAD DATA LOCAL INFILE を使ってmysql にcsv からデータを挿入したいのですが #1148 - The used command is not allowed with this MySQL version とエラーが出てきます。※エラー情報はmyphpadminから得ています。 以下の文を実行しています。 ※他のサーバーで動いているので、ソースに間違いはないと思います。 ※サーバーの引っ越しで出てきた不具合ですが、以前何かをしたかは覚えていません。。。 LOAD DATA LOCAL INFILE '/パス/data.txt' REPLACE INTO TABLE data fields terminated by ',' ENCLOSED BY '"' LINES TERMINATED BY ' ' 権限を付与すれば良い、と言う記事を読んだのですが 具体的にはどのような事をしたらいいのでしょうか? FTPでファイルをアップロードして、php を実行しています。 MySQL 5.1.73 PHP 5.3.3 よろしくお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数1

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

ごめんなさい、ちょっと検証できてないんだけど $sql_txt = <<<EOF LOAD DATA LOCAL INFILE %s INTO TABLE `%s` fields terminated by ',' enclosed by '"' LINES TERMINATED BY '\n' EOF; としているところ $sql_txtに投入する際「\n」が展開されてないですか? LINES TERMINATED BY '\\n' としてみてはどうでしょう? (SQL文として\nという文字列にするので・・・)

kiyomidesuyo
質問者

お礼

お礼遅くなりました! 試行錯誤に時間が掛かってしまいました。 どうしても「PDO」ではうまく動いてくれませんでした。 そして、このような記事を読み「PDO」をあきらめました。 ※PHPのバージョンを5.4.19に上げると解決したとありましたが、  新たな問題が出てきそうなので、その案はあきらめました。 http://oshiete.goo.ne.jp/qa/8498457.html?from=history 以下の方法で解決いたしました。 my.cnf の設定変更 「enable-local-infile」を有効に $strimport = 'mysqlimport --fields-terminated-by="," --fields-enclosed-by="\"" -L --host=localhost --user=ユーザ名 --password=パスワード データベース名 /var/www/・・・・フルパス/ファイル名.csv'; system($strimport); 色々なご提案、ありがとうございました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

mysql_関数を利用している時点で、かなりの不利があります。 ある日いきなり使えなくなるリスクがあることを留意してください。 http://webtech.seesaa.net/article/106290358.html あたりにmysqlimportコマンドをsystem()関数あたりで実行する方法が挙げられています つまりmysql_関数では処理が難しいということでしょう。

kiyomidesuyo
質問者

補足

yamabe様に挙げてもらったページなどを読んでいるうちに PDOで接続しないと、リスクがあるのかなと思うようになりました。 そこで以下の様にいたしましたが、まだ同じエラーが出ます。 何度も申し訳ございませんが、よろしくお願いいたします。 -------------------------------------------------------- $dsn = 'mysql:dbname=データベース名;host=localhost;charset=utf8'; $user = 'ユーザ名'; $password = 'パスワード'; $option = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_LOCAL_INFILE => true , ); try{ $pdo = new PDO($dsn, $user, $password, $option); $sql_txt = <<<EOF LOAD DATA LOCAL INFILE %s INTO TABLE `%s` fields terminated by ',' enclosed by '"' LINES TERMINATED BY '\n' EOF; $table= 'data'; $file="/パス/data.txt"; $sql = sprintf($sql_txt , $pdo->quote($file), $table); //SQL文を見たいので print $sql; $stmt = $pdo->query($sql); echo "完了"; }catch(Exception $e) { echo 'エラー:', $e->getMessage(); } -------------------------------------------------------- 以下、表示部分 LOAD DATA LOCAL INFILE '/パス/data.txt' INTO TABLE `data` fields terminated by ',' enclosed by '"' LINES TERMINATED BY ' ' エラー:SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not allowed with this MySQL version

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

PDOで処理しているなら、MYSQL_ATTR_LOCAL_INFILEを設定してください http://php.net/manual/ja/ref.pdo-mysql.php

kiyomidesuyo
質問者

補足

早速回答していただきありがとうございます。 PDO は利用しておりません。 以下の様に接続しております、よろしくお願いいたします。 require("../dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); mysql_query('set character set utf8');

関連するQ&A

  • LOAD DATA INFILE でエラー起きてデータを一括してロードできません。

    はじめまして。 質問があります。 現在WindowsXP Home、MySQL5.0.27を使用しているのですが、 テキストファイルのデータを一括でDBにロードしようとすると、 エラーが起きてしまいます。 ------------------------ Demo01.txt -------------------------- 1,あああ 2,いいい 3,ううう ------------------------ Demo01.sql --------------------------- create table test ( no integer not null, name varchar(30), primary key(no) )type=InnoDB; ---------------------------------------------------------------- mysql> load data low_priority infile 'C:/Demo01.txt' -> replace -> into table test -> fields terminated by ',' -> lines terminated by '/r/n' -> escaped by '\\'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use : 'escaped by '\\'' 付近: 6 行目 ---------------------------------------------------------------- 上記のようなエラーが出てしまいますので、試しにescaped by '\\' を削除して実行すると、 ---------------------------------------------------------------- Query OK, 1 row affected (0.09 sec) レコード数: 1 削除: 0 Skipped: 0 Warnings: 0 ---------------------------------------------------------------- と表示され1行しかロードできません。どうしたら全行をロードするこ とができるのでしょうか?どうかご教授お願いします。

    • ベストアンサー
    • MySQL
  • LOAD DATE INFILE で Bit(1)型の列にTrueを入れる際に何故かwarningが出る

    MySQLサーバにLOAD DATA INFILEコマンドを使ってファイルを読み込む時,なぜかBit(1)型の列にTrueを入れる際にWarningが無くなりません. オプションには FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' を選択して "列1","列2","列3"\r\n の形式で読み込んでいます. この時,Bit(1)型の列にFalseを入れるときには"\0"や"\n",""のような値を入れれば問題なくFalseとなるのですが,逆に他の何を入れてもwarningの発行とともにTrueになり,(Trueが入る事ではなく,warningの発行の方に)困っております. 何方か,warningを出さずにtrueを入力する方法を教えて頂けませんでしょうか. 宜しくお願いします.

  • LOAD DATA INFILE の使用について

    サーバにある、CSVファイルをデータベース(mysql)に登録したいです。 $query = "LOAD DATA INFILE '[ファイル名]' INTO TABLE [テーブル名] FIELDS TERMINATED BY ','"; を $result = mysql_query($query); として実行すると、 Access denied for user 'user'@'%' (using password: YES) というエラーになります。 色々検索すると、ユーザーはrootユーザーでないといけない・・・というのを見かけたのですが・・・ 普通のユーザーではLOAD DATA INFILEを使用できませんか? 私は、レンタルサーバを使用していて、レンタルサーバ上からしかユーザーを追加できません。 この場合、LOAD DATA INFILE~ は使用できないのでしょうか? また、もし使用できない場合、代替手段はあるのでしょうか?

    • ベストアンサー
    • PHP
  • phpMyAdminでのデータのインポートについて

    はじめまして。 レンタルサーバーで、MySQLを利用しています。 利用しているレンタルサーバーは、TELNETなどは利用できず、MySQLのデータベースを管理するのに、phpMyAdminを利用するようになっています。 用意したCSVファイルをサーバーのデータベースにインポートしたら、csvファイルが2MBを超えており、phpMyAdminの管理画面のインポートからは、2MB以内に分割しないとアップできませんでした。 分割するのが面倒なので、1回でインポートできないかと思い調べたら、 SQLで、LOAD DATA INFILE でインポートできないかと思い試してみました。 最初は、LOCALというのを入れずにやったらエラーが出たのですが、これは、同じサーバーにアップされたファイルからインポートというこなので、権限がないので無理ということがわかりました。 そこで、LOCALをつけて試しました。 ●試したSQLの内容 LOAD DATA LOCAL INFILE 'c:\mihon.txt' REPLACE INTO TABLE test FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; 上記をphpMyAdminのSQLのとろこで、実行したのですが、エラーなどは表示されずに完了するのですが、データはインポートされていませんでした。 レンタルサーバーで、phpMyAdminを利用している場合に、LOAD DATA INFILEでファイルをインポートできないのでしょうか?上記のSQLの書き方に問題があるのでしょうか? 初心者なのであまりうまく説明できませんが、大容量のCSVファイルをphpMyAdminからアップするには、なにかよい方法はありますでしょうか? ご回答よろしくお願い致します。 ●サーバーの環境 ・MySQL利用可能で、phpMyAdminでのみ利用可能 ・データベースは、ユーザーサーバーとは別に設置 ・MySQLのバージョンは、4.0.26 ・phpMyAdminのバージョンは、2.7.0

  • MySQLのLOAD DATAに関して

    MySQLのLOAD DATAで、固定長行フォーマットのファイルのロードを行っています。 その際、以下のような現象の原因がわからず困っています。 データをロードするテーブル、ロードファイル、実行コマンドは以下になります。 -------------------- テーブル -------------------- フィールド1 char(2) フィールド2 char(2) -------------------- ロードファイル(テキストファイル) -------------------- 1020 3040 -------------------- 実行コマンド -------------------- LOAD DATA INFILE 'ロードファイル' INTO TABLE テーブル FIELDS TERMINATED BY '' ENCLOSED BY '' LINES TERMINATED BY '\r\n'; 結果は以下のように、フィールド2にはデータが登録されていません。 ------------- フィールド1  | フィールド2 ------------- 10      |  30      |  望んでいる結果は以下のような結果です。 ------------- フィールド1 | フィールド2 ------------- 10     |20  30     |40  いろいろ試してみたのですが、 どうもchar(2)の場合は2バイトの倍の4バイト、 char(4)バイトの場合は倍の8バイトというふうにデータが区切られるため、 フィールド1のデータを取得する際に4バイト取得してしまっており、 フィールド2の分のデータが取得できません。 どこに不備があるのかわからないのですが、 何か原因の検討がつく方がいたら、ご回答よろしくお願いします。

    • ベストアンサー
    • MySQL
  • BAT処理でCSVデータのインポート

    よろしくお願いしますm(__)m 昨日から調べて作ってみたのですがうまく動かず、 MYSQLが強制終了してしまうこともありました(T_T) 疲れました・・・ ※test.batに以下の内容を書きました c:\mysql\bin\mysql -u **** -p**** < test.sql ※test.sqlに以下の内容を書きました LOAD DATA INFILE "c:\mysql\test.csv" INTO TABLE 商品管理.商品単品 FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY "" ESCAPED BY "\\" LINES STARTING BY "" TERMINATED BY "\n" ※test.csvはカンマ区切りになっています。 ファイルは【test.bat】【test.sql】【test.csv】とも c:\mysqlに置いています。 この状態でtest.batを実行するとDOS窓が一瞬現れて消えて しまいます。 間違っているところやヒントなどあれば教えてくださいm(__)m

    • ベストアンサー
    • MySQL
  • exec関数の中に変数を入れたい

    CSVファイル(kabu.csv)をmysqlに記録すべく下記のPHPを組みました。 PHPのexec関数の中で、MySQLを動作させます。 下記でPHPファイルと同じ階層にあるkabu.csvをMySQLにインサートすることが可能でした。 <?php try { $con = new PDO("mysql:host=127.0.0.1;dbname=db", "root", "password", array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1)); $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $con->exec('load data local infile \'kabu.csv\' IGNORE INTO TABLE photo_in fields terminated by \',\' enclosed by \'"\' escaped by \'"\''); } catch (PDOException $e) { echo $e->getMessage(); } ?> ********************************************************************************* 次に、 \'kabu.csv\'を外に出しました。($file = 'kabu.csv';) (将来的にこのkabu.csvはクエリーと連動して名前をが変わるようにする予定です。) ********************************************************************************** <?php $file = 'kabu.csv'; try { $con = new PDO("mysql:host=127.0.0.1;dbname=db", "root", "password", array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1)); $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $con->exec('LOAD DATA LOCAL INFILE $file IGNORE INTO TABLE photo_in fields terminated by \',\' enclosed by \'"\' escaped by \'"\''); } catch (PDOException $e) { echo $e->getMessage(); } ?> 単純に \'kabu.csv\'を$fileに置き換えただけではうまく動作しません。(MySQLに入力されません) どのように記載すれば、作動するでしょうか? 初歩的な質問かと思いますが、よろしくお願いいたします。 環境はCentOS 6.6 + MySQL5.6 です。エラーは下記となります。  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 '$file IGNORE INTO TABLE photo_in fields terminated by ',' enclosed by '"' escape' at line 1

    • 締切済み
    • PHP
  • LOAD DATA INFILE がどうしても出来ません。。

    PHP 4.4.8 MYSQL 4.0.27 で、HTMLはEUC MYSQLもEUCで運用しています。 PHPの中に以下のように動作させようとしています。 $sql = "LOAD DATA INFILE 'data.txt' INTO TABLE test FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'"; エラーを表示させるために $rst = mysql_query($query) or die("<b>A fatal MySQL error occured</b>.\n<br />Query: " . $query . "<br />\nError: (" . mysql_errno() . ") " . mysql_error()); すると A fatal MySQL error occured. Query: Error: (1065) Query was empty このような表示が出てきます。 テーブルはフィールド2つで両方とも varchar(100) にしています。 タブ区切り、改行はCRLFです。 こうしておいた方が、ミスが特定しやすいと思って。 11 1111 22 2222 phpmyadmin からは、load 出来ます。*フィールドの区切りを【\t】に変更するだけで。 同じディレクトリに上記PHPを書いたファイルと読み込ませる【data.txt】を置いています。 **同じMYSQL 同じディレクトリで表示やselect は出来るのでパスワードなどのミスでは無いようです。 やりたい事は、毎月10万レコード程度を入力したいのですが、 phpmyadmin からの操作ではなく、PHPで処理をしたいのです。 多分、そんなに難しい事ではないので 過去ログを見ても、本屋さんで探しても詳しく解説していなくて 私の間違いが、特定出来ません。 どなたかご教授いただけるととてもありがたいです。m(__)m

    • ベストアンサー
    • MySQL
  • BitフィールドにLOAD DATAできない

    以下の定義のテーブル(Bitフィールドを持つ)にLOAD DATAでデータを 入れようとしているのですがエラーになり困っています。 マニュアルにあるようにSET句を使用してLOADをしようとしているのですが 「You have an error in your SQL syntax;~」と コマンドの4行目のところで出てしまいます。どこがおかしいのでしょうか。 【テーブルの定義】 mysql> desc data; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | key1 | int(11) | NO | PRI | NULL | | | key2 | int(11) | NO | PRI | NULL | | | date | datetime | NO | PRI | NULL | | | flg1 | bit(1) | NO | | b'1' | | +-------+----------+------+-----+---------+-------+ 【CSVファイルの内容】 1,2,"2016-12-17 10:00:00",1 1,2,"2016-12-17 11:00:00",0 【コマンド】 LOAD DATA INFILE 'C:/csv/data.csv' INTO TABLE test.data (key1, key2, date, @var1) SET flg1 = CAST(@var1 AS SIGNED) FIELDS TERMINATED BY ',' ENCLOSED BY '"';

  • pathを指定してCSVをインポートしたい

    すいません1つ質問があります。 こちらのサイトでCSVのファイルのインポート方法を勉強していますが、下記の方法だとあらかじめ、データベースが格納されているフォルダにCSVを置いてある前提でこのやり方をやります。 LOAD DATA INFILE "T01Prefecture.csv" INTO TABLE T01Prefecture FIELDS TERMINATED BY "," LINES TERMINATED BY "\r\n"; 僕が知りたいのは、例えば、 C:\Users\Ken\Desktop\T01Prefecture.csv ここに置いてあるCSVを指定してインポートしたいと考えています。 そのやり方がどうもこのパスを書くだけでは出来ないです。 どなたかやり方を教えて頂けますか? 僕が書いたのは下記の通りです。 LOAD DATA INFILE "C:\Users\Ken\Desktop\T01Prefecture.csv" INTO TABLE T01Prefecture FIELDS TERMINATED BY "," LINES TERMINATED BY "\r\n"; よろしくお願いいたします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう