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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Q&A

解決済

1回答

3802閲覧

php 掲示板 パスワード機能(消去部分)

huku

総合スコア18

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

0グッド

0クリップ

投稿2019/12/10 07:43

編集2019/12/10 09:19

現在掲示板にパスワード機能をつけたいと考えています。
ファイルはphpファイルのindex.php、掲示板で出力するデータを格納するreceave.txt,で構成しています。
やりたいことは
消去機能の部分で、入力された番号とパスワードが格納されているものと一致している場合消去し、消去しましたと表示させることです。
現在消去はできるのですが、パスワードに関係なく気wてしまう状況です。
また消えた後に<>が残ってしまうのですがいい表示方法はないでしょうか?
またなぜパスワードがきかないのでしょうか?

コードの何が間違っているのでしょうか?
回答よろしくお願いします。

php

1 2 3<?php 4 5 6 7$file="receive.txt"; 8if (file_exists($file)) { 9 $count = count(file($file))+1; 10} else { 11 $count = 1; 12 } 13$err_msg1 = ""; 14$err_msg2 = ""; 15$err_msg7= ""; 16$message =""; 17$passmessage=""; 18$edfile = file('receive.txt'); 19$name=( isset( $_POST["name"] ) === true ) ?$_POST["name"]: ""; 20$text=( isset( $_POST["text"] ) === true ) ?$_POST["text"]: ""; 21$password=( isset( $_POST["password"] ) === true ) ?$_POST["password"]: ""; 22$data=($count."<>".$name."<>".$text."<>" .date('H:i:s')."<>".$password."\n"); 23 24if ( isset($_POST["posting"] ) === true ) { 25 26 if ( $name === "" ) $err_msg1 = "名前を入力してください"; 27 28 if ( $text === "" ) $err_msg2 = "コメントを入力してください"; 29 30 if ( $password === "" ) $err_msg7 = "パスワードを入力してください"; 31 32 33 if( $err_msg1 === "" && $err_msg2 ==="" && $err_msg7 ===""){ 34 $fp = fopen( "receive.txt" ,"a" ); 35 fwrite( $fp , $data); 36 $message ="投稿に成功しました。"; 37 38 } 39 } 40 41 42 43 44 45// 消去フォーム 46$err_msg6 = ""; 47$err_msg8 = ""; 48$delfile = file('receive.txt'); 49$delete=( isset( $_POST["delete"] ) === true ) ?$_POST["delete"]: ""; 50$pass2del=( isset( $_POST["pass2del"] ) === true ) ?$_POST["pass2del"]: ""; 51 52 53if (isset($_POST['delete'])) { 54 55 if ( $delete === "" ) $err_msg6 = "番号を入力してください"; 56 57 if ( $pass2del === "" ) $err_msg8 = "パスワードを入力してください"; 58 59 if( $err_msg6 === "" && $err_msg8 === ""){ 60 $fp = fopen("receive.txt", "w"); 61 for ($i = 0; $i < count($delfile); $i++) { 62 $deldata = explode("<>", $delfile[$i]); 63 if ($deldata[0] !== $delete && $deldata[4] !== $pass2del ) { 64 fwrite($fp, $delfile[$i]); 65 } else { 66 fwrite($fp, "消去しました。\n"); 67 } 68 } 69} 70 fclose($fp); 71} 72 73// 編集フォーム 74 75$err_msg3 = ""; 76$err_msg4 = ""; 77$err_msg5 = ""; 78$message2 =""; 79$edfile = file('receive.txt'); 80$renum=( isset( $_POST["renum"] ) === true ) ?$_POST["renum"]: ""; 81$rename=( isset( $_POST["rename"] ) === true ) ?$_POST["rename"]: ""; 82$retext=( isset( $_POST["retext"] ) === true ) ?$_POST["retext"]: ""; 83$redata=($renum."<>".$rename."<>".$retext."<>" .date('H:i:s'). "\n"); 84 85 86if ( isset($_POST["edit"] ) === true ) { 87 88 if ( $renum === "" ) $err_msg3 = "番号を入力してください"; 89 90 if ( $rename === "" ) $err_msg4 = "名前を入力してください"; 91 92 if ( $retext === "" ) $err_msg5 = "コメントを入力してください"; 93 94 if( $err_msg3 === "" && $err_msg4 ==="" && $err_msg5 ===""){ 95 $fp = fopen("receive.txt", "w"); 96 for ($i = 0; $i < count($edfile); $i++) { 97 $editraw = explode("<>", $edfile[$i]); 98 if ($editraw[0] !== $renum) { 99 fwrite($fp, $edfile[$i]); 100 } 101 else{ 102 fwrite($fp, $redata); 103 $message2 ="編集に成功しました。"; 104 105 } 106 } 107 } 108 } 109 110 111 112 113?> 114 115<!DOCTYPE html> 116<html lang="ja"> 117<head> 118<meta charset="UTF-8"> 119<title>掲示板</title> 120 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 121 <link rel="stylesheet" href="./styles.css" type="text/css"> 122</head> 123<body> 124<h1>掲示板</h1> 125<section> 126 <h2>新規投稿</h2> 127 <form action="index.php" method="post"> 128  名前 : <input type="text" name="name" > <?php echo $err_msg1; ?><br> 129 コメント: <input type="text" name="text" > <?php echo $err_msg2; ?><br> 130 パスワードを設定 <input type="text" name="password" > <?php echo $err_msg7; ?> 131 <input type="submit" value="投稿" name="posting"><br> 132 <?php echo $message; ?> 133 </form> 134 135 136 <h2>消去</h2> 137 <form action="index.php" method="post"> 138     消去番号 <input type="number" name="delete">     <?php echo $err_msg6; ?><br> 139 パスワードを入力 <input type="text" name="pass2del" > <?php echo $err_msg8; ?><br> 140 <input type="submit" value="消去">  <br> 141 </form> 142 143 <h2>投稿編集</h2> 144 <form action="index.php" method="post"> 145 編集番号 <input type="number" name="renum"> <?php echo $err_msg3; ?><br> 146 名前: <input type="text" name="rename" ><?php echo $err_msg4; ?><br> 147 コメント: <input type="text" name="retext" > <?php echo $err_msg5; ?><br> 148 パスワードを入力 <input type="text" name="pass3ed" > 149 <input type="submit" value="編集" name="edit"><br> 150 <?php echo $message2; ?> 151 </form> 152 153</section> 154<section> 155 <h2>投稿一覧</h2> 156</section> 157 158<?php 159// 読み込むファイル名の指定 160$file_name = "receive.txt"; 161// ファイルを全て配列に入れる 162$ret_array = file( $file_name ); 163 164// 取得したファイルデータ(配列)を全て表示する 165for( $i = 0; $i < count($ret_array); ++$i ) { 166 $echo_array = explode("<>", $edfile[$i]); 167 168// // 配列を順番に表示する 169 echo ( $echo_array[0]."<>".$echo_array[1]."<>".$echo_array[2]."<>".$echo_array[3]."<br />\n" ); 170} 171 ?> 172 173 174</body> 175</html> 176

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

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

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

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

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

