- ベストアンサー
PHP CSVファイル出力後、結果をブラウザに返す処理について
- アンケートフォームの回答をCSVファイルに変換し、その結果をブラウザに返す処理についての質問です。
- 現在、質問者さんの実装ではうまく動作していないようです。解決策を教えてほしいとのことです。
- 中傷のコメントは受け付けないとのことです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
完全に同時でなくてもいいならこんな形で実現は可能。 (かなり関係ないところも自分のポリシーに合うようにいじってるのであくまで参考程度の方がいいかも) -------------------------------------------------------------- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>テキスト送信のテスト</title> </head> <body> <form method="post" action="execute.php"> <p>名前: <input type="text" name="name" value=""> </p> <p>性別: <input type="radio" name="gender" value="1">男 <input type="radio" name="gender" value="2">女 </p> <p>職業: <select name="job"> <option value="0">選択してください</option> <option value="1">学生</option> <option value="2">会社員</option> <option value="3">公務員</option> <option value="4">自営業</option> <option value="5">その他</option> </select> </p> <p>満足度(複数選択可): <input type="checkbox" name="satis[1]" value="1">満足 <input type="checkbox" name="satis[2]" value="1">やや満足 <input type="checkbox" name="satis[3]" value="1">普通 <input type="checkbox" name="satis[4]" value="1">やや不満 <input type="checkbox" name="satis[5]" value="1">不満 </p> <p> <input name="csv_download" type="submit" value="CSVダウンロード"> <input name="csv_display" type="submit" value="CSV内容表示"> </p> </form> </body> </html> -------------------------------------------------------------- <?php function filter_request($var, $default_structure) { ____$ret = array(); ____foreach ($default_structure as $key => $value) { ________if (!isset($var[$key])) { ____________$ret[$key] = $value; ________} elseif (is_array($value)) { ____________$ret[$key] = filter_request($var[$key], $value); ________} elseif (is_array($var[$key])) { ____________$ret[$key] = $value; ________} else { ____________$ret[$key] = $var[$key]; ________} ____} ____return $ret; } $errors = array(); extract(filter_request($_POST, array( ____'name' => '', ____'gender' => '0', ____'job' => '0', ____'satis' => array( ________'1' => '0', ________'2' => '0', ________'3' => '0', ________'4' => '0', ________'5' => '0', ____), ))); $maps = array( ____'gender' => array( ________'1' => '男', ________'2' => '女', ____), ____'job' => array( ________'1' => '学生', ________'2' => '会社員', ________'3' => '公務員', ________'4' => '自営業', ________'5' => 'その他', ____), ____'satis' => array( ________'1' => '満足', ________'2' => 'やや満足', ________'3' => '普通', ________'4' => 'やや不満', ________'5' => '不満', ____), ); if ($name === '' || !preg_match('//u', $name)) { ____$errors[] = '名前を入力してください'; } if (!isset($maps['gender'][$gender])) { ____$errors[] = '性別を選択してください'; } else { ____$gender = $maps['gender'][$gender]; } if (!isset($maps['job'][$job])) { ____$errors[] = '性別を選択してください'; } else { ____$job = $maps['job'][$job]; } $satis = array_filter($satis); if (!$satis) { ____$errors[] = '満足度を1つ以上選択してください'; } else { ____$tmp = $satis; ____$satis = array(); ____foreach ($tmp as $k => $v) { ________$satis[] = $maps['satis'][$k]; ____} } ?> <?php if ($errors): ?> <ul> <?php foreach ($errors as $error): ?> <li><?=$error?></li> <?php endforeach; ?> </ul> <?php exit(); ?> <?php endif; ?> <?php $lines = array( ____array('名前', $name), ____array('性別', $gender), ____array('職業', $job), ____array('満足度', implode(',', $satis)), ); if (isset($_POST['csv_download'])) { ____$fp = fopen('php://memory', 'r+b'); ____foreach($lines as $line) { ________fputcsv($fp, $line); ____} ____rewind($fp); ____$meta = stream_get_meta_data($fp); ____header('Content-Type: application/octet-stream'); ____header('Content-Disposition: attachment; filename="data.csv"'); ____header('Content-Length: ' . $meta['unread_bytes']); ____fpassthru($fp); ____fclose($fp); ____exit(); } ?> <table> <?php foreach ($lines as $cells): ?> <tr><th><?=$cells[0]?></th><td><?=$cells[1]?></td></th></tr> <?php endforeach; ?> </table>
その他の回答 (2)
あ、HTMLエスケープ忘れてたので、ブラウザに出力する際、「名前」はhtmlspecialchars関数を通すようにしてください。
【ヒント】 「ブラウザにHTMLを出力」 「ファイルをダウンロードさせる」 この2つを同時に行うことは出来ない。 それを要求する課題が出たならば出題者は恐らく「PHPだけでやれ」とは言っていないはず。 JavaScriptを併せないと実現不可能。