「お昼の放送」の思い出

php CSVファイル出力後その結果をブラウザに返す処理について

先ほど質問しどう頑張ってもエラーがでてしまい自分の力ではもう無理だと思い再度質問させていただきました。アンケートフォーム→回答ボタンを押すとCSVファイル変換後(ここまではできてます)その後CSVファイルの内容をブラウザに返したいのですがうまくいきません。どなたかたすけてほしいです。良い回答が得られないようならば諦めることにいたします。批判、中傷のコメントは受け付けません。





<HTML>
<HEAD>
<TITLE>テキスト送信のテスト></TITLE>
</HEAD>
<FORM name="toi_5.html"method="post" action="toi51.php">
<Div Align="center">名前:<BR>
<INPUT type="text"name="onamae">
<BR>
性別:<BR>
<INPUT type="radio"name="gender" value="男">男<BR>
<INPUT type="radio"name="gender" value="女">女<BR>
<BR>
<SELECT name="syokugyou">
<OPTION value""selectd>職業をえらんでください</OPTION>
<OPTION value"学生">学生</OPTION>
<OPTION value"会社員">会社員</OPTION>
<OPTION value"公務員">公務員</OPTION>
<OPTION value"自営業">自営業</OPTION>
<OPTION value"その他">その他</OPTION>
</SELECT><BR>

<p></p>
満足度を答えてください:<BR>
<INPUT type="checkbox" name="hobby[]" value="満足">
満足<BR>
<INPUT type="checkbox" name="hobby[]" value="やや満足">
やや満足<BR>
<INPUT type="checkbox" name="hobby[]" value="普通">
普通<BR>
<INPUT type="checkbox" name="hobby[]" value="やや不満">
やや不満<BR>
<INPUT type="checkbox" name="hobby[]" value="不満">
不満<BR>
<BR>
<INPUT type="submit" value="回答">


</div>
</FORM>
</BOBY>
</HTML>



<?php
if(isset($_post["gender"])&&($_post["gender"]=="男"||
$_POST["gender"]=="女")){
print"性別:<BR>";
print $_POST["gender"];
}else{
print"性別を選んでください。<br>";
}
?>
?>
<p>

<?php
if($_post["syokugyou"]<>""){
print"職業:<br>";
print$_post["syokugyou"];
}else{
print"職業をえらんでください<br>";
}
?>

<p>
<br>満足度
<?php
if(isset($_post["hobby"])){
$hobby=implode($_post["hobby"]);
print $hobby;
}else{
}
?>

<?php
// 保存
$fileName = "log.csv";

header('Content-Disposition: attachment; filename=' . $fileName);

?>



</div>

</body>
</html>

A 回答 (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>
    • good
    • 0

あ、HTMLエスケープ忘れてたので、ブラウザに出力する際、「名前」はhtmlspecialchars関数を通すようにしてください。

    • good
    • 0

【ヒント】



「ブラウザにHTMLを出力」
「ファイルをダウンロードさせる」

この2つを同時に行うことは出来ない。
それを要求する課題が出たならば出題者は恐らく「PHPだけでやれ」とは言っていないはず。
JavaScriptを併せないと実現不可能。
    • good
    • 0

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


おすすめ情報