2016-12-20 10 views
0

私は、MySQLからテキストファイルにデータを書き込んで瞬時にダウンロードする単純なスクリプトを持っています。送信ボタンを押して私のデータを並べ替えてファイルに書き込むと、以前のデータが入っているファイルが得られるので、私のフィルタを変更した後に良い情報を得たい場合は、常に2つのサブミットと2つのサブミット私は最後の情報で良いファイルです。どのように私はこの問題を防ぐことができますか?テキストファイルへの書き込みが正しく行われない(CodeIgniter)

public function all() 
{ 
    $this->load->helper('file'); 

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="orders_all.txt"'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: '.filesize('./assets/downloads/orders_all.txt')); 

    $data = array(
     'customer_id' => $this->input->post('customer_id', TRUE), // Params from select inputs 
     'product_id' => $this->input->post('product_id', TRUE), 
     'state'  => $this->input->post('state', TRUE), 
     'date'  => $this->input->post('date', TRUE) 
    ); 

    $result = $this->orders_model->get_orders_by_filter($data); 
    $str = ''; 

    foreach ($result as $row) 
    { 
     $str .= $row['customer_title'] . ';' . $row['product_title'] . ';' . $row['product_code'] . ';' . $row['quantity'] . ';' . $row['created_at']."\r\n"; 
    } 

    if (write_file('./assets/downloads/orders_all.txt', $str)) 
    { 
     readfile('./assets/downloads/orders_all.txt'); 
    } 
} 
+0

「もし」にヘッダを移動するには、あなたのコードの下にすべての 'header'を入れてみてください。 – weirdo

答えて

3

それはそこではありませんファイルを読んでいるとあなたのcontent-lengthは、間違っていることでしょう。

あなただけダウンロードするために誰かのためにファイルを作成している場合は、(2人が同時にスクリプトを呼び出す場合、それはまた、問題が発生します!)すべて一緒にそのステップをスキップ:あなたが行うことができます代わりに

header('Content-Length: ' . strlen($str)); 
echo $str; 

つまり、文字列を計算した後にコンテンツの長さヘッダーを移動し、ファイルを書き込まずに文字列を送信します。

ファイルを書かなければならない場合は、ちょうど下

if (write_file('./assets/downloads/orders_all.txt', $str)) 
{ 
    header('Content-Length: '.filesize('./assets/downloads/orders_all.txt')); 
    readfile('./assets/downloads/orders_all.txt'); 
} 
+0

あなたはそれを除外することもできますが、それは強制的ではありません –

+0

@ダゴン:とても真実です)潜在的な問題を救います。また、マルチバイト文字を使用している場合、実際には間違っている可能性があることにも注意してください。 – Robbie

+0

ありがとう!それは本当に助けになりました。今私は理解して、それはテキストファイルにページヘッダーを変更する必要があるだけでデータを書き込む必要はありません。 – SkySonny

関連する問題