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

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

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

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

Q&A

1回答

9353閲覧

番号とパスワードをが一致した場合コメントを削除、編集を行いたい

nonnon

総合スコア6

PHP

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

0グッド

0クリップ

投稿2017/08/27 11:45

プログラミン初心者で簡易掲示板を作成しています。

入力フォームで書き込まれた内容を、削除フォームで投稿番号とパスワードの双方が一致した場合、指定の投稿番号のコメントを削除をしたいです。
また、編集フォームでも、投稿番号とパスワードの双方が一致した場合、編集詳細フォームを開き編集を実行できるようにしたいです。

投稿番号の指定だけなら削除も編集もできたのですが、投稿番号とパスワードの双方が一致した場合ができずに躓いています。
お手数ですが宜しければコードにご指摘いただければ幸いです。

###該当のソースコード

<html> <mata charset="utf-8"> <lang="ja"> <head><title>フォーム</title></head> <body> <h1>入力フォーム</h1> <form action="test.php" method="post"> 名 前:<input type="text" name="name"><br> コメント:<input type="text" name="comment"><br> パスワード:<input type="text" name="password"><br> <input type="submit" value="送信する"> </form> <br> <h1>削除フォーム</h1> <font color ="blue">※半角でお願いします。</font><br> <form action="test.php" method="post"> 削除:<input type="text" name="delete"><br> パスワード:<input type="text" name="password2"><br> <input type="submit" name="sakuzyo" value="削除する"><br> </form> <br> <h1>編集フォーム</h1> <font color ="blue">※半角でお願いします。</font><br> <form action = "test.php" method="post"> 編集対象番号:<input type="text" name="number"><br> パスワード:<input type="text" name="password3"><br> <input type="submit" name="hensyu"value="編集する"> </form> <?php $name = $_POST['name']; $name = htmlspecialchars($name); $comment = $_POST['comment']; $comment = htmlspecialchars($comment); $password = $_POST['password']; $password = htmlspecialchars($password); $time = date("Y/m/d H:i:s"); $line = file("test.txt"); $num = count($line); $write = $num . "<>" . $name . "<>" . $comment . "<>" . $time; $writepas = $password . "<>" . $num; //データ書き込み if (!empty($name) && !empty($comment)) { $fp = fopen ("test.txt","a"); fputs ($fp, $write."\n"); fclose ($fp); } //パスワード書き込み if (!empty($password)) { $fp = fopen ("testpas.txt","a"); fputs ($fp, $writepas."\n"); fclose ($fp); } //データ消去 $delCon = file("test.txt"); $pasCon = file("testpas.txt"); $delete = $_POST['delete']; $sakuzyo = $_POST['sakuzyo']; $pas2 = $_POST['password2']; if (!empty($sakuzyo)) { for ($r = 0; $r < count($pasCon) ; $r++) { $pasData = explode("<>",$pasCon[$r]); for ($j = 0; $j < count($delCon) ; $j++) { $delData = explode("<>", $delCon[$j]); if ($delData[0] == $delete && $pasDate[0] == $pas2) { array_splice($delCon, $j, 1); array_splice($pasCon, $r, 1); file_put_contents("test.txt", $delCon); file_put_contents("testpas.txt", $pasCon); } } } } //データ編集 $hensyu = $_POST['hensyu']; $pas3 = $_POST["password3"]; $bnum = $_POST["number"]; $ediCon = file("test.txt"); $pasLog = file("testpas.txt"); if (!empty($hensyu)) { for($v = 0; $v < count($pasLog); $v++){ $pasline = explode("<>",$pasLog[$v]); for($i = 0; $i < count($ediCon); $i++){ $ediline = explode("<>",$ediCon[$i]); if($ediline[0] == $bnum && $pasline[0] == $pas3){ echo "No$ediline[0]の書き込みを編集してください<br>"; echo "<form method=POST action=test.php>"; echo "名 前:<input type='text' name='name2' size='20' value='" . $ediline[1] . "'><br>"; echo "コメント:<input type='text' name='comment2' size='60' value='" . $ediline[2] . "'><br>"; echo "<input type='submit' name='uwagaki' value='上書き保存'><input type='hidden' name='bnumber' value='" . $bnum . "'>"; echo "</form>"; break; } } } } //編集上書き if (!empty($_POST["uwagaki"])){ $ediLog = file("test.txt"); for ($i = 0; $i < count($ediLog); $i++) { $line2 = explode("<>", $ediLog[$i]); $bnum = $_POST["bnumber"]; $name = $_POST['name2']; $comment = $_POST['comment2']; if ($line2[0] == $bnum) { //置き換え対象行を探す $newline = $bnum . "<>" . $name . "<>" . $comment . "<>" . $time . "\n"; array_splice($ediLog,$i,1,"$newline"); file_put_contents("test.txt", $ediLog); } } } echo "__________________掲示板欄______________________<br>"; //出力 $dateFile = "test.txt"; $file = file($dateFile); foreach($file as $value){ explode("<>",$value); echo $value . "<br>\n"; } ?> </body> </html>

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

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

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

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

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

