プロが教える店舗&オフィスのセキュリティ対策術

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

よろしくお願いいたします。

A 回答 (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という文字列にするので・・・)
    • good
    • 0
この回答へのお礼

お礼遅くなりました!

試行錯誤に時間が掛かってしまいました。

どうしても「PDO」ではうまく動いてくれませんでした。
そして、このような記事を読み「PDO」をあきらめました。
※PHPのバージョンを5.4.19に上げると解決したとありましたが、
 新たな問題が出てきそうなので、その案はあきらめました。
http://oshiete.goo.ne.jp/qa/8498457.html?from=hi …

以下の方法で解決いたしました。

my.cnf の設定変更
「enable-local-infile」を有効に

$strimport = 'mysqlimport --fields-terminated-by="," --fields-enclosed-by="\"" -L --host=localhost --user=ユーザ名 --password=パスワード データベース名 /var/www/・・・・フルパス/ファイル名.csv';
system($strimport);

色々なご提案、ありがとうございました。

お礼日時:2014/12/01 22:38

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

補足日時:2014/11/19 18:24
    • good
    • 0

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');

補足日時:2014/11/19 15:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!