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

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

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

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

Q&A

解決済

1回答

9352閲覧

php掲示板で編集機能を実行したいです。

blink_program

総合スコア7

PHP

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

0グッド

0クリップ

投稿2019/11/06 15:47

前提・実現したいこと

php掲示板で編集機能を実行したいです。

1.POST送信で「編集対象番号」を送信。受信する際は、if文で既存の各フォームとはまた別に「編集フォーム」で処理を分岐させる

2.ファイル読み込み関数で、ファイルの中身を1行1要素として配列変数に代入する。 ファイルを開き、先ほどの配列の要素数(=行数)だけループさせる

3.ループ処理内:区切り文字「<>」で分割して、投稿番号を取得

4.同・ループ処理内:投稿番号と編集対象番号を比較。イコールの場合はその投稿の「名前」と「コメント」を取得

5.既存の投稿フォームに、上記で取得した「名前」と「コメント」の内容が既に入っている状態で表示させる

6.既存の投稿フォーム内に「いま送信された場合は新規投稿か、編集か(新規登録モード/編集モード)」を判断する情報を追加する

7.編集内容が問題ない場合:投稿番号と編集対象番号を比較して、等しい場合は、ファイルに書き込む内容を送信内容に差し替える

8.上記でフォームに追加した情報が、ブラウザから見えてしまう場合は、type属性をhiddenに変更して見えなくする

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

うまく実行されなくて困ってます。

該当のソースコード

php

1<html> 2<head> 3<meta charaset = "utf-8"> 4</head> 5 <body> 6 <form action = "mission_3-4.php" method="post"> 7 名前: 8 <input type="text" name="name"><br/> 9 10 コメント: 11 <input type="text" name="comment"><input type="submit" value="送信" ><br/> 12 13 削除: 14 <input type="text" name="delete" placeholder="削除対象番号"> 15 16 <input type="submit" value="削除"><br/> 17 18 編集: 19 <input type="text" name="edit" placeholder="編集対象番号"> 20 21 <input type="submit" value="編集"><br/> 22 </form> 23 24<?php 25 $name = $_POST["name"]; //コメントフォーム 26 $comment = $_POST["comment"]; //名前フォーム 27 $delete = $_POST["delete"] ; //削除フォーム 28 $edit = $_POST["edit"]; //編集フォーム 29 $date = date('Y年m月d日 H時i分'); //日付 30 $filename = "mission_3-4.txt"; //テキストファイル 31 32 //投稿機能 33 34 if(empty($name)==false&&empty($comment)==false){ //もし$nameと$commentが空じゃなかったら 35 $ret_array=file($filename); //テキストファイルを読み込み 36 $d=$ret_array === false ? 1: count($ret_array)+1; 37 $a=$d."<>".$name."<>".$comment."<>".$date; //投稿番号、名前、コメント、日付 38 $fp=fopen($filename,'a+'); //読み込みと追加書き込み 39 fwrite($fp,$a.PHP_EOL); //書き込み 40 fclose($fp); 41 } 42 43 //削除機能 44 45 if(empty($delete)==false){ //もし$deleteが空じゃなかったら 46 $ret_array=file($filename); //テキストファイルを読み込み 47 $kakikomi=fopen($filename,'w'); //上書き書き込み 48 for($i=0; $i<count($ret_array);$i++){ //ループ 49 if($i==$delete-1){ //削除番号と投稿番号が一致したら 50 continue; 51 } 52 fwrite($kakikomi,$ret_array[$i]); //書き込み 53 } 54 fclose($kakikomi); 55 } 56 57 //編集機能 58 59 if(empty($edit)==false){ //$editが空じゃなかったら 60 $ret_array=file($filename); //ファイル読み込み 61 for($i=0; $i<count($ret_array);$i++){ //ループ処理 62 $ex=explode("<>",$ret_array[$i]); 63 if($i==$edit-1){ //投稿番号と編集番号が一致したら 64 $editnumber=$ex[0]; 65 $editname=$ex[1]; 66 $editcomment=$ex[2]; 67 } 68 } 69 $eded=$editnumber."<>".$editname."<>".$editcomment; 70 } 71 72 if(empty($edit)==false&&empty($name)==false&&empty($comment)==false){ 73 //削除番号と$nameと$commentが空じゃなかったら 74 $editel=file($filename); //ファイル読み込み 75 $kakikomi=fopen($filename,'w'); //上書き書き込み 76 for($i=0; $i<count($editel);$i++){ //ループ処理 77 $plode=explode("<>",$editel); 78 if($i==$edit-1){ //一致したら 79 $d=$editel === false ? 1 : count($editel)+1; 80 $a=$d."<>".$name."<>".$comment."<>".$date; 81 fwrite($kakikomi,$a.PHP_EOL); //差し替え 82 } 83 else{ //一致しなかったら 84 fwrite($kakikomi,$plode); //新規投稿 85 } 86 } 87 fclose($kakikomi); 88 } 89 90?> 91 92<?php 93 94 $ret_array=file($filename); 95 for($i=0; $i<count($ret_array);$i++){ 96 $ex=explode("<>",$ret_array[$i]); 97 echo $ex[0].$ex[1].$ex[2].$ex[3]."<br>"; 98 } 99 100?> 101 </body> 102</html>

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