m.ts10806

2017/08/28 02:07

explode()の結果を受け取っていないのは作成中だからですか?
nonnon

2017/08/28 02:49

お忙しい中ご指摘の程有難うございます。 プログラミング初心者ということもあり、結果のことを考えていませんでした。ttyp03さんのお陰で結果部分は改善されておりますが、動作が少し違い躓いています。
guest

回答1

0

詳しくは見ていませんが、$pasData$pasDateになっている箇所があります。

PHP

1 if ($delData[0] == $delete && $pasDate[0] == $pas2) { 23 if ($delData[0] == $delete && $pasData[0] == $pas2) {

追記
削除処理の所は次のような感じになると思います。

PHP

1if (!empty($sakuzyo)) { 2 for ($r = 0; $r < count($pasCon) ; $r++) { 3 $pasData = explode("<>",$pasCon[$r]); 4 if ($pasData[0] == $pas2 && $pasData[1] == $delete) { 5 for ($j = 0; $j < count($delCon) ; $j++) { 6 $delData = explode("<>", $delCon[$j]); 7 if ($delData[0] == $delete) { 8 array_splice($pasCon, $r, 1); 9 array_splice($delCon, $j, 1); 10 file_put_contents("test.txt", $delCon); 11 file_put_contents("testpas.txt", $pasCon); 12 break; 13 } 14 } 15 break; 16 } 17 } 18}

投稿2017/08/28 00:26

編集2017/08/28 01:56
ttyp03

総合スコア16998

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

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

nonnon

2017/08/28 01:32

ご指摘有難うございます。 指摘されたところを直したところ削除も編集も可能になりましたが、パスワードが一致した場合でなくても削除や編集ができているようです。 例えば投稿番号3を削除したい場合、パスワードが3であっても1から3の番号を入れると削除できてしまう (4からは反応しませんでした。)
ttyp03

2017/08/28 01:57

削除処理について追記しましたのでご確認ください。 ちょっと時間がなくて解説まで書けなかったので、わからなかったらコメントください。 あとで解説します。
nonnon

2017/08/28 02:43 編集

お忙しい中ご助力有難うございます。 お指摘通り訂正してテストをしてみたところ、先程の動作同様おかしな点があり、調べてみましたが 番号の3を指定した場合でパスワードを2を指定すると投稿番号3の配列が削除され、パスワード2の配列も別々に削除されていました。双方が一致した場合でなくどちらも削除という形の処理になってしまっているのでしょうか データが保存されているテキストを一つにして、同じ考えで処理させた場合はどんな番号どパスワードの組み合わせでも削除はされませんでした。
ttyp03

2017/08/28 03:03

戻ってきましたので解説します。 まず最初のループでパスワードを管理しているファイルtestpas.txtを検索します。 各行を見て、入力された番号とパスワードが一致しているかを判定します。 番号とパスワードが一致していれば入力OKということで、実際の削除処理に移ります。 この時点でtestpas.txtの削除する行は$rに確定。 2番目のループで、今度は削除すべき投稿データを検索にいきます。 これは単純に入力された番号と同じ番号の行を探すのみです。 見つかったらtest.txtの削除する行は$jに確定。 あとはそれぞれの配列から要素を削除してファイルを上書きしてループを抜けます。 という仕様で良いのかと思って書きました。 手元の環境では削除部分のみの動作ですが、問題なく動きました。
nonnon

2017/08/28 03:50 編集

ご助力誠に有難うございます。 私が行いたい処理と解説の内容は合致していました。 しかし、上記のコードをコピペ、管理先を書き換えても私の環境では削除はされませんでした。何が悪いかわかりません、申し訳ありません。環境はterapadで書き込んで、サーバーに転送したのちwebで開いています。
ttyp03

2017/08/28 04:18

デバッグ文などを入れて、どこを通っているか、値はどうなっているかなど確認してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問