7

データベースをウェブサーバーから別のサーバーに移動します(Amazon EC2ウェブサーバーからRDSインスタンスに)。

以前はLOADDATAINFILEが機能していましたが、データベースがWebサーバーとは別のマシンにあるため、LOCALキーワードを追加する必要があります。

私の開発サーバーでテストしたところ、機能しないことがわかりました。

  • 私はまだphpからデータ入力をロードすることができます
  • mysqlコマンドラインからDATALOCALINFILEをロードできます(--local_infile = 1を使用)
  • PHPからDATALOCALINFILEを読み込めません。

動作するこれらの2つのことの間で、それは除外します:

  • SQLまたはPHPコードの問題
  • 構文やファイルのアクセス許可など、アップロードファイルに関する問題
  • mysqlサーバー設定の問題

私が得るエラーは次のとおりです:エラー1148(42000):使用されたコマンドはこのMySQLバージョンでは許可されていません(--local_infile = 1を使用しない場合、mysqlコマンドラインからそのエラーが発生します)


関連情報の他のいくつかのビット:

  • Ubuntu 12.04、mysql 5.5.24、php 5.3.10
  • 私はphpのmysql_connectを使用しています(mysqliをサポートしていないFacebookのhiphopコンパイラを使用することを計画しているため、mysqliの代わりに)。
  • そのため、connectコマンドには追加のフラグセットが必要です。

    mysql_connect($dbHost, $dbUser, $dbPass, false, 128);
    
  • phpinfo()を使用して確認しましたmysql.allow_local_infile = On
  • Amazon RDSで試してみましたが(開発サーバーで問題が発生した場合)、そこでも機能しません。(local_infileパラメーターがオンになっている場合。)

私が試したことのないことについて読んだ唯一のことは、ローカル入力を許可するためにフラグをオンにして開発サーバーでmysqlサーバーをコンパイルすることです...しかし、開発サーバーでそれを機能させても、 AmazonRDSを手伝ってください。(それに加えて、LOAD DATA LOCAL INFILEはmysqlコマンドラインから機能します。)


特にphpのmysql_connect()に問題があるようです。

LOAD DATA LOCAL INFILE(おそらくAmazon RDSから)を使用して、これを機能させるための秘訣を知っている人はいますか?

4

5 に答える 5

9

これはphpのバグだと思うので、私はあきらめました。特にmysql_connectコードは、現在は非推奨になっています。@eggyalが言及したバグレポートに記載されている手順と同様の手順を使用して、ソースに変更を加えてphpを自分でコンパイルすることで、おそらく解決できる可能性があります:https ://bugs.php.net/bug.php?id=54158

代わりに、system()呼び出しを実行し、mysqlコマンドラインを使用して回避します。

$sql = "LOAD DATA LOCAL INFILE '$csvPathAndFile' INTO TABLE $tableName FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\\\"' ESCAPED BY '\\\\\\\\' LINES TERMINATED BY '\\\\r\\\\n';";
system("mysql -u $dbUser -h $dbHost --password=$dbPass --local_infile=1 -e \"$sql\" $dbName");

それは私のために働いています。

于 2012-10-23T12:20:27.320 に答える
8

この厄介なバグを除外するためのチェックリストは次のとおりです。


1- MySQLでユーザーにFILE権限を付与します。通常、phpMyAdminはこの権限をカバーしていません。

GRANT FILE ON *.* TO 'db_user'@'localhost';

2- / etc /mysql/またはmysqlパスのmy.cnfを編集します。

[mysql]
local-infile=1
[mysqld]
local-infile=1

3-php.iniの/etc/ php5 / cli /または同様のもの:

mysql.allow_local_infile = On

ini_setオプションで、スクリプトで実行できます。

ini_set('mysql.allow_local_infile', 1);

4-データベースハンドラライブラリは正しいオプションを使用する必要があります。
PDO

new PDO('mysql:host='.$db_host.'.;dbname='.$db_name, $db_user, $db_pass,
array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));

mysqli

$conn = mysqli_init();
mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($conn,server,user,code,database);

5- INFILEコマンドがファイルへの絶対パスを使用し、それが存在することを確認します。

$sql = "LOAD DATA INFILE '".realpath(is_file($file))."'";

6-ターゲットファイルと親ディレクトリがPHPとMySQLで読み取り可能であることを確認します。

$ sudo chmod 777 file.csv

7-ローカルで作業している場合はLOCAL、SQLからを削除できます。

LOAD DATA INFILE

それ以外の:

LOAD DATA LOCAL INFILE

注:構成ファイルを編集する場合は、MySQLおよびPHPサービスを再起動することを忘れないでください。

これが誰かを助けることを願っています。

于 2014-01-05T23:58:10.573 に答える
5

この投稿で言及されているように、LOAD LOCAL DATA INFILEを機能させるには、mysql_connectに3番目と4番目のパラメーターを追加する必要があります。それは私を助けました。他の提案(インターネットで広く議論されているmy.cnfのapparmor、local-infile = 1)は役に立ちませんでした。次のPHPコードは私のために働いた!

mysql_connect(HOST,USER,PASS,false,128);

確かに、これも手動です。

于 2013-02-09T15:44:21.277 に答える
2

クライアントがinfiletrueでアクティブ化する次の行を使用します

mysql --local-infile = 1 -u root -p

于 2013-05-22T09:48:16.080 に答える
0

2020年にこれを行う場合のヒントは、phpinfo.phpまたはphp--iniでconfiguratinファイルの場所を確認することです。私の場合、virtualminを使用してphp iniファイルを変更していましたが、私のサイトには独自のiniファイルがありました。その場所を見つけて変更すると、すべてが通常に戻りました。

于 2020-07-20T13:13:34.440 に答える