- 締切済み
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 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
ごめんなさい、ちょっと検証できてないんだけど $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という文字列にするので・・・)
- yambejp
- ベストアンサー率51% (3827/7415)
mysql_関数を利用している時点で、かなりの不利があります。 ある日いきなり使えなくなるリスクがあることを留意してください。 http://webtech.seesaa.net/article/106290358.html あたりにmysqlimportコマンドをsystem()関数あたりで実行する方法が挙げられています つまりmysql_関数では処理が難しいということでしょう。
補足
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)
PDOで処理しているなら、MYSQL_ATTR_LOCAL_INFILEを設定してください http://php.net/manual/ja/ref.pdo-mysql.php
補足
早速回答していただきありがとうございます。 PDO は利用しておりません。 以下の様に接続しております、よろしくお願いいたします。 require("../dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); mysql_query('set character set utf8');
お礼
お礼遅くなりました! 試行錯誤に時間が掛かってしまいました。 どうしても「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); 色々なご提案、ありがとうございました。