重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

PHPとmySqlにて、DBデータのCSVダウンロード機能を作成中です。
抽出条件次第で膨大なクエリ送信回数となり、画面が真っ白になってしまいます。

画面が真っ白になる理由は、おそらくタイムアウト?のようなものだと思っています。
for文でクエリ送信し続けているので・・・

そこで、
1.正常に処理を終えるには、どのような手段があるでしょうか。
2.サーバーが2MBのデータまでしかダウンロードできないようなのですが、
 判別するにはPHP側でどのような手段があるでしょうか。

クエリ文を見直して送信回数を減らす案以外でご教示願います。

A 回答 (3件)

>for文でクエリ送信し続けているので・・・



となる時点で設計がまずかったとしか思えませんが、他に打つ手がないのなら分割実行するしかないですね。

クエリひとつごとにファイルに書き出して、locationヘッダなどで再処理していくしかないでしょう。

(e.g.)
<?php
session_name('pathchk');
session_start();
$max = isset($_SESSION['max']) ? intval($_SESSION['max']) : 1;
$path = isset($_SESSION['path']) ? intval($_SESSION['path']) : 1;
if ($path > $max) { $path = 1; }

if ($path == 1) {
// 実行するクエリのセット
$max = 5;
$_SESSION['sql'][1] = '1番目のクエリ';
$_SESSION['sql'][2] = '2番目のクエリ';
$_SESSION['sql'][3] = '3番目のクエリ';
$_SESSION['sql'][4] = '4番目のクエリ';
$_SESSION['sql'][5] = '5番目のクエリ';
$_SESSION['max'] = $max;
}
$sql = $_SESSION['sql'][$path];

//-- デバッグ用ここから(クエリ実行→CSV保存の代わり)
$fh = fopen('test.txt', 'a');
fputs($fh, $sql . PHP_EOL);
fclose($fh);
sleep(3);
//-- デバッグ用ここまで

$_SESSION['path'] = ++$path;
if ($path <= $max) {
header('Location: ' . $_SERVER['SCRIPT_NAME']);
} else {
print "Done";
}
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまい申し訳ありませんでした。
解決しました。

お礼日時:2012/02/16 11:06

PHP経由なら何回かに分けてダウンロードする(ページング)とか。



サーバーの設定にもよるでしょうけど、
SELECT * FROM table_name INTO OUTFILE '/public_html/path/data.csv'
などとしてcsvファイルにエクスポートして、http://example.com/path/data.csvにアクセスしてダウンロードとか。
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまい申し訳ありませんでした。
解決しました。

お礼日時:2012/02/16 11:06

>クエリ文を見直して送信回数を減らす案以外で



それ以外にないですね
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまい申し訳ありませんでした。
解決しました。

お礼日時:2012/02/16 11:06

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