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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

Q&A

解決済

1回答

2141閲覧

php 条件分岐後に指定した番号の1文を消したい

退会済みユーザー

退会済みユーザー

総合スコア0

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

0グッド

0クリップ

投稿2019/08/17 02:06

編集2019/08/17 04:28

投稿フォームからの送信か、削除フォームからの送信かを条件分岐で判断し、
投稿フォームからであればテキストファイルに追記書き込み、削除フォームからなら指定番号と一致する投稿番号を削除。
削除する方法は、fileにテキスト内容を1行ずつ配列に入れて、foreachで配列を確認し、指定番号と投稿番号が一致していれば飛ばす。そうでなければ書き込むということを行う。

を目標にしているのですが今のままでは、
・ページを開くとすでに「Notice: Undefined index: deletenumber in /public_html/mission_3-3_new.php on line 77」というエラーが出ている。

・削除フォームに削除したい投稿番号を入れて送信すると、ブラウザ上の対象文は削除されるが新たに投稿番号が追記書き込みされてブラウザ上に表示される。テキストファイル内の対象文は削除されないうえに新たに投稿番号が追記される。
という問題が出ています。

どのようにそれば改善できるのか教えていただきたいです!!
似たような質問はすべて目を通したうえで自分とコードが違い理解できなかったため質問させていただきました…!

11:15 加筆修正しました
13:26 修正したコードを載せました

