🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

1回答

803閲覧

掲示板で、すでに投稿されたものを編集する機能

MakotoIshizawa

総合スコア32

PHP

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

0グッド

0クリップ

投稿2019/09/30 09:40

編集2019/10/01 05:57

掲示板の編集機能をつけています。
編集対象番号のフォームで番号を送信し、
その番号の名前とコメントが元の投稿用フォームに表示される様にしたいです。

以下のように書いてみましたが、何が悪いのかわかりません。
編集用のコードの場所も変えてみましたが何も変わりありません。

何が悪いのでしょうか。
すみませんPHPのバージョンはまだ5.2.4です。

追記
別のファィルでテストしてちゃんと表示されました。
下のコードがそれです。
ということは送信或いはPOSTデータの取得がダメそうです。

php

1<?php 2/*もしポストで送信されたら以下の処理を行いGET送信でリダイレクトする(更新時の二重書き込み防止)*/ 3if ( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) { /*もしPOSTで送信されたら*/ 4 5 /*フォームで送信された値を受け取り、テキストファイルに保存する。 6 その際1行ごとに「{番号}<>{名前}<>{コメント}<>{投稿された時間}」と言う形で保存する*/ 7 //変数の定義 8 $filename = "keijiban.txt"; /*保存するファイル*/ 9 $name = $_POST[ 'name' ]; /*投稿者の名前*/ 10 $comment = $_POST[ 'comment' ]; /*投稿するコメント*/ 11 $date = date( "Y-m-d H:i" ); /*投稿日時*/ 12 $search = array( "\r\n", "\r", "\n", "<>" ); //置き換え時の検索文字 13 $replace = array( "<<改行>>", "<<改行>>", "<<改行>>", "&lt;&gt;" ); //置き換える文字 14 $deleteNO = $_POST[ 'deleteNO' ]; //削除番号の変数定義 15 16 17 //投稿番号の定義 18 if ( is_file( $filename ) ) { /*ファイルの存在確認。*/ 19 //最後の行にプラス1 20 $ret_array = file( $filename ); 21 $lastline = $ret_array[ count( $ret_array ) - 1 ]; 22 $num = explode( '<>', $lastline ); 23 $lastnum = $num[ 0 ] + 1; 24 } else { /*ファイルが無かった場合変数の定義を1とする*/ 25 $lastnum = 1; 26 } 27 28 //書き込み内容 29 $hozon = $lastnum . "<>" . str_replace( $search, $replace, $name ) . "<>" . str_replace( $search, $replace, $comment ) . "<>" . $date . "\n"; 30 31 //投稿部分 32 if ( !empty( $name ) && !empty( $comment ) ) { /*もし名前とコメントが送信されたら*/ 33 $fp = fopen( $filename, "a" ); /*追記モードでファイルを開く*/ 34 if ( flock( $fp, LOCK_EX ) ) { /*ロックする*/ 35 fwrite( $fp, $hozon ); /*指定したファイルに追記モードで書き込み*/ 36 } 37 flock( $fp, LOCK_UN ); 38 fclose( $fp ); 39 } 40 41 //削除部分 42 if ( !empty( $deleteNO ) ) { //もし、削除番号がポスト送信されたら 43 $ret_array = file( $filename ); //ファイルを配列として読み込む 44 $fp = fopen( $filename, "w" ); 45 if ( flock( $fp, LOCK_EX ) ) { 46 foreach ( $ret_array as $value ) { //ループ 47 $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 48 if ( $deleteNO !== $bangou[ 0 ] ) { //もし読み込んだ番号と送信した番号が違ったら 49 fwrite( $fp, $value ); //ファイルに書き込む 50 } 51 } 52 } 53 flock( $fp, LOCK_UN ); //ロック開放 54 fclose( $fp ); 55 } 56 header( 'Location: keijiban.php' ); 57 exit; 58} 59?> 60<!doctype html> 61<html lang="ja"> 62<head> 63<meta charset="utf-8"> 64<title>簡易掲示板</title> 65<script> 66window.addEventListener('DOMContentLoaded', function(){ 67 document.querySelector('#delbtn').addEventListener('click',function(e){ 68 if(!confirm('本当に削除しますか?')){ 69 alert('キャンセルされました'); 70 e.preventDefault(); 71 } 72 }); 73}); 74</script> 75</head> 76 77<body> 78 <?php 79 //編集部分 80 $filename = "keijiban.txt"; 81 $hensyuNO = $_POST[ 'hensyuNO' ]; //編集番号の定義 82if (!empty($hensyuNO)){//もし編集用の番号が送信されたら*/ 83 $ret_array = file( $filename ); //ファイルを配列として読み込む 84 foreach ( $ret_array as $value ) { //ループ 85 $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 86 if ( $hensyuNO == $bangou[ 0 ] ) { //送信と書き込みの番号が同じなら 87 $Hno = $bangou[ 0 ]; 88 $Hname = $bangou[ 1 ]; 89 $Hcomment = $bangou[ 2 ]; 90 $Hdate = $bangou[ 3 ]; 91 } 92 } 93} 94 ?> 95<!--投稿フォーム--> 96<form method="post" > 97 <label for="name-field">お名前<span style="color: red;">【必須】</span><br> 98 </label> 99 <input type="text" name="name" id="name-field" required="required" value="<?php echo $Hname; ?>"> 100 <label for="comment">コメント<span style="color: red;">【必須】</span></label> 101 <br> 102 <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php 103 echo $Hcomment; 104 ?> 105</textarea> 106 <input type="submit" value="投稿"> 107</form> 108<!--削除番号指定用フォーム--> 109<form method="post" name="sakujo"> 110 <label for="deleteNO" >削除対象番号</label> 111 <input type="text" name="deleteNO" id="deleteNO" > 112 <input name="btn" type="submit" value="削除" id="delbtn"    > 113</form> 114 115<!--編集番号指定用フォーム--> 116<form method="post"> 117 <label for="hensyuNO" >編集対象番号</label> 118 <input type="text" name="hensyuNO" > 119 <input type="submit" value="編集" > 120</form> 121<?php 122$filename = "keijiban.txt"; 123$search = array( "<<改行>>", "&lt;&gt;" ); //置き換え時の検索文字 124$replace = array( "<br>", "<>" ); //置き換える文字 125 126if ( is_file( $filename ) ) { //ファイルの存在確認 127 $ret_array = file( $filename ); //配列として読み込む 128 if ( empty( $ret_array ) === false ) { //配列があれば 129 foreach ( $ret_array as $value ) { //ループ 130 $bunkatu = explode( "<>", $value ); //<>で分割する 131 foreach ( $bunkatu as $value2 ) { //ループ 132 echo str_replace( $search, $replace, $value2 ) . "<br>\n"; //投稿内容を表示(<<改行>>と&lt;&gt;を<br>と<>に置き換える) 133 } 134 } 135 } else { //配列がなければ 136 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 137 } 138} else { //ファイルが存在しなければ 139 echo "まだ投稿はありません"; //「まだ投稿がありません」と表示させる 140} 141 142?> 143</body> 144</html>

php

1<!doctype html> 2<html> 3<head> 4<meta charset="utf-8"> 5<title>テスト</title> 6</head> 7 8<body> 9 <?php 10 //編集部分 11 $filename = "keijiban.txt"; 12 $hensyuNO = $_POST[ 'hensyuNO' ]; //編集番号の定義 13 $ret_array = file( $filename ); //ファイルを配列として読み込む 14 foreach ( $ret_array as $value ) { //ループ 15 $bangou = explode( "<>", $value ); //<>で分割し投稿番号取り出す 16 $Hno = $bangou[ 0 ]; 17 $Hname = $bangou[ 1 ]; 18 $Hcomment = $bangou[ 2 ]; 19 $Hdate = $bangou[ 3 ]; 20 } 21 22 var_dump($Hname); 23 ?> 24<form method="post" > 25 <label for="name-field">お名前<span style="color: red;">【必須】</span><br> 26 </label> 27 <input type="text" name="name" id="name-field" required="required" value="<?php echo $Hname;?>"> 28 <label for="comment"> 29 コメント<span style="color: red;">【必須】</span> 30 </label> 31 <br> 32 <textarea name="comment" cols="30" rows="3" id="comment" required="required"><?php 33 echo $Hcomment; 34 ?> 35</textarea> 36 <input type="submit" value="投稿"> 37</form> 38<form method="post"> 39 <label for="hensyuNO" >編集対象番号</label> 40 <input type="text" name="hensyuNO" > 41 <input type="submit" value="編集"> 42</form> 43</body> 44</html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

何が悪いのかわかりません。

見た感じ1ファイルにデータを集約させているように見えますが
1投稿1ファイルなどにしないと初心者にはハードル高いかもしれません

投稿2019/09/30 09:57

yambejp

総合スコア116694

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

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

MakotoIshizawa

2019/10/01 05:04

テスト用のファィルを別に作り、まず名前欄コメント欄で文字が表示されることを確認しました。 そして変数$Hname="名前" $Hcomment="コメント"を定義しての表示も出来ました。 そこでもしやテキストファイルが適切に読み込まれていないのではないかと思い、元のファイルの$filenameをvar_dumpしてみました。 結果は string(12) "keijiban.txt" でした。 なぜなのか今調べています。
MakotoIshizawa

2019/10/01 05:10

1投稿というのは一つのフォームを指しますか?
MakotoIshizawa

2019/10/01 05:47

file関数でこのstring(12) "keijiban.txt"をというファイルを配列として読み込んでという指定なんですね。 変数を定義した時点で中身が読み込まれると勘違いしていました。
MakotoIshizawa

2019/10/01 06:53

テスト用ファイルでは番号を指定して投稿内容を表示させるところまで成功
MakotoIshizawa

2019/10/01 07:13

元のファイルにコピペして送信しても$ret_arry $HnameともにNULL もしかしたら二重投稿を防止する目的で書いた冒頭のリロードがだめなのかと思い、それを外したら出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問