ここから本文です

PHPスクリプト <html> <head> <meta http-equiv="Content-Type" content="tex...

gat********さん

2017/1/3022:51:32

PHPスクリプト

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>フォーム処理</title>
</head>
<body>
<h1>フォーム処理</h1>
<?
// 関数定義
function show_form($name="",$sex="",$email="",$color="",$msg="") {
$sex_opts = array('M'=>'男', 'F'=>'女');
$color_opts = array('K'=>'黒', 'W'=>'白', 'R'=>'赤', 'G'=>'緑', 'B'=>'青');
if (!is_array($color)) $color = array();
?>
<form action="enq.php" method="POST">
氏名:<input name="name" value="<? echo $name ?>">
<br>性別:
<?
foreach ($sex_opts as $key => $val) {
echo "<input type=radio name=\"sex\" value=\"$key\"";
if ($key == $sex) echo ' checked';
echo "> $val\n";
}
?>
<br>E-mail:<input name="email" value="<? echo $email ?>">
<br>好きな色:
<?
foreach ($color_opts as $key => $val) {
echo "<input type=checkbox name=\"color[]\" value=\"$key\"";
if (in_array($key, $color)) echo ' checked';
echo "> $val\n";
}
?>
<br>コメント:<br>
<textarea name="msg" rows=3 cols=35><? echo $msg ?></textarea>
<p>
<input type=submit value=" 送信 "><input type=reset value=" 取消 ">
</form>
<?
}
// 関数定義の終わり

if ($_SERVER['REQUEST_METHOD'] != 'POST') {
show_form();
} else {
if (empty($_POST['name']) || empty($_POST['sex'])) {
echo "<p>「氏名」「性別」欄は必須です。もう一度やりなおし!</p>\n";
show_form($_POST['name'], $_POST['sex'], $_POST['email'],
$_POST['color'], $_POST['msg']);
} else {
// アンケート結果の表示
echo "<p>以下のペア(key, value)で送信されました:\n<dl compact>\n";
echo "<dt><var>name</var><dd><kbd>$_POST['name']</kbd>\n";
echo "<dt><var>sex</var><dd><kbd>$_POST['sex']</kbd>\n";
echo "<dt><var>email</var><dd><kbd>$_POST['email']</kbd>\n";
echo "<dt><var>color</var><dd><kbd>".
join(',', $_POST['color']) ."</kbd>\n";
$val = ereg_replace("\r\n", '<br>', $_POST['msg']);
echo "<dt><var>msg</var><dd><kbd>$val</kbd>\n";
echo "</dl>\n";
}
}
?>
</body>
</html>


このPHPスクリプトは単に入力されたデータを表示するだけで,データは記録されないです。
データを記録する際に,1件のデータを以下のように半角カンマで区切って1行で ファイル「enq.dat」に追記していくにはどうしたらいいですか?

氏名,性別,Email,色,コメント

閲覧数:
47
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

shi********さん

2017/1/3110:25:47

いろいろツッコミどころも多いのですが、ひとまずは

>1件のデータを以下のように半角カンマで区切って
>1行で ファイル「enq.dat」に追記していく

という部分だけ回答します。

phpのマニュアルの「ファイルシステム関数」を参照してください。

http://php.net/manual/ja/ref.filesystem.php

カンマ区切りという指定ですので、fputcsvで書き込みます。読込みもfgetcsvで読込んでください(fileで読込むならば各行をstr_getcsvで分割すること)。テキスト内のカンマや引用符も適切に処理してくれます(fgetcsvで読込むならコメントの改行コードを残しておいてもOK)。


<?php
// 前処理
$name = isset($_POST['name']) && is_string($_POST['name']) ? $_POST['name'] : '';
$sex = isset($_POST['sex']) && is_string($_POST['sex']) ? $_POST['sex'] : '';
$email = isset($_POST['email']) && is_string($_POST['email']) ? $_POST['email'] : '';
$color =isset($_POST['color']) && is_array($_POST['color']) ? implode(',', $_POST['color']) : '';
$msg = isset($_POST['msg']) && is_string($_POST['msg']) ? str_replace(array("\r", "\n"), "", nl2br($_POST['msg'])) : '';

// ファイルへの書き込み
$fp = fopen('enq.dat', 'a');
flock($fp, LOCK_EX);
fputcsv($fp, array($name, $sex, $email, $color, $msg));
flock($fp, LOCK_UN);
fclose($fp);

質問した人からのコメント

2017/1/31 22:24:51

丁寧なご回答ありがとうございます。参考にさせていただきます。拙い質問で申し訳ありませんでした<m(__)m>

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

tez********さん

2017/1/3110:33:05

> このPHPスクリプトは単に入力されたデータを表示するだけ
例えば、以下のところ(他も同様)
> show_form($_POST['name'],
> function show_form($name="",
> <input name="name" value="<? echo $name ?>">
> echo "<dt><var>name</var><dd><kbd>$_POST['name']</kbd>\n";
外部から得た値は、表示時には必ずエスケープ(htmlspecialchars())が必要です。
__kbd タグを使う必然性を感じません
__既に入力済みの値ですし...
__他と異なる書体で表示されるのを期待するのであれば
__クラスを指定するなどがあるべき姿でしょう

> $val = ereg_replace("\r\n", '<br>', $_POST['msg']);
正規表現を使わないのに、ereg_replace() は無駄です。
更に、PHP7 では使えません。
環境が変わると「改行」は、"\r\n" ではなくなると思いますので、機能しないのでは?

蛇足ですが、最近は性別を必須にしないか、男女の2択ではない様にしているところが増えているようです。


さて、本題です。
> データを記録する際に,1件のデータを以下のように半角カンマで区切って1行で ファイル「enq.dat」に追記していくにはどうしたらいいですか?
> 氏名,性別,Email,色,コメント
「アンケート結果の表示」(入力内容の表示の方が意味的には良いと思う)のところで、データファイルに追記するというのは理解されていると思います。

では、1行分のデータを作ることは出来ますか?
単純に連結するだけなので、難しいとは思えないのですが?

それとも、コメントに複数行の入力を許しているのに、「半角カンマで区切って1行で」に従えなくて困っているのでしょうか?
他にも入力値にカンマ( , )や二重引用符( " )が含まれる場合の対応でしょうか?

CSV形式である事を優先するなら、各項目を(二重引用符の処理をした上で)二重引用符で囲ってから、カンマを挟んで連結するだけです。

1行である事を優先するなら、「改行文字」を別の文字(または文字列)に置換してやればいいでしょう。
この際も、入力値に含まれるカンマの処理は必要です。

ファイルに追記する部分で困っているのでしょうか?
ファイルの基本操作ですから、マニュアルにも記述がありますけど?
__参考にされているモノにも必ずあると思うのですが

ファイルへの出力に fputcsv() を使うなら、1行分のデータの作成方法が異なる(文字列ではなく配列を作る)だけで、CSV形式で保存が可能です。
__「1行で」という仕様は守れなくなります


質問される場合は、疑問に思う事、分からない事を明確にすると早く解決に辿り着けます。
動作するサンプルが欲しいだけなら、業者(クラウドソーシングで見つかるでしょう)に依頼するか、お節介な回答者が現れるのをお待ちください。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる