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

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

ただいまの
回答率

90.38%

  • PHP

    25047questions

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

消去ボタンを押したときに、すぐ表示されない。

解決済

回答 2

投稿

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

r-r-u-r

score 1

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
質問内容

掲示板で、消去ボタンを押すと、投稿が消去できるものを作ったのですが、
消去ボタンを押すと、datのほうでは、すでに該当の箇所が消去されるのですが、画面には反映されず、一度リロードしないと表示されません。
この理由は、どういうものなのでしょうか?

一度のクリックですぐに表示をさせる方法はありますでしょうか?

下のコードは、消去する際に表示される画面の部分になります。

発生している問題・エラーメッセージphp

コード

<?php
date_default_timezone_set('Asia/Tokyo');
$dataFile = 'bbs.dat';
$passFile = 'pass.dat';
require_once('function.php');
$kaku = "";

$posts = file($dataFile, FILE_IGNORE_NEW_LINES);
// var_dump($posts);
// $posts = array_reverse($posts);
// var_dump($posts);
if ($_SERVER['REQUEST_METHOD'] == 'POST' &&
   isset($_POST['deletepass'])){

     $deletepass = trim($_POST['deletepass']);
     $kaku = "消去しました";
     $delete = (int)$deletepass;
     $fp = fopen($dataFile, 'w');
     foreach ($posts as $key => $post){

     if ($delete !== ''){
       list($usercomment, $username, $postedAt) = explode("\t", $post);
       if ($key == $delete - 1){
         var_dump($key);
         var_dump($delete);
         // $post = "消去しました".$postedAt;
         $usercomment = "消去しました-";
         $username = "不明";
         $postedAt = $postedAt;
       } else{
         $usercomment = $usercomment;
         $username = $username;
         $postedAt = $postedAt;

       }
       $newData = $usercomment. "\t". $username. "\t". $postedAt."\n";
      fwrite($fp, $newData);
      }


     }
     fclose($fp);

}




$postedAt = date('Y-m-d H:i:s');
$posts = array_reverse($posts);

var_dump($newData);

 ?>
 <!DOCTYPE html>
 <html lang="ja">
   <meta charset="utf-8">
 <form action="" method="POST">
   <input type="text" name="deletepass" placeholder="delete_pass" value="<?php echo h($deletepass, ENT_QUOTES, 'UTF-8'); ?>">
   <?php echo $kaku; ?>
   <input type="submit" value="消去"><br/>
 </form>
 <form action="Epass.php" method="POST">
   <input type="submit" value="戻る"><br/>
 </form>
 <h2>投稿一覧(<?php echo count($posts); ?>件)</h2>
<ol reversed>
 <?php if (count($posts)) : ?>
          <?php foreach ($posts as $post) : ?>
          <?php list($usercomment, $username, $postedAt) = explode("\t", $post); ?>
              <li><?php echo h($usercomment); ?> (<?php echo h($username); ?>) - <?php echo h($postedAt); ?></li>
          <?php endforeach; ?>
      <?php else : ?>
          <li>まだ投稿はありません。</li>
      <?php endif; ?>
</ol>
</html>

``````

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

$posts = file($dataFile, FILE_IGNORE_NEW_LINES);
を実行してからファイルを操作して消しこんで、
再読込せずそのまま$postsにあるデータで表示したら、
そりゃ消えてないように見えるでしょうね。

わかりやすくするために、ミニマルなコードを書きました:

<?php

$arr = [
    1 => 2,
    2 => 4,
    3 => 9,
    4 => 16
];
foreach ($arr as $key => $value) {
    if ($key === 3) {
        $value = 0;
    }
}
var_dump($arr);


イメージ説明
気持ちの上では$arrの一要素を編集したつもりのコードですが、
foreachループではコピーが作られてしまうため
もとの配列に影響がありません。

<?php

$arr = [
    1 => 2,
    2 => 4,
    3 => 9,
    4 => 16
];
foreach ($arr as $key => $value) {
    if ($key === 3) {
        // $value = 0;
        $arr[$key] = 0;
    }
}
var_dump($arr);


イメージ説明

つまり、もう一度ファイルから読み直すか、
もとの$postsに直接編集を加えるかしないといけません。
例えば:

       $newData = $usercomment. "\t". $username. "\t". $postedAt;
       $posts[$key] = $newData;
       fwrite($fp, $newData."\n");


とか。
$posts[$key]に格納する際には末尾の改行コードはあると邪魔なので、
あくまでファイル書き出し用にのみ付加します。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/27 20:41

    なるほど、解りました。
    消去したのに、消去前のデータを表示するようになっているということですね。

    例えまで出してもらい、ありがとうございます!

    キャンセル

+2

$postsから内容を消したあと更新していないからです。削除後に読み込みなおすなどしてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/26 18:24

    ご回答ありがとうございます。

    消すと、同時に読み込み直すように、書くことはできますか?

    ボタンを1回押すだけで、その両方の動作をできるようにしたいのですが、わたしの書き方だと、厳しいでしょうか?

    キャンセル

  • 2019/05/26 18:33

    それに対する回答なのですが・・・。

    キャンセル

  • 2019/05/27 08:01

    すみません、そうですよね。
    ありがとうございます!

    キャンセル

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

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

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

  • PHP

    25047questions

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