2016-06-30 11 views
0

私はロードデータinfileクエリを使用してMySQLテーブルにデータを挿入しようとしています。アップロード用のテキストファイルを受け入れ、処理しようとするHTMLフォームがあります。私は、ファイルをアップロードするとフォームアップロードからファイルにデータをロード

ファイル

00|Oakleaf Forest|Norfolk|VA|United States|PC 
01|Igo|Lowell|MA|United States|PC 
02|Mint|Lawrence|MA|United States|PC 
03|Hosa|Boston|MA|United States|PC 

HTML

<p>Please upload file below:</p> 

<form action="process.php" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file" accept="text/plain"> 
    <input type="submit"> 
</form> 

PHP

/* processFile 
* Process the submitted file 
* 
* @param Array - file for processing 
*/ 
function processFile($file) { 

    // Get global variable 
    global $DB; 

    // file contents 
    $file_contents = $file["tmp_name"]; 

    $SQL_statement = "LOAD DATA INFILE '$file_contents' INTO TABLE organization FIELDS TERMINATED BY '|' 
         LINES TERMINATED BY '\n' IGNORE 2 LINES 
         (ein, legal_name, city_name, state_name, country_name, description);"; 

    // Run SQL query 
    $DB->execute($SQL_statement); 
} 

、何もテーブルに挿入されていません。

私は次のクエリを返す、echo($SQL_statement);とデバッグを試してみた:

LOAD DATA INFILE '/Applications/XAMPP/xamppfiles/temp/phpOtL2q1' INTO TABLE organization FIELDS TERMINATED BY '|' LINES TERMINATED BY ' ' IGNORE 2 LINES (ein, legal_name, city_name, state_name, country_name, description); 

は、私がここで何をしないのですか?

+0

pdo/mysqliはデフォルトでブール値falseを返しますが、失敗した場合はチェックしません。 DB呼び出しで成功することは決してありません。常に失敗とみなし、失敗をチェックし、成功を楽しい驚きとして扱います。 –

答えて

1

LOAD DATA INFILEは、ファイルをデータベースプロセスで読み取る必要があります。私は、一時的なアップロードファイルが世界で読めるものであることは疑いの余地があります。おそらく、WebサーバーのユーザーIDだけが読むことができます。あなたが試すことができます

ことの一つは、最初の一時ファイルのパーミッションを変更している。

chmod($file["tmp_name"], 0444); 

一時ファイルを含むディレクトリは、世界的に読み取れない場合は、これはまだ動作しない場合があります。別の解決方法は、LOAD DATA LOCAL INFILEを使用することです。これはデータベースサーバーではなく、PHPでファイルを読み込むので、PHPプロセスが読み取れるファイルをロードできます。すべてのファイルデータをデータベース接続経由で送信する必要があるため、効率的ではありませんが、権限の問題を回避できます。

最初に最初の方法を試してください。それがうまくいかない場合は、2番目の方法を試してください。

+0

PHPMyAdminでは 'LOAD DATA INFILE'クエリを正常に実行できますが、PHPスクリプト –

+0

では実行できません。別のファイルから読み込んでいて、そのファイルが世界中で読めるからです。 – Barmar

+0

ファイルの値を1に設定しているとはどういう意味ですか? 'chmod()'は変数を変更せず、ファイルのパーミッションを変更するだけです。これはUnix/Linuxサーバーですか? – Barmar

関連する問題