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

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

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

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

Q&A

解決済

1回答

1451閲覧

削除機能のニュアンスを変更したいです。

takakuni

総合スコア19

PHP

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

0グッド

0クリップ

投稿2019/03/04 03:30

編集2019/03/04 04:14

前提・実現したいこと

削除機能について実装したいです。
一応、削除機能としては備わっているのですが、自分の幅を広げるために、ニュアンスを変更した形でも実装したいと考えています。
ここに質問の内容を詳しく書いてください。
簡易掲示板の作成中です。
今備わっている、削除機能は、削除番号を指定し、指定された番号に基づいて上書き(削除しました)と表示されるものになっています。

この、機能をファイルの内容を取り出して、ファイルを一度空にして、行ごとにファイルに書き込んでいく(ただし削除番号と一致する場合は書き込まない)ような機能に変更したいです。

php

1if ($_SERVER['REQUEST_METHOD'] == 'POST') { 2 $value = $_POST['mode']; 3 switch( $value ){ 4 case "insert": 5 $name = $_POST['name']; 6 $comment = $_POST['comment']; 7 $time = date('Y年m月d日 H時i分s秒'); 8 if (file_exists($filename)) { 9 $number = count(file($filename))+1; 10 } else { 11 $number = 1; 12 } // ファイルがあれば、番号は+1した値を代入、なかったら、番号は1 13 $datalist = $number."<>"."\t".$name."<>"."\t".$comment."<>"."\t".$time."\n"; 14 $fp = fopen($filename, 'a'); // 変数filenameを追記モードで開き、変数fpに代入 15 fwrite($fp, $datalist); // 変数fpに変数datalistに書き込まれたデータを代入 16 fclose($fp); // 変数をfpを閉じた。 17 break; 18 case "delete": 19 $delete = $_POST["delete"]; // 変数deleteを宣言して投稿されたdeleteを代入する 20 $delCon = file($filename); // delConを宣言する。変数のfilenameを配列化して代入 21 $fp = fopen($filename, "w"); //php内で変数fpを宣言してファイルを作成、書き込みモードで開く 22 for ($j = 0; $j < count($delCon); $j++) { // ループの初期化、変数delConの要素数より少ない分ループを行う。行った後はループを1足す。 23 $delData = explode("<>", $delCon[$j]); // 変数delDateを宣言して 24 if ($delData[0] != $delete) { 25 fwrite($fp, $delCon[$j]); 26 } else { 27 fwrite($fp, "消去しました。\n"); 28 } 29 } 30 fclose($fp); 31 break; 32 } 33 } 34?>

html

1<body> 2<form action="" method="post"> 3 名前: <input type="text" name="name"> 4 コメント: <input type="text" name="comment"> 5 <button type="submit" name="mode" value="insert">登録する</button> 6 7 削除対象番号:<input type="text" name="delete"> 8 <button type="submit" name="mode" value="delete">削除する</button> 9 </form> 10</body>

php

1 <?php 2 if (file_exists($filename)) { 3 $datalists = file($filename); 4 foreach ($datalists as $value) { 5 list($number, $name, $comment, $time) = explode("<>", $value); 6 echo h($number); 7 echo h($name); 8 echo h($comment); 9 echo h($time); 10 echo nl2br("\n"); 11 } 12 }else{ 13 echo "コメントが1件もありません"; 14 } 15 16 ?>

試したこと

削除番号の指定用フォームは作れていると思う
ファイル内容の取り出しはfile関数でできていると思う
一度ファイルを空にするのはfopen関数のwでできていると思う

行ごとにファイルに書き込んでいく(ただし削除番号と一致する場合は書き込まない)ような機能がよくわかっていないと思います。

https://teratail.com/questions/137315
一通り、この記事を読んだのですが、よくわかりませんでした。

追加で、

php

1 if ($delDate[0] != $delete) { 2 fwrite($fp, $delCon[$j]); 3 } else { 4 fwrite($fp, "消去しました。\n"); 5 } 6 }

の部分が自分でもよくわかっていないので教えていただきたいです。

よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2019/03/04 03:49

あれ、これはできてるんですよね? 何が問題でどう分かりませんか?
退会済みユーザー

退会済みユーザー

2019/03/04 03:51

date(日付?) なのか data(データ?なんの?) なのか読んでて読みづらいのも混乱の元だから変数名をわかりやすい方向に直すと良いよ。
m.ts10806

2019/03/04 03:55

勘違いしました、「書き込まない」か。
m.ts10806

2019/03/04 03:56

dataのtypoっぽいですね。
takakuni

2019/03/04 04:10

delDataに変更しました!
m.ts10806

2019/03/04 04:11

質問修正してからコメントいただけたらと・・。
takakuni

2019/03/04 04:14

すいません。。順番間違えました。。。
guest

回答1

0

ベストアンサー

試してないですが、下記のような感じではないでしょうか。
※変数名を意味あるように修正しています。

php

1$delCon = file($filename); 2$fp = fopen($filename, "w"); 3for ($j = 0; $j < count($delCon); $j++) { 4 $delData = explode("<>", $delCon[$j]); 5 if ($delData[0] == $delete) continue; 6 7 fwrite($fp, $delCon[$j]); 8} 9fclose($fp);

continue

ループ構造において現在の繰り返しループ の残りの処理をスキップし、条件式を評価した後に 次の繰り返しの最初から実行を続けるために使用されます

つまり、削除対象と一致すればスルーして次のデータ(レコードへ)
一致しなければ書き込み

https://teratail.com/questions/137315

一通り、この記事を読んだのですが、よくわかりませんでした。
追加で、...の部分が自分でもよくわかっていないので教えていただきたいです。

1行1行追っていくと良いです。その直前までコメントでかかれてますよね?同じように
※直前のコメントも正確ではないのでついでに追記してます

php

1$delDate = explode("<>", $delCon[$j]);// コメントデータ$j行目を1つ取り出した情報を<>で分割した上で変数delDateに格納 2if ($delDate[0] != $delete) { //コメントデータの最初は「コメント番号」なのでそれと入力された対象番号を比較、同じではない場合 3 fwrite($fp, $delCon[$j]); //一致しないので削除対象ではないとして書き込み 4} else { 5 fwrite($fp, "消去しました。\n"); //一致しているものは消去データとして書き込み 6}

つまり、私はだいぶ簡略化したコードにしましたが、さっと対応したいだけなら下記でも良いです

php

1 $fp = fopen($filename, "w"); 2 for ($j = 0; $j < count($delCon); $j++) { 3 $delDate = explode("<>", $delCon[$j]); 4 if ($delDate[0] != $delete) { 5 fwrite($fp, $delCon[$j]); 6 } else { //何も書き込まない 7 } 8 }

投稿2019/03/04 04:07

編集2019/03/04 04:09
m.ts10806

総合スコア80765

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

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

takakuni

2019/03/04 04:27

試してみると、削除する機能ができました! しかし、追加登録をすると、欠番にならず同じ番号が二つ出てきました! 1名前 コメント 時間 2 名前 コメント 時間 3 名前 コメント 時間 の2番を消すと 1 名前 コメント 時間 3 名前 コメント 時間 と削除され、追加で登録すると 1 名前 コメント 時間 3 名前 コメント 時間 3 名前 コメント 時間 になりました。 僕としては、欠番にしたいのですが、追加で回答依頼できますでしょうか?
m.ts10806

2019/03/04 04:33 編集

「何も書き込まない」のではなく「空を書き込む」 fwrite($fp, "\n"); とすればうまくいくかもしれませんが、表示処理の改修も必要で(空行は読み飛ばすようにする) それでは空行が残ったままになりますね。 本来やるべきとしては、登録処理を改修する必要があると思います。 そのままですと3番を消したあと登録すると3番が入るようになりますしね。 「現在の最後の番号」を管理するデータを別途ファイルに持っておいて、そこから採番するように改修してください。
m.ts10806

2019/03/04 04:34

どうするかは決めてもらって構いませんが、 削除機能についての質問は解決したはずなので、 そこはもう少し自分で色々試行錯誤してみてから詰まったら質問してください。
takakuni

2019/03/04 04:38

ありがとうございました!
m.ts10806

2019/03/04 04:41

「追加で」についての回答もしてますが、そちらは問題ないですか? 機能についてはphpマニュアルも確認してくださいね
takakuni

2019/03/04 04:43

コメント欄を確認してわかりました!ありがとうございます!
m.ts10806

2019/03/04 04:54

理解が進んだようで何よりです。 あわせて必ずPHPマニュアル確認してください。仕様は全てそこにあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問