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

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

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

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

Q&A

解決済

1回答

1776閲覧

掲示板での投稿機能を付け投稿番号を最後の行+1にしたい

MakotoIshizawa

総合スコア32

PHP

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

0グッド

0クリップ

投稿2019/09/16 08:52

前提・実現したいこと

以前質問して解決したはずの内容です。
https://teratail.com/questions/210922

投稿の部分だけ取り出し別のファイルにコードを書き換え、txtファイルも別にしました。

発生している問題・エラーメッセージ

番号が+1にならない且つ投稿すら出来ない状態です。
foreachが効かず、配列じゃないよとエラーが返され、
file関数の直後にvar_dumpで中身を見るとbool(false)と表示されました。

一方で、txtファイルの中身を直接開いて見ると
1<>まこと<>テスト 
<>2019-09-16 17:09
1<>まこと<>テスト 
<>2019-09-16 17:30
と書いてあります。

該当のソースコード

php

1<?php 2/*フォームで送信された値を受け取り、テキストファイルに保存する。 3 その際1行ごとに「{番号}<>{名前}<>{コメント}<>{投稿された時間}」と言う形で保存する*/ 4/*もしポストで送信されたら以下の処理を行いGET送信でリダイレクトする(更新時の二重書き込み防止)*/ 5if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) { /*もしPOSTで送信されたら*/ 6 /*変数の定義*/ 7 $filename = "bangou.txt"; /*保存するファイル*/ 8 $name = $_POST[ "name" ] ; /*投稿者の名前*/ 9 $comment = $_POST[ "comment" ] ; //投稿コメント 10 $date = date( "Y-m-d H:i" ); /*投稿日時*/ 11 12 $search = "<>"; //置き換え時の検索文字 13 $replace = "&lt;&gt;"; //置き換える文字 14 15 /*投稿番号の定義*/ 16 if ( file_exists( $filename ) ) { /*ファイルの存在確認。*/ 17 //最後の行にプラス1 18 $ret_array = file( $filename ); 19 $lastline = $ret_array[ count( $ret_array ) - 1 ]; 20 $num = explode( '<>', $lastline ); 21 $lastnum = $num[ 0 ] + 1; 22 } else { /*ファイルが無かった場合変数の定義を1とする*/ 23 $lastnum = 1; 24 } 25 26 //書き込み内容 27 $hozon = $lastnum . "<>" . str_replace( $search, $replace, $_POST[ 'name' ] ) . "<>" . str_replace( $search, $replace, $_POST[ 'comment' ] ) . "<>" . $date . "\n"; 28 29 //投稿部分 30 if ( !empty( $name ) && !empty( $comment ) ) { /*もし名前とコメントが空でなかったら*/ 31 file_put_contents( $filename, $hozon , FILE_APPEND | LOCK_EX);//排他ロックをかけ追記モードで書き込み 32 } 33 header( 'Location: bangou.php' ); 34 exit; 35} 36?> 37<!doctype html> 38<html lang="ja"> 39<head> 40<meta charset="utf-8"> 41<title>簡易掲示板</title> 42</head> 43 44<body> 45<p> 46<form action="bangou.php" method="post" > 47 <label for="name-field">お名前<span style="color: red;">【必須】</span><br> 48 </label> 49 <input type="text" name="name" id="name-field" required="required" 50 51 52 53 54 </p> 55 <p> 56 <label for="comment">コメント<span style="color: red;">【必須】</span></label> 57 <br> 58 <textarea name="comment" cols="30" rows="3" id="comment" required="required">  59</textarea> 60 </p> 61 <input type="submit" value="投稿"> 62</form> 63<?php 64//if ( file_exists( $filename ) ) { 65 $ret_array = file( $filename ); 66 var_dump($ret_array); 67 /*foreach ( $ret_array as $value ) { 68 $bunkatu = explode( "<>", $value ); 69 foreach ( $bunkatu as $value2 ) { 70 echo $value2 . "<br>\n"; 71 } 72 }*/ 73/*} else { 74 echo "まだ投稿はありません"; 75}*/ 76?> 77</body> 78</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、htmlのおかしいところの指摘から。
nameのinput要素、閉じてないのはダメ。
p要素とform要素の組み合わせがおかしいのもダメ。

<body> <form action="bangou.php" method="post" > <label for="name-field">お名前<span style="color: red;">【必須】</span><br /></label> <input type="text" name="name" id="name-field" required="required" /> <label for="comment">コメント<span style="color: red;">【必須】</span><br /></label> <textarea name="comment" cols="30" rows="3" id="comment" required="required" /> <input type="submit" value="投稿"> </form>

さらに、この箇所のまずいところ、commentに改行コードを含んでいたらエスケープしないで連結して、
結果的にデータファイルを壊してしまうところ。

//書き込み内容 $hozon = $lastnum . "<>" . str_replace( $search, $replace, $_POST[ 'name' ] ) . "<>" . str_replace( $search, $replace, $_POST[ 'comment' ] ) . "<>" . $date . "\n";

改行コードを認めないのであれば、"\n""\r"が含まれていたら削除するようにすればいいし、
認めるのであれば別の文字列に置き換える(例えば<<改行>>とか、そこはご自由に)こと。

せっかくなので、例えばこんなやり方。

$search = array("\r\n", "\r", "\n", "<>"); //置き換え時の検索文字 $replace = array("<<改行>>", "<<改行>>", "<<改行>>", "&lt;&gt;"); //置き換える文字

などとしておけば、ひとまずOK? 詳しくは PHP: str_replace - Manual 参照。
これをやったら、もちろん、表示用処理も工夫しないと表示できませんよ。

ってか、冒頭で

$comment = $_POST[ "comment" ] ; //投稿コメント

してるのに、$hozonを作るところでまた$_POST["comment"]から参照してるの、もったいないね。

投稿2019/09/16 09:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

MakotoIshizawa

2019/09/16 10:02

ありがとうございます。 inputタグが閉じられていないことに気づかないなんて自分で驚きました。 名前入力欄とコメントの文字をの間に改行したい場合は、CSSで加工するんでしょうか。 それとも改行タグでしょうか。
MakotoIshizawa

2019/09/16 10:03

$hozonのところは質問を投稿した直後に気づいて直しました。
MakotoIshizawa

2019/09/16 10:07

なるほど、コメントで改行を入れてたせいでコメントの後が改行になってて、その御蔭でその後の処理も思っうようにいかなかったわけですね
MakotoIshizawa

2019/09/16 10:08

今日はもう時間がないので後日修正を試みます。 何度も助けていただいてありがとうございます。
MakotoIshizawa

2019/09/18 06:18

番号は解決しましたが、また新たな問題が出てしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問