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

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

ただいまの
回答率

91.00%

  • PHP

    17797questions

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

  • HTML

    7560questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 486

mochio_o7

score 9

こんにちは。

今、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」のサンプルは以下になります。

1<>なお<>test1<>2017年09月28日 11:01:57<>pass1
2<>まき<>test2<>2017年09月28日 11:02:05<>pass2
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2017/09/28 11:03

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

    キャンセル

  • mochio_o7

    2017/09/28 11:11

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

    キャンセル

  • yambejp

    2017/09/28 11:20

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

    キャンセル

回答 2

checkベストアンサー

+2

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

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

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

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


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

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


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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

とりあえず一つ目のソースについて言及すると、
掲示板データをせっかく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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    php初心者です。issetの使い方がよくわかりません。

    issetをつかって、名前とコメントを入力したときと、空白のときで、働くプログラムを変更したいのですが、やり方がよくわかりません。 該当のソースコード <form acti

  • 解決済

    PHP:パスワードが一致したときのみ、投稿の削除をする簡易掲示板

    パスワードが一致したときの条件式をプログラムに書いても反応しません。/ファイル消去/ブロックの6行目あたりにあるif文のandの右側の条件式です。この式で使われている$delDat

  • 解決済

    php 掲示板の消去機能

    ```php コード <?php ini_set('display_errors', 1); error_reporting(E_ALL); date_defa

  • 解決済

    PHPファイル送信

    phpでファイルのテキスト内に書いた内容を1行ずつbbb.textというファイルに保存して、ページの下に1行ずつ表示するプログラムを書くのですが、テキスト内の内容の変数$boxをど

  • 解決済

    php 簡易掲示板の編集

    実現したいこと 簡易掲示板について。 テキストと送信ボタンがある掲示版を扱います。 フォームを送信すると、別に用意したテキストファイルに内容が保存され、そこから読みだされた内

  • 解決済

    掲示板の削除機能をつけたい

    簡易な掲示板を作成しました。タイトルや名前などをつけて投稿ができるようになっています。このコードを応用してできるだけ簡単に投稿した内容を削除する機能をつけたいです。アイデアが思い浮

  • 受付中

    phpでの掲示板編集機能について

    現在phpを用いた掲示板を作成しているのですが、指定した番号のコメントを編集する機能がどうしても実装できません。 改善点を教えて頂けると嬉しいです。 <html> <body>

  • 解決済

    PHPのアンケートに於ける番号表記

    PHPでアンケートフォームを作成しているのですが、アンケートの投稿番号の表記がうまくいきません。 1行ごとに「{番号}<>{名前}<>{コメント}<>{投稿された時間}」と言う形で

同じタグがついた質問を見る

  • PHP

    17797questions

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

  • HTML

    7560questions

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