<?php define("COMMENT_LIST_FILE","mission_3-3_new.txt"); if(!empty($_POST["user"]) || !empty($_POST["comment"]) || !empty($_POST["deletenumber"])){ $date = date("y/m/d H:i"); //カウント用ファイルを開く $fp2 = fopen("count.txt","r"); $num_text = fgets($fp2);//1行目を文字列として読み込む fclose($fp2);//ファイルを閉じる $num_text +=1;//カウントを1増やす $fp2 = fopen("count.txt","w"); fwrite($fp2,$num_text);//新しい数値を書き込む fclose($fp2); //投稿内容用ファイルを開く $fp = fopen(COMMENT_LIST_FILE, "a"); $info = $num_text."<>".$_POST["user"]."<>".$_POST["comment"]."<>".$date; fwrite($fp, $info."\r\n"); fclose($fp); if($_POST["deletenumber"] === $num_text){ $comment_list = file(COMMENT_LIST_FILE);//テキストの1行ごとに配列に入れる $fp = fopen(COMMENT_LIST_FILE, "w");//テキストファイルを空にする fclose($fp); $fp3 = fopen(COMMENT_LIST_FILE, "a"); foreach($comment_list as $comment_data){//区切って1文ずつチェックする $splits = explode("<>",$comment_data); if($sptits[0] !== $num_text){ fwrite($fp3, $info."\r\n"); }else{ continue; } fclose($fp3); } } } ?> <!DOCTYPE html> <html lang="ja"> <html> <head> <meta charset="utf-8"> <title>mission3-3_new</title> </head> <body> <form action="mission_3-3_new.php" method="post"> 【 投稿フォーム 】<br> 名  前: <input type="text" name="user" value=""><br> コメント: <input type="text" name="comment" value=""><br> <input type="submit"><br><br> 【 削除フォーム 】<br> 投稿番号: <input type="text" name="deletenumber" value=""><br> <input type="submit" value="削除"><br><br> </form> 【 投稿一覧 】<br> </body> </html> <?php $hairetsu = file(COMMENT_LIST_FILE); foreach($hairetsu as $hensuu){ $splits = explode("<>",$hensuu); if($splits[0] !== $delete_number){ //投稿番号、氏名、コメント、日時を表示して改行する echo $splits[0].".".$splits[1].".".$splits[2].".".$splits[3]."<br>"; } //繰り返し処理はここまで } ?>

###修正後のコード

<?php define("COMMENT_LIST_FILE","mission_3-3_new.txt"); if(!empty($_POST["user"]) || !empty($_POST["comment"])){ $date = date("y/m/d H:i"); //カウント用ファイルを開く $fp2 = fopen("count.txt","r"); $num_text = fgets($fp2);//1行目を文字列として読み込む fclose($fp2);//ファイルを閉じる $num_text +=1;//カウントを1増やす $fp2 = fopen("count.txt","w"); fwrite($fp2,$num_text);//新しい数値を書き込む fclose($fp2); //投稿内容用ファイルを開く $fp = fopen(COMMENT_LIST_FILE, "a"); $info = $num_text."<>".$_POST["user"]."<>".$_POST["comment"]."<>".$date; fwrite($fp, $info."\r\n"); fclose($fp); if(!empty($_POST["deletenumber"])){ $comment_list = file(COMMENT_LIST_FILE);//テキストの1行ごとに配列に入れる $fp = fopen(COMMENT_LIST_FILE, "w");//テキストファイルを空にする fclose($fp); $fp3 = fopen(COMMENT_LIST_FILE, "a"); foreach($comment_list as $comment_data){//区切って1文ずつチェックする $splits = explode("<>",$comment_data); if($sptits[0] !== $_POST["deletenumber"]){ fwrite($fp3, $info."\r\n"); }else{ continue; } fclose($fp3); } } } ?> <!DOCTYPE html> <html lang="ja"> <html> <head> <meta charset="utf-8"> <title>mission3-3_new</title> </head> <body> <form action="mission_3-3_new.php" method="post"> 【 投稿フォーム 】<br> 名  前: <input type="text" name="user" value=""><br> コメント: <input type="text" name="comment" value=""><br> <input type="submit"><br><br> 【 削除フォーム 】<br> 投稿番号: <input type="text" name="deletenumber" value=""><br> <input type="submit" value="削除"><br><br> </form> 【 投稿一覧 】<br> </body> </html> <?php $comment_list = file(COMMENT_LIST_FILE); foreach($comment_list as $comment_data){ $splits = explode("<>",$comment_data); if($splits[0] !== $_POST["deletenumber"]){ //投稿番号、氏名、コメント、日時を表示して改行する echo $splits[0].".".$splits[1].".".$splits[2].".".$splits[3]."<br>"; } //繰り返し処理はここまで } ?>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/08/17 04:09

ベストアンサーを押したつもりが高評価ボタンだったんですね…!すみません!
m.ts10806

2019/08/17 04:14 編集

ただ、私の回答で本当に理解できて解決したのであれば、今回の質問は出なかったのでは、というのが私見です。(デバッグのことやPHPマニュアルのことまで言及しているので)
退会済みユーザー

退会済みユーザー

2019/08/17 04:30

デバックとphpマニュアルについては読んでいるところでまだ理解するに至っていないのですが、あの後なんとかデバイス上だけではありますが削除することが出来、残すはテキストファイル内の処理だけというところまできたので一応の解決ということにしようと思いました。 今回は新たに問題点が出たので質問したのですが、前回の回答で解決できるような問題だったんですね…理解しきれず申し訳ないです…!
guest

回答1

0

ベストアンサー

Notice

if(!empty($_POST["user"]) || !empty($_POST["comment"]) || !empty($_POST["deletenumber"]))$_POST["deletenumber"] に値が入っていなくても他が入っていたら通ります。

新たに投稿番号が追記書き込みされてブラウザ上に表示される。

//投稿内容用ファイルを開く の箇所で無条件に項目を追加しています。

削除されない

そのif文内に入っているかをデバッグして見ましょう。

投稿2019/08/17 02:15

kei344

総合スコア69364

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

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

kei344

2019/08/17 04:43

指摘がよくわからなかったのか無視されている物も有るようですが、「修正後」のコードで要件を満たしていると思うなら解決済みにしておいてください。
退会済みユーザー

退会済みユーザー

2019/08/17 07:41

返事が遅くなりすみません…! 修正後のコードは1つめの回答を受けて変えてみたもので、2つ目と3つ目の回答についてはどのように変えたらいいか試したり、デバックのやり方などを調べている途中なので反映されてないです…修正途中とすべきでした、すみません…。
kei344

2019/08/17 07:55

2つ目:無条件に追加していることが問題なので、条件をつけましょう。 3つ目:きちんと開発環境を整えるのが一番ですが、ひとまず「echo 'test';」とかすればそこを通ったかどうかが確認できますよ。
退会済みユーザー

退会済みユーザー

2019/08/17 17:36

ありがとうございます! 2つ目に関しては「$_POST[“user”]と$_POST[“comment”]どちらかが空でないとき」に動作するという条件にしたつもりなのですが、付け方が違うのでしょうか…? echo “test”; やってみたいと思います!
kei344

2019/08/18 02:21

削除も「$_POST[“user”]と$_POST[“comment”]どちらかが空でないとき」に動作するようにしたいのでしょうか。 また、登録の際は「$_POST[“user”]と$_POST[“comment”]どちらも空で無い」必要がありませんか。
退会済みユーザー

退会済みユーザー

2019/08/19 14:15

回答が遅くなりすみません…! 削除は「$_POST[“user”]と$_POST[“comment”]どちらも空で、$_POST["deletenumber"]に数字が入った時」に動作するようにしたいです! 登録のときはkei344さんのおっしゃる通り「$_POST[“user”]と$_POST[“comment”]どちらも空で無い」ですね…!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問