0

私はphpとCakePHPにかなり慣れていないので、テキストファイル(2kb)をアップロードした後、次のコードを実行しようとしています:

$filefullname = $this->request->data['File']['file']['tmp_name'];
debug($filefullname);
move_uploaded_file($filefullname, WWW_ROOT.'tmp.txt');
$query = 'LOAD DATA LOW_PRIORITY INFILE "'.WWW_ROOT.'tmp.txt'.'" INTO TABLE agencies FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\r" IGNORE 1 LINES';
debug($query);
$this->Agency->query($query);

ファイルは見つかりますが、次の出力が得られます。

'C:\Windows\Temp\phpB413.tmp'
'LOAD DATA LOW_PRIORITY INFILE "C:\Data\myphpapplication\app\webroot\tmp.txt" INTO TABLE agencies FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\r" IGNORE 1 LINES'
Error: SQLSTATE[HY000]: General error: 29 File 'C:\Data\myphpapplication\app\webroot\tmp.txt' not found (Errcode: 13)
SQL Query: LOAD DATA LOW_PRIORITY INFILE "C:\Data\myphpapplication\app\webroot\tmp.txt" INTO TABLE agencies FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\r" IGNORE 1 LINES

どうすればこれを修正できますか?

4

2 に答える 2

2

ほとんどの場合、ファイルはそこにありますが、MySQL ではその場所からファイルを読み取ることができません。MySQL は、LOAD DATA ... INFILE を読み取る場所をかなり制限していますが、それには十分な理由があります。まず、MySQL が読み取れるパスにファイルを移動するか、MySQL サーバーの設定を変更する必要がある場合があります。

MySQL 5.1 マニュアルから:

非 LOCAL の場合、これらのルールは、./myfile.txt という名前のファイルがサーバーのデータ ディレクトリから読み取られるのに対し、myfile.txt という名前のファイルはデフォルト データベースのデータベース ディレクトリから読み取られることを意味することに注意してください。[...]

と:

Windows パス名は、バックスラッシュではなくスラッシュを使用して指定されます。バックスラッシュを使用する場合は、二重にする必要があります。

于 2013-01-07T23:07:32.807 に答える
0

@JvO はあなたを正しい道へと導きます。いくつかの重要な要素が欠けていると思います.1つは、アップロードされたファイルをサーバー上の最初の一時ディレクトリからMySQLが公式に読み取ることができる場所に移動することです(セキュリティのために一時ディレクトリから読み取ることはありません)理由)。

これは私が行ったプロジェクトの例で、CSV ファイルをアップロードし、それを読み取り可能なディレクトリに移動しました。最初にmove_uploaded_file関数を使用してファイルをアップロードし、LOAD DATA クエリで使用する新しいファイルのアップロード パスを記述する変数を作成しました。

move_uploaded_file($_FILES["fCSV"]["tmp_name"],"user_uploads/SG".$dapID ."/". $_FILES["fCSV"]["name"]);

$csvfile = "user_uploads/SG".$dapID ."/". $_FILES["fCSV"]["name"];

LOAD DATA クエリで、MySQL に指定されたディレクトリからファイルを読み取るように指示する「LOCAL」キーワードがありません。それ以外の場合は、データベース ディレクトリで検索します (以下の「Field1」などの使用はデモ用です)。目的のみであり、実際のテーブル フィールド名がそこにある必要があります):

$sqlLoad = "LOAD DATA LOCAL INFILE '".$csvfile."' INTO TABLE my_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (Field1,Field2,Field3,Field4) SET ID =".$id

最後に、MySQL マニュアルのこのページをよく読む必要があります。例を提供するとともに、対処している多くの問題をカバーしています。

MySQL LOAD DATA INFILE 構文

于 2013-01-08T14:47:22.377 に答える