質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

4120閲覧

どこが間違っていますか?ゲストブック

b1ackc0ffee

総合スコア267

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2015/07/08 03:04

locationの部分を完全なアドレスを書いていましたが、
下記のように書き換えたところエラーが出てしまいました。
書き方が間違っているのでしょうか。
送信ボタン押下後の、表示画面のURLがhttp://localhost/guest_input.phpとなってしまっているので、ホスト内のパスが指定されていないという事でしょうか。

[エラー内容]

[an error occurred while processing this directive] 要求された URL は本サーバでは見つかりませんでした。 参照元ページのリンクが間違っているか、古くなってしまっているようです。 ページの著者にこのエラーをお知らせ下さい。 [an error occurred while processing this directive]

[コード]

lang

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8" /> 5<title>NEW掲示板</title> 6</head> 7<body> 8<h3>ようこそNEW掲示板へ</h3> 9<form method="POST" action="guest_write.php"> 10 <div id="container"> 11 <label for="name">名前:<label> 12 <input type="text" id="name" name="name" size="20" maxlength="30" /> 13 </div> 14 <div id="container"> 15 <label for="body">本文</label> 16 <input type="text" id="body" name="body" size="70" maxlength="255" /> 17</div> 18<input type="submit" value="送信" /> 19</form> 20</body> 21</html> 22

lang

1<?php 2$file = fopen('bbs.dat', 'ab'); 3flock($file, LOCK_EX); 4fputs($file, date('Y年 m月 d日 H:i:s')."\t"); 5fputs($file, $_POST['name']."\t"); 6sleep(5); 7fputs($file, $_POST['body']."\n"); 8flock($file, LOCK_UN); 9fclose($file); 10header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SEVER['PHP_SELF']).'/guest_input.php'); 11

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

lang

1$file = fopen('bbs.dat', 'ab'); 2flock($file, LOCK_EX); 3fputs($file, date('Y年 m月 d日 H:i:s')."\t"); 4fputs($file, $_POST['name']."\t"); 5sleep(5); 6fputs($file, $_POST['body']."\n"); 7flock($file, LOCK_UN); 8fclose($file); 9/** 10 *スーパーグローバル変数SEVERがtypo正しくはSERVER 11 *直下の時に/が反映されるのでrtirmで回避 12 **/ 13//header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SEVER['PHP_SELF']).'/guest_input.php'); 14 15header('Location: http://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/').'/guest_input.php');

lang

1<?php 2if ( ! is_file('bbs.dat') ) exit('bbsファイルが開けませんでした。'); 3$file = file('bbs.dat'); 4?> 5<dl> 6<?php foreach($file as $row_str):?> 7<?php $row = explode("\t", $row_str);?> 8<?php if ( count($row) < 3 ) continue;?> 9<dt><?php echo e($row[1])?>(<?php echo e($row[0])?>)</dt> 10<dd style="border-bottom:1px solid #DDD;"><?php echo e($row[2]);?></dd> 11<?php endforeach;?> 12</dl>

投稿2015/07/08 03:16

編集2015/07/08 06:56
nanndemoiikara

総合スコア775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

b1ackc0ffee

2015/07/08 03:26

シンプルにわかりやすい回答有難うございます★ rtrim知らないので調べておきます! タイポ直すと正常に動きました。
b1ackc0ffee

2015/07/08 04:42

有難うございます^^ ・sleep(5);の部分って存在意義がわからないのですが、必要でしょうか? ・rtirmは空白以外に、/も消し去ってくれるのでしょうか? 宜しくお願い致します><、
nanndemoiikara

2015/07/08 05:38 編集

> sleep(5);の部分って存在意義がわからないのですが、必要でしょうか? おそらく必要ないと思います。 ただ、仕様がわからないので正確な事はわかりません。 5秒間ファイルロックする仕様でしたらこれで適切なのでは? ただその場合、flock($file, LOCK_EX);の後に書けと思います。。。 > rtirmは空白以外に、/も消し去ってくれるのでしょうか? 第二引数で'/'を渡しています。 http://php.net/manual/ja/function.rtrim.php 他にもこのコードだけですとNoticeが発生します。 nameとbodyの値に検証を行うか、検証を行わないのなら下記の形がいいんじゃないかな?と思います。 × fputs($file, $_POST['name']."\t"); × fputs($file, $_POST['body']."\n"); $name = ( isset($_POST['name']) && is_string($_POST['name']) )? $_POST['name'] : '' ; $body = ( isset($_POST['body']) && is_string($_POST['body']) )? $_POST['body'] : '' ;
b1ackc0ffee