takasima20

2019/11/06 15:58

名前とコメントが入力されてたら無条件に追加するのはだめなんじゃないかなあ。なにがどう「うまく実行されな」いのかわかりませんが。
javahack

2019/11/06 17:14

「うまく実行されなくて困ってます」では何も伝わりません。 想定結果と実際の結果、1~8のどこまで想定通りに動作しているか、 エラーが出ているならエラーメッセージを質問に追記してください。
m.ts10806

2019/11/06 22:12

過去質問に幾度となく投稿されています(簡易掲示板) 必ずどこかにヒントはあるはずです。
mari.rinn

2019/11/07 01:16

フローチャート(?)を拝見するに、これをそもそも1つのファイルで済まそうとしてるから余計にややこしいといいますか、どこで問題が起きてるのかもわかりにくくなります。 編集は編集で別ファイルに分けて、とりあえずまずは新規の書き込みとログの表示はちゃんと問題なく出来ているかをチェックして、編集は別ファイルの方で処理した方が良いと思いますけども。
Y.H.

2019/11/07 01:24

この「簡易掲示板」ってどこで教材として使われているんですかね。 もし差し障りなければ情報として質問に追記いただけないでしょうか。
guest

回答1

0

ベストアンサー

問題点が質問者側から明示されていないため、単なるデバッグ作業依頼にもなっていないのですが、
それでも問題点がいくつか見えているところのみ指摘する程度にお茶を濁そうかと思います。

1)empty()で変数無いデータの存在判定をするのはダメ
empty()を使わずisset()を使うようにします。
その理由は→PHP isset, empty, is_null の違い早見表 - Qiita

2)投稿機能で、$nameと$commentにデータが有るだけでファイルに書き出しているのはダメ
もしも、名前データやコメントデータに「<>」が入力されたら、
投稿データの「<>」とデータ管理上の区切りである「<>」の区別が付きません。
この場合、名前やコメントに区切り記号が含まれていたら拒否するか、
含まれていても差し支えないよう記号をエンコードして持たせるよう仕様を拡張する必要があります。

3)投稿番号ってチェックしないの?
せっかく投稿データに投稿番号をつけているのに、
for()ループのカウンター値だけで削除したらダメです。
1,2,3,4,5の3を削除したら1,2,4,5があるわけで、
その時4を削除しようとしたら5が消えてしまいます。
投稿データを読み込んで処理するとき、1行ずつexplode()で投稿データから投稿番号を取り出します。

4)そもそも投稿番号を投稿データ件数+1で生成してはダメ
3)にも通じる話ですが、削除で投稿番号が歯抜けになるのだから、
投稿データに含まれる投稿番号の最大値+1を使うべき。

5)投稿データファイルへのアクセスには、排他ロックを使いましょう
同時アクセスしたときに、排他ロックを使っていないとデータファイルが壊れます。
PHP: flock - Manual
で LOCK_EX を使って読み書きするべきで、
file()やfile_get_contents()やfile_put_contents()などは排他ロックはかかりません。
fopen()、fgets()/fputs()、fclose()使うときにいっしょにflock()しましょう。

・・・ってな話は、たぶんteratailの過去の質問への回答にもよく出てくる話題ですので。

投稿2019/11/07 01:49

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/11/11 02:08

回答内容について不明点や追加の質問など、なにもないの?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問