guest

回答1

0

ベストアンサー

掲示板で出力するデータを格納するreceave.txt,パスワードを格納するpassword.textで構成

わざわざファイルを分けちゃうの?
ファイルをまたいで管理するときに、互いの紐付けを行番号で行っているようだけど、
一方のファイルのみ更新できてもう一方で失敗するケースを想定できているでしょうか。

削除と消去とわざわざ言い換えているのも混乱の元だし、
フォーム上でdeleteと組み合わせているのはpassword3なのに
$_POST['delete']と組み合わせているのは$_POST["password2"]じゃぁダメじゃないか。

ところで、~1、~2みたいな変数名やパラメータ名が多いのも、
デバッグしづらくしている原因なので、
変数名をきれいに使えばいいのにと思います。
html上というかフォーム上で区切られていれば、
input要素でのname属性が重複していても差し支えないわけで、

php

1 <h2>消去</h2> 2 <form action="index.php" method="post"> 3     消去番号 <input type="number" name="delete">     <?php echo $err_msg6; ?><br> 4 パスワードを入力 <input type="text" name="password3" ><?php echo $err_msg8; ?><br> 5 <input type="submit" value="消去">  <br> 6 </form>

password3じゃなくpasswordでいいし、
pass4delなどユニークな意味をもたせても良いです。

エラーメッセージ系の管理を例えば
$err_msg['post_name']$err_msg['post_text']$err_msg['post_pass']
$err_msg['edit_name']$err_msg['edit_text']$err_msg['edit_pass']
などとして可読性をあげてもよいかと。
さらに突き詰めると、単なる$msg$message$err_msgの違いはなにかとか、
(前提情報がない状況で)第三者に読みやすい命名を心がけると自分でもデバッグしやすくなります。

投稿2019/12/10 08:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

huku

2019/12/10 09:17

回答ありがとうございます。 ファイルを一つにまとめ、名前を少し変更いたしました。
退会済みユーザー

退会済みユーザー

2019/12/10 09:42

構造を変更したら、各所の処理を見直ししてくださいね。 見たところ、編集時に$redata加工ミスでパスワードを捨ててしまっているのと、 消去のタイミングで行数と投稿データの番号がずれていくんだけど、その対策も漏れている。 (1,2,3,4,5があるところで3を削除したら1,2,4,5だけど行数は4で、次の投稿が番号5になってダブるとか。)
huku

2019/12/10 09:51

$redata加工ミスは編集画面のところでしょうか? 消去のズレは消去した後に消去しましたと表示するためおそらく番号と行数はずれないと思うのですがどうでしょうか?
退会済みユーザー

退会済みユーザー

2019/12/10 10:06

この指摘事項、想像力が働いていますか?→(1,2,3,4,5があるところで3を削除したら1,2,4,5だけど行数は4で、次の投稿が番号5になってダブるとか。) ファイルに書き出すときに行番号を振り直す処理、もしくは新規番号を裁判するのに行数ではなく最大値+1を採用するようにする必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問