2015/07/08 06:10

ふみゅ。なるほどです。 質問のところ以外にもご指摘くださり、非常に勉強になります。 空送信できないようにするという事でしょうか? ちなみに、情報をリスト表示させてみたのですが、 期待通りの結果になりません。 本文のところにbodyの情報を入れたいのですがどこが間違っていますか? 別枠でコメントしました。 宜しくお願い致します。
b1ackc0ffee

2015/07/08 06:20

$name = ( isset($_POST['name']) && is_string($_POST['name']) )? $_POST['name'] : '' ; $body = ( isset($_POST['body']) && is_string($_POST['body']) )? $_POST['body'] : '' ; にすると、日時のみ、同じ行に横並びに保存されました。 検証とは何の検証のことでしょうか。 度々すみませんが宜しくお願い致します。
nanndemoiikara

2015/07/08 06:41 編集

> 空送信できないようにするという事でしょうか? いいえ。nameやbodyというPOST値が飛んでこない可能性があります。 そのため、$_POST['name']という値が存在しないためNoticeエラーが発生します。 それを制御する為にPOST値が存在するかつ、文字列のデータである場合(配列が飛んでくる可能性もある為)のみ変数に代入しています。 $name = ( isset($_POST['name']) && is_string($_POST['name']) )? $_POST['name'] : '' ; $body = ( isset($_POST['body']) && is_string($_POST['body']) )? $_POST['body'] : '' ; fputs($file, $name."\t"); fputs($file, $body."\n"); この様なかたちになります。 > 検証とは何の検証のことでしょうか。 POST値の検証です。
b1ackc0ffee

2015/07/08 09:40

VOIDの重要性に関してまだ理解できていませんでした。 空でも送信できてしまうから、 空だと$_POSTでエラーになってしまうという事ですね! 検証とは...(゜Q。)?? http://www.itmedia.co.jp/im/articles/1111/07/news154.html 参考にしました。 ・セキュリティ対策? ・FALSE回避? というレベルですが、頑張ります! 大変ありがとうございました★★
nanndemoiikara

2015/07/09 00:17

検証(バリデーション)は、セキュリティ対策ではなく仕様になります。 例えばですが、今回のnameは必須、本文も必須で255文字以内の文字列という仕様であった場合 if ( isset($_POST['name']) && $_POST['name'] !== '' ) や if ( isset($_POST['body']) && $_POST['body'] !== '' && mb_strlen($_POST['body']) <= 255 ) みたいな形で上記の条件に当てはまらない場合はbbs.datに書き込ませず、エラーを発生させる等の処理です。 入力値が仕様として正しいかを検証します。 また、セキュリティ対策については「安全なWebアプリケーションの作り方」という本がかなりオススメです。
b1ackc0ffee

2015/07/09 01:50

なるほどです。 有難うございます。 将来的にセキュリティエンジニアになれるように、今から意識しておきます。 丁寧かつ親切に教えていただき有難うございました!!★
guest

0

lang

1<?php require_once './Encode.php'; ?> 2<!DOCTYPE html> 3<html> 4<head> 5 <meta charset="utf-8" /> 6</head> 7<body> 8 <h3>過去の書き込み情報</h3> 9 <?php 10 $file = @fopen('bbs.dat', 'rb') or die('bbsファイルが開けませんでした'); 11 flock($file, LOCK_SH); 12 print('<dl>'); 13 /* ここから--ファイルを行単位に読み込み-- */ 14 while ($row = fgetcsv($file, 1024, "/t")) { 15 print('<dt>'.e($row[1])); 16 print('('.e($row[0]).')</dt>'); 17 print('<dd>本文:'.e($row[2]).'<hr /><dd>'); 18 } 19 print('<dl>'); 20 flock($file, LOCK_UN); 21 fclose($file); 22 ?> 23<body> 24</html> 25

![イメージ説明]WIDTH:600

投稿2015/07/08 06:11

b1ackc0ffee

総合スコア267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

b1ackc0ffee

2015/07/08 06:12

最後の ?> は無視してください。
nanndemoiikara

2015/07/08 07:06 編集

追記しました。 /t がtypo \t
b1ackc0ffee

2015/07/08 09:19

有難うございます! 結構前に返事下さっていたのですね><、 なぜか今頃通知がきました。 かなり、多い間違いなのですが、気が付きませんでした><、 ご指摘有難うございます★ ついに思い通りの結果が返ってきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問