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

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

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

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

HTML

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

Q&A

解決済

2回答

15793閲覧

php 掲示板 パスワード設定について

mochio_o7

総合スコア17

PHP

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

HTML

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

0グッド

0クリップ

投稿2017/09/28 00:49

編集2017/09/28 02:10

こんにちは。

今、PHPについて勉強中です。

今回、掲示板にパスワードをつけたいです。

行いたいこととしては、
「入力されたパスワードと、書き込み時に保存したパスワードを比較し、一致の場合のみ削除する」
です。

<title>掲示板</title> <p> <h1><掲示板></h1> </p> <form action ="" method="POST"> 名前<br> <input type ="text" name="name"><br> コメント<br> <textarea name = "comment" cols = "30" rows = "5"> </textarea><br> パスワード<br> <input type ="text" name="pass"><br> <p> <input type = "submit" value = "投稿"> </form> <form action="" method="post"> 削除対象番号<br> <input type="text" name="delete"><br> パスワード<br> <input type ="text" name="delpass"><br> <p> <input type="submit" value="削除"><br> </p> </form> <?php if (isset($_POST["delete"],$_POST["delpass"])) { $delete = $_POST["delete"]; $delpass = $_POST["delpass"]; $delCon = file("kadai12.txt"); $fp = fopen("kadai12.txt", "w"); for ($j = 0; $j < count($delCon); $j++) { $delDate = explode("<>", $delCon[$j]); if ($delDate[4] == $delpass){ if ($delDate[0] != $delete) { fwrite($fp, $delCon[$j]); } else { fwrite($fp, "消去しました。\n"); } } } fclose($fp); } ?>

あとは以下のコードも試してみました。

<?php if (isset($_POST["delete"],$_POST["delpass"])) { $delete = $_POST["delete"]; $delpass = ($_POST["delpass"]); $delCon = file("kadai12.txt"); $fp = fopen("kadai12.txt", "w"); for ($j = 0; $j < count($delCon); $j++) { $delDate = explode("<>", $delCon[$j]); if ($delDate[0] != $delete && $delDate[4] != $delpass) { fwrite($fp, $delCon[$j]); } else { fwrite($fp, "消去しました。\n"); } } fclose($fp); } ?>

削除されてもパスワード関係なく削除されてしまったり、そもそもすべて削除されてしまったりしてうまくいきません。

「kadai12.txt」のサンプルは以下になります。

kadai12.txt

11<>なお<>test1<>2017年09月28日 11:01:57<>pass1 22<>まき<>test2<>2017年09月28日 11:02:05<>pass2

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

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

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

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

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

m.ts10806

2017/09/28 02:03

kadai12.txtの内容をサンプルで結構ですのでご提示ください。また、teratail内に同様の質問が散見されますので、もしかしたらその中にヒントがあるかもしれません。teratail内でキーワード検索してみてください。
mochio_o7

2017/09/28 02:11

ありがとうございます!提示しました。
yambejp

2017/09/28 02:20

ファイルでのデータ管理なのにlockしてませんが大丈夫でしょうか?DBでのデータ管理は選択肢にはいっていませんか?
guest

回答2

0

ベストアンサー

こんにちは。
ソースを拝見させていただきました。

まず、fopenのwモードで開くとファイルが空になります。
ですので、1つ目のソースですと、パスワードが一致しない場合、fwriteが実行されないルートを通りますのでファイルが空のままになります。

2つ目のソースは惜しいのですが、↓の書き方ですと
「対象番号が一致しない」と「パスワードが一致しない」の両方を満たすケースのみ
元々あった行がfwriteされます。
逆にいうと、どちらか一方が一致してしまうと消去のルートへ行ってしまいます。

php

1if ($delDate[0] != $delete && $delDate[4] != $delpass) {

つまり、以下と同じ意味になります。

php

1if ($delDate[0] == $delete || $delDate[4] == $delpass) {

そうすると、対象番号ではないにもかかわらず、パスワードが一致さえすれば、その行は消されてしまうわけです。

では、どうすればいいかというと、対象番号とパスワードの両方が一致すれば削除していいので、
以下のif文でよいと思います。

php

1if ($delDate[0] == $delete && $delDate[4] == $delpass){ 2 // 両方一致すれば削除 3 fwrite($fp, "消去しました。\n"); 4} else { 5 // どちらかでも一致しなければ元の行を残す 6 fwrite($fp, $delCon[$j]); 7}

そして最後に、explodeで配列に変換している処理ですが、
おそらくパスワード(最後の要素)に改行が入ってしまって一致しないのでないかと思いますので、
trimを使ってみてください。

php

1// $delDate = explode("<>", $delCon[$j]); 2$delDate = explode("<>", trim($delCon[$j]));

投稿2017/09/28 03:03

編集2017/09/28 03:39
s-washion

総合スコア204

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

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

0

とりあえず一つ目のソースについて言及すると、
掲示板データをせっかくfile()にて配列に取り込んでいるのだから、
配列を操作して削除するべき投稿の要素を配列から削除し、
再度掲示板データを書き出せば良いのではないかと。

簡単な考え方としては、
for()ループで
$delConの要素を点検して、
条件が合致したら配列の塊から要素を削除するarray_splice()でも使って$delConから削除する、
最後にfile_puts_contents("kadai12.txt", implode(PHP_EOL,$delCon));
配列から改行コードを連結した文字列を作って書き出すことが出来る。
PHP: file_put_contents - Manual

あるいは、array_filter()を駆使してコールバック関数にて削除条件をチェックさせると
for()ループを回さなくても解決可能。
PHP: array_filter - Manual

投稿2017/09/28 02:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問