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

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

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

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

HTML

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

Q&A

解決済

1回答

164閲覧

削除したらその場所に一つ上にあるデータが記載されてしまう

-ria-

総合スコア10

PHP

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

HTML

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

0グッド

1クリップ

投稿2019/03/06 13:38

前提・実現したいこと

*条件にあった投稿番号の削除だけを行いたい。
*削除した際にその空いた部分にデータを入れない

現在、
1.
2.
3.
とtxtにデータがあって、2を削除すると
1.
1.
3.
と2があった場所に一つ上のデータが書かれてしまいます。
どこをいじればよくなりますか?
教えて頂ければ、幸いです。

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

<?php $message = $_POST['message']; $name = $_POST['name']; $hidden= $_POST['hide']; $delete = $_POST['delete']; $edit = $_POST['change']; $time = date("Y/m/d H:i:s"); $password1 = $_POST['pw1'];//記入欄パスワード $filename='mission_2-5.txt'; $lines = file( $filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ); if(file_exists($filename)){ $count=count(file($filename))+1; }else{ $count=1; } $line =$count."<>".$name."<>".$message."<>".$time."<>".$password1; //編集編[記入編] if(!empty($hidden) && !empty($password1)){ $fp2=fopen($filename,'w'); foreach($lines as $line){ $pomo=explode("<>",$line);//<>なくし //hiddenとファイル番号とパスワードが合う時、書き込む if($pomo[0]==$hidden && $pomo[4]==$password1){ echo "編集完了しました。"; $line2=$hidden."<>".$name."<>".$message."<>".$time."<>".$password1; }elseif($pomo[0]==$hidden && $pomo[4]!==$password1){ echo"パスワードが間違っています。初めからやり直してください。"; $line2 =$pomo[0]."<>".$pomo[1]."<>".$pomo[2]."<>".$pomo[3]."<>".$pomo[4]; }elseif($pomo[0] !== $hidden){ $line2 =$pomo[0]."<>".$pomo[1]."<>".$pomo[2]."<>".$pomo[3]."<>".$pomo[4]; } fwrite($fp2,$line2."\n"); } fclose($fp2); //記入編(2-1) }elseif(!empty($name) && !empty($message) && !empty($password1)){ $fp=fopen($filename,'a'); fwrite($fp,$line."\n"); fclose($fp); echo $_POST["message"]."を受け付けました。<br>"; echo date("Y/m/d g:i")."に受理いたしました。<br> Thank you!<br>"; } //削除編(2-3) $password2 = $_POST['pw2'];//削除のパスワード if (!empty($delete) && !empty($password2)) { $lines = file( $filename,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ); $fp3=fopen($filename,'w'); //ファイル内を空っぽにする(保存しない) foreach($lines as $line){ $pom=explode("<>",$line); if($pom[0]===$delete && $pom[4]===$password2){ array_splice($lines, $j, 1); echo "削除されました。"; }elseif($pom[0]===$delete && $pom[4]!=$password2){ echo "パスワードが違います。初めからやり直してください。"; $line3=$pom[0]."<>".$pom[1]."<>".$pom[2]."<>".$pom[3]."<>".$pom[4]; }elseif($pom[0]!==$delete){ $line3=$pom[0]."<>".$pom[1]."<>".$pom[2]."<>".$pom[3]."<>".$pom[4]; } fwrite($fp3,$line3."\n"); } fclose($fp3); } // 編集編(2-4) $editが'0'のときif文通らない $password3 = $_POST['pw3'];//編集のパスワード if (!empty($edit) && !empty($password3)) { $lines = file( $filename,FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ); foreach($lines as $line){ $poma = explode("<>", $line); if ($poma[0] == $edit && $poma[4]==$password3){//一致の際 for($h = 0; $h < count($poma); $h++){ $simEdit[$h] = mb_substr(trim($poma[$h]), 0); } }elseif($poma[0]==$edit && $pomo[4]!==$password3){ echo "パスワードが間違っています。初めからやり直してください。"; } } } ?> <!DOCTYPE html> <html lang="ja"> <head> <title>mission2-4</title> <meta charset="utf-8"> </head> <boby> <form method="POST" action=""> <p>名前:<br> <input type="text" name="name" value="<?php echo $simEdit[1]; ?>"placeholder="名前"></p> <p>コメント:<br> <input type="text"name="message" value="<?php echo $simEdit[2]; ?>" placeholder="コメント"></p> <p>パスワード:<br> <input tyep="text" name="pw1" value="<?php echo $simEdit[4]; ?>" placeholder="パスワード"></p> <input type="hidden" name="hide" value="<?php echo $simEdit[0]; ?>" > <br> <input type="submit" value="送信"> <br> <p>削除対象番号:<br> <input type="text" name="delete" placeholder="削除番号(半角)"></p> <input tyep="text" name="pw2" placeholder="パスワード"> <input type= "submit" value="削除"> <br> <p>編集対象番号:<br> <input type='text' name="change" placeholder="編集番号(半角)"></p> <input tyep="text" name="pw3" placeholder="パスワード"> <input type= "submit" value="編集"> <br> </form> <br> <?php //表示編(2-2) // 取得したファイルデータ(配列)を全て表示する $line =$count."<>".$name."<>".$message."<>".$time."<>".$password1; $lines = file( $filename ); foreach($lines as $line){ $poo=explode("<>",$line); echo $poo[0].$poo[1]."/".$poo[2].$poo[3]. "<br/>\n"; } ?> </boby> </html>

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

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

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

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

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

FKM

2019/03/06 15:10

これ、全部じゃないですよね?array_splice()の中にある$jが未定義だし、削除フラグを実施した場合fwriteの$line3も未定義なので、このままだと値が入ってきません。バグの原因について、ある程度仮説は立てているのですが、検証材料がもっとほしいです。
m.ts10806

2019/03/06 19:57

インデントはきちんと揃えられた方が良いかと。 開始と閉じが分かりづらいですし、不具合検証や問題の切り分けを難しくします。
guest

回答1

0

自己解決

無事に解決いたしました。
削除編での fwrite($fp3,$line3."\n"); の場所が悪かっただけです。
この状態だと「if-elseif-elseif」の分岐外で行われることで削除した後にも直前の1行をコピーする形で動いてしまうそうです。
ですので、$line3の後にfwrite($fp3,$line3."\n");を書くことで解決しました。

また、array_splice($lines, $j, 1);に関しては私の消し忘れです。申し訳ございません。

ご回答頂いた方々。大変ありがとうございました。

投稿2019/03/07 09:19

-ria-

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問