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

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

ただいまの
回答率

90.46%

  • PHP

    24603questions

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

  • HTML

    11908questions

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

  • HTML5

    5301questions

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

  • teratail

    446questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,820

b1ackc0ffee

score 197

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

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

[コード]
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>NEW掲示板</title>
</head>
<body>
<h3>ようこそNEW掲示板へ</h3>
<form method="POST" action="guest_write.php">
 <div id="container">
  <label for="name">名前:<label>
  <input type="text" id="name" name="name" size="20" maxlength="30" />
 </div>
 <div id="container">
  <label for="body">本文</label>
  <input type="text" id="body" name="body" size="70" maxlength="255" />
</div>
<input type="submit" value="送信" />
</form>
</body>
</html>
<?php
$file = fopen('bbs.dat', 'ab');
flock($file, LOCK_EX);
fputs($file, date('Y年 m月 d日 H:i:s')."\t");
fputs($file, $_POST['name']."\t");
sleep(5);
fputs($file, $_POST['body']."\n");
flock($file, LOCK_UN);
fclose($file);
header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SEVER['PHP_SELF']).'/guest_input.php');

宜しくお願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

header('Location: http://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/').'/guest_input.php');


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/08 12:26

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

    キャンセル

  • 2015/07/08 12:37

    解決したようで何よりです。

    キャンセル

  • 2015/07/08 13:42

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

    キャンセル

  • 2015/07/08 14:22 編集

    > 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'] : '' ;

    キャンセル

  • 2015/07/08 15:10

    ふみゅ。なるほどです。

    質問のところ以外にもご指摘くださり、非常に勉強になります。
    空送信できないようにするという事でしょうか?



    ちなみに、情報をリスト表示させてみたのですが、
    期待通りの結果になりません。
    本文のところにbodyの情報を入れたいのですがどこが間違っていますか?
    別枠でコメントしました。
    宜しくお願い致します。

    キャンセル

  • 2015/07/08 15:20

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

    キャンセル

  • 2015/07/08 15:39 編集

    > 空送信できないようにするという事でしょうか?
    いいえ。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値の検証です。

    キャンセル

  • 2015/07/08 18:40

    VOIDの重要性に関してまだ理解できていませんでした。
    空でも送信できてしまうから、
    空だと$_POSTでエラーになってしまうという事ですね!

    検証とは...(゜Q。)??
    http://www.itmedia.co.jp/im/articles/1111/07/news154.html
    参考にしました。
    ・セキュリティ対策?
    ・FALSE回避?
    というレベルですが、頑張ります!

    大変ありがとうございました★★

    キャンセル

  • 2015/07/09 09:17

    検証(バリデーション)は、セキュリティ対策ではなく仕様になります。
    例えばですが、今回のnameは必須、本文も必須で255文字以内の文字列という仕様であった場合
    if ( isset($_POST['name']) && $_POST['name'] !== '' )

    if ( isset($_POST['body']) && $_POST['body'] !== '' && mb_strlen($_POST['body']) <= 255 )
    みたいな形で上記の条件に当てはまらない場合はbbs.datに書き込ませず、エラーを発生させる等の処理です。
    入力値が仕様として正しいかを検証します。

    また、セキュリティ対策については「安全なWebアプリケーションの作り方」という本がかなりオススメです。

    キャンセル

  • 2015/07/09 10:50

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

    キャンセル

0

<?php require_once './Encode.php'; ?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
</head>
<body>
  <h3>過去の書き込み情報</h3>
  <?php
  $file = @fopen('bbs.dat', 'rb') or die('bbsファイルが開けませんでした');
  flock($file, LOCK_SH);
  print('<dl>');
  /* ここから--ファイルを行単位に読み込み-- */
  while ($row = fgetcsv($file, 1024, "/t")) {
    print('<dt>'.e($row[1]));
    print('('.e($row[0]).')</dt>');
    print('<dd>本文:'.e($row[2]).'<hr /><dd>');
  }
  print('<dl>');
  flock($file, LOCK_UN);
  fclose($file);
  ?>
<body>
</html>
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/08 15:12

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

    キャンセル

  • 2015/07/08 15:57 編集

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

    キャンセル

  • 2015/07/08 18:19

    有難うございます!
    結構前に返事下さっていたのですね><、
    なぜか今頃通知がきました。

    かなり、多い間違いなのですが、気が付きませんでした><、
    ご指摘有難うございます★

    ついに思い通りの結果が返ってきました!

    キャンセル

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

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24603questions

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

  • HTML

    11908questions

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

  • HTML5

    5301questions

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

  • teratail

    446questions

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