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

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

ただいまの
回答率

90.33%

  • PHP

    21389questions

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

  • JavaScript

    17586questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    9613questions

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

消去する時、「本当に消去しますか?」とアラートしたい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 484

massuuuu

score 33

phpの勉強で簡昜掲示板を作っております。
<内容>
名前、コメント、パスワードを入力し追加ボタンを押すとテキストファイル(Kadai2_15.txt)に
番号<>名前<>コメント<>日時<>パスワード
といった形で保存される。
保存した内容をKadai2_1sam.phpに出力する。

消去機能を実行する場合は、消去したい番号とパスワードを入力し、消去。
編集機能を実行する場合は、編集したい番号とパスワードを入力し、編集。

<やりたい事>
消去ボタンおした時、本当に消去しますか?とアラートする機能を作りたいです。

<できない事>
下のコードではjavaScriptでアラートさせているのですが、キャンセルした時も
消去処理が完了してしまいます。

Kadai2_1sam.php

<?php
header('Content-Type: text/html; charset=UTF-8');

require_once('Kadai2_15sam.php');
?>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>sample</title>
    <script type="text/javascript">
      function disp(){

        // 「OK」時の処理開始 + 確認ダイアログの表示
        if(window.confirm('本当にいいんですね?')){

          location.href = "Kadai2_15sam.php"; // Kadai2_15sam.php へジャンプ

        }
        // 「OK」時の処理終了
        // 「キャンセル」時の処理開始
        else{
          <?php
            $_POST["delete"] = NULL;
          ?>
          window.alert('キャンセルされました'); // 警告ダイアログを表示

        }
        // 「キャンセル」時の処理終了

      }
    </script>
  </head>
  <body>
    <form method="post" action="<?php echo($_SERVER['SCRIPT_NAME']) ?>">
      <input type="hidden" name="editmode" value="<?php echo($_POST['editNo']);?>">
      <p>名前:</p>
      <input type="text" value="<?php echo($simEdit[1]); ?>" name="name" required="required">
      <p>コメント:</p>
      <textarea type="text" name="com" maxlength="20" required><?php echo $simEdit[2]; ?></textarea>
      <p>パスワード:</p>
      <input type="password" name="pas" required="required" maxlength='8' placeholder='8字以内'>
      <input type="submit" name="add" value="追加">
    </form>
    <form action="<?php echo($_SERVER['SCRIPT_NAME']) ?>" method="POST">
      <p>削除対象番号:</p><!-- 削除対象番号 -->
      <input type="number" name="deleteNo">
      <p>消去パスワード:</p>
      <input type="password" name="delpas" required="required" maxlength='8' placeholder='8字以内'>
      <input type="submit" name="delete" value="削除" onClick="disp()">
    </form>
    <form action="<?php echo($_SERVER['SCRIPT_NAME']) ?>" method="POST">
      <p>編集対象番号:</p><!-- 編集対象番号 -->
      <input type="number" name="editNo">
      <p>編集パスワード:</p>
      <input type="password" name="editpas" required="required" maxlength='8' placeholder='8字以内'>
      <input type="submit" name="edit" value="編集">
    </form>
    <p>
      <p>
        掲示板:
      </p>
      <?php

        foreach ((array)$text_rows as $text_row) {//配列でcount<>name<>comment<>data表示
          if($text_row === ""){
            continue;//空の時、次の配列へ
          }
          $ret = explode("<>", $text_row);
          echo h($ret[0])."番  ";
          echo h($ret[1])." さん  ";
          echo h($ret[2])."  ";
          echo h($ret[3]);
          echo "<br>";

        }
      ?>

    </p>
  </body>
</html>

Kadai2_15sam.php

<?php
header('Content-Type: text/html; charset=UTF-8');
?>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>sample</title>
  </head>
  <body>

    <?php

      function h($str) {
        return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
      }

      //session_start(); // 1

      $name = (string)filter_input(INPUT_POST, 'name'); //名前フォーム値 文字列にキャスト
      $comment = (string)filter_input(INPUT_POST, 'com');//コメントフォーム値 フィルタリングする
      $pas = (string)filter_input(INPUT_POST, 'pas');//password
      $fileName = 'Kadai2_15.txt';

          //投稿追加処理
          if (isset($_POST["add"]) && empty($_POST["editmode"]))
           {
              echo "追加モード!";
              $fp = fopen($fileName, 'a+');
              flock($fp, LOCK_SH);
              $text_rows = file($fileName);
              //var_dump($text_rows);
              $lastline = explode("<>", $text_rows[count($text_rows)-1]);//<>で配列を作る。
              $num = $lastline[0];//番号取得
              $add_text = ($num + 1)."<>".$name."<>".trim($comment)."<>".date('H時i分')."<>".trim($pas);//追加したい文章
              array_unshift($text_rows, $add_text);//一つ以上の要素を配列の最初に加える
              flock($fp, LOCK_EX);
              fwrite($fp, $add_text."\n");
              flock($fp, LOCK_UN);
              fclose($fp);
          }

          //投稿削除処理
          if (isset($_POST["delete"]))
          {
              echo "消去モード!";
              $fp = fopen($fileName, 'a+');
              $delete = $_POST["deleteNo"];
              $delpas = $_POST["delpas"];
              flock($fp, LOCK_SH);
              $text_rows = file($fileName);
              //var_dump($delarray);
              for ($j = 0; $j < count($text_rows) ; $j++)
              {
                $delData = explode("<>", $text_rows[$j]);//配列に格納
                var_dump($delData);
                var_dump($delpas);
                if ($delData[0] == $delete && trim($delData[4]) == $delpas)//番号が同じ時
                {
                    array_splice($text_rows, $j, 1);//置換
                    file_put_contents($fileName, implode($text_rows));
                    flock($fp, LOCK_UN);
                    fclose($fp);
                }
              }
          }

          //投稿編集処理
          if (isset($_POST["edit"]))
           {
                echo "編集フォーム!";
                $fp = fopen($fileName, 'a+');
                $edit = $_POST["editNo"];
                $editpas = $_POST["editpas"];
                //print_r($edit);
                flock($fp, LOCK_SH);
                $text_rows = file($fileName);
                //var_dump($editarray);//
                for ($j = 0; $j < count($text_rows); $j++)
                {
                  $ediData = explode("<>", $text_rows[$j]);
                  //var_dump($ediData);
                  //var_dump($editpas);
                  if ($ediData[0] == $edit && trim($ediData[4]) == $editpas)
                  {
                      for($h = 0; $h < count($ediData); $h++)
                      {
                        $simEdit[$h] = mb_substr(trim($ediData[$h]), 0);

                      }
                      //var_dump($simEdit);
                      flock($fp, LOCK_UN);
                      fclose($fp);
                  }
                }
          }

          if  (isset($_POST["add"]) && !empty($_POST['editmode']))
          {
              echo "編集モード!";
              $fp = fopen($fileName, 'a+');
              $edit = $_POST["editNo"];
              flock($fp, LOCK_SH);
              $text_rows = file($fileName);
              //var_dump($text_rows);//
              for ($j = 0; $j < count($text_rows); $j++)
              {
                $ediData2 = explode("<>", $text_rows[$j]);
                if ($ediData2[0] == $_POST['editmode'])
                {
                    $ediData2[1] = $name;//POST[’name’]
                    $ediData2[2] = $comment;//POST[’comment’]
                    $ediData2[4] = $pas;//POST[’pas’]
                    $text_rows[$j] = implode("<>", $ediData2);
                    //var_dump($text_rows);
                    file_put_contents($fileName,implode($text_rows));
                    flock($fp, LOCK_UN);
                    fclose($fp);
                }
              }
              //var_dump($ediData2);
          }




    ?>
  </body>

</html>

実装画面
イメージ説明

まだまだ未熟者ですがよろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

前提部分をおそらく理解されていないからだと思いますが、
ソースコード上のいくら下に書いたとしてもPHPがjavascriptより後に実行されることはありません。

なぜならPHPはサーバー側の言語でjavascript(html、cssも)はクライアント側の言語だからです。
PHPが処理を行い、画面出力を行うことでhtml表示となるわけです。
javascriptが一番後に実行されるものと思っておいて良いです。
つまり「確認アラートキャンセル時」の$_POST["delete"] = NULL;は意味がありません。

そもそも最初のPHP自体$_POSTされてない状態で開くので変数未定義のエラーが出ているはず。
NOTICEレベルだとは思いますが、エラーは全レベル表示するようにしておいてください。PHPのエラー表示設定について

他にもあると思うのでチェックしてみてください。

さて、そもそもですが作りがかなりおかしいことになっています。
Kadai2_1samの冒頭でKadai2_15samをrequireしているのでブラウザの「ソースを表示」すると<html>が二重になっていませんか?
「Kadai2_15samで処理を行う」という仕組みを作りたいのであれば、Kadai2_1sam冒頭にKadai2_15samを入れておく必要はありません。
つまり require_once('Kadai2_15sam.php'); は不要です。

Kadai2_15samでは$_POSTで情報を受け取っていますが、location.hrefで飛ばしているため、GETで遷移していることになります。
せっかくformでmethod=postで指定しているにも関わらずlocation.hrefしてしまっては意味がありません。

「キャンセル」を押しても送信されてしまうのはmethod=postでsubmitしているからです。明示的に止めない限り、submitは送信されます。

あとはKadai2_15samで削除したいならactionの指定先もKadai2_15samにしておくべきですね。$_SERVER['SCRIPT_NAME']だと自身のファイル名をさしています。

幾つか方法があるので挙げておきます。

1:return false;
falseを受け取るように明示するとキャンセルを受け取りsubmitを止める

    <form action="Kadai2_15sam.php" method="POST">
      <p>削除対象番号:</p><!-- 削除対象番号 -->
      <input type="number" name="deleteNo">
      <p>消去パスワード:</p>
      <input type="password" name="delpas" required="required" maxlength='8' placeholder='8字以内'>
      <input type="submit" name="delete" value="削除" onClick="disp();return false;">
    </form>
        if(!window.confirm('本当にいいんですね?')){
          window.alert('キャンセルされました'); 
          return false;
        }

//submitは勝手にされるのでキャンセル時のみでOK

2:preventDefault 
submitのイベント自体を止めてOKのときだけ送信する場合

    <form action="Kadai2_15sam.php" method="POST" name="deleteform">
      <p>削除対象番号:</p><!-- 削除対象番号 -->
      <input type="number" name="deleteNo">
      <p>消去パスワード:</p>
      <input type="password" name="delpas" required="required" maxlength='8' placeholder='8字以内'>
      <input type="submit" name="delete" value="削除" onClick="disp(event);">
    </form>
function disp(e){
   e.preventDefault();
   if(!window.confirm('本当にいいんですね?')){
      window.alert('キャンセルされました'); 
      return false;
   }

   document.deleteform.submit();

3:button
submit止めるくらいならボタンでいい という場合

    <form action="Kadai2_15sam.php" method="POST" name="deleteform">
      <p>削除対象番号:</p><!-- 削除対象番号 -->
      <input type="number" name="deleteNo">
      <p>消去パスワード:</p>
      <input type="password" name="delpas" required="required" maxlength='8' placeholder='8字以内'>
      <input type="button" name="delete" value="削除" onClick="disp();">
    </form>
   if(!window.confirm('本当にいいんですね?')){
      window.alert('キャンセルされました'); 
      return false;
   }

   document.deleteform.submit();

ひとまず「submitはどういう動きをするか」を知っておけばあまり無駄な記述をせずに
必要な部分だけを処理として記述することができます。
あまりifのelseを増やしすぎるのも考え物ですので、記述の仕方次第で省略したまま簡潔に同じ処理を実現することができます(私は途中でreturnするのはかなり好きで多用しますが、elseをなるべく書きたくなくて、「そこで終わり」と明示したいためです。)

あと、実は 
window って「自身」をさすグローバル変数なので(ここの表現が難しいですが) 書かなくても良くて

alert();
confirm();


だけでも動きます。※子ウィンドウなどを操作する場合は明示が必要。

蛇足:
かなり前から指摘されているかと思いますが簡”易”掲示板ですよね。

簡要・・・簡単で要点をよく押さえていること。また,そのような要点。
簡易・・・手順・手続が簡単で、たやすく(=易)行えること

「簡要」では意味が通じません。
字1つで全く意味が違ってくるのでそこは大切にしてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/18 10:33

    小ウィンドウ⇒子ウィンドウ(or別ウィンドウ)では。

    回答とは関係ないですが、コードブロック言語指定の「javascript」は「js」って書けますよ。

    【このサイトのMarkdown記法のコードブロックで使える言語一覧(7119)|teratail】
    https://teratail.com/questions/7119

    キャンセル

  • 2018/04/18 10:41 編集

    > 小ウィンドウ⇒子ウィンドウ(or別ウィンドウ)では。
    ご指摘ありがとうございます。修正しました。

    > 回答とは関係ないですが、コードブロック言語指定の「javascript」は「js」って書けますよ。

    編集履歴見られたのだと思いますが、毎回javascriptって書いてました; お恥ずかしい・・・。
    javascriptって書くのが無駄に早くなってしまうわけです・・・。
    今後活用させていただきます。

    キャンセル

  • 2018/04/18 13:28

    本当に丁寧な回答ありがとうございます😭😭
    やりたい事はできたのですが、mts10806さんのおっしゃってる。
    「「Kadai2_15samで処理を行う」という仕組みを作りたいのであれば、Kadai2_1sam冒頭にKadai2_15samを入れておく必要はありません。
    つまり require_once('Kadai2_15sam.php'); は不要です。」
    とあるのですが、これを消してしまうとうまいこといかなくなります汗。
    なので、Kadai2_15samの<html><head><body>の部分を消して二重にならないようにしたのですが、
    それとこれとは話が違いますか??
    あと
    「あとはKadai2_15samで削除したいならactionの指定先もKadai2_15samにしておくべきですね。」
    とあるのですが、Kadai2_15samに指定すると画面が真っ白になってうまいこといかなくなりました。。
    何故、Kadai2_15samにする必要があるのでしょうか??
    未熟者で申し訳ありません。。

    エラーの件ありがとうございます!実行してみます!!

    キャンセル

  • 2018/04/18 13:34 編集

    そもそもKadai2_15sam側に問題があるのでは。
    「画面が真っ白」はPHPがエラー(割と高めのレベルのエラー)を吐き出してそこで処理が止まっているだけなので、やはりエラー出力はOnにしておくべきと思います。
    勉強中、開発中であればなおさらです。特に最初の頃はエラーメッセージを解決することによって問題が解決するものだからです。

    というか、プログラムの作りとしておかしいので、本来は全体的に作り直す必要があると思っています。

    Kadai2_1samに対してpostするのであればKadai2_15samの存在の意味がありません。
    途中でechoやらvar_dumpやらしているのでhtml構造としてもおかしくなるはずですし。

    私としてはPHP処理部分とHTML部分が混ざっている時点でNGです。処理系と出力系は完全に分離した方がコードが見やすくなります。

    例:
    //list.php
    <form action="delete.php" method="POST" name="deleteform">
    <p>削除対象番号:</p><!-- 削除対象番号 -->
    <input type="number" name="deleteNo">
    <p>消去パスワード:</p>
    <input type="password" name="delpas" required="required" maxlength='8' placeholder='8字以内'>
    <input type="button" name="delete" value="削除" onClick="disp();">
    </form>


    //delete.php
    <?php
    $message = "";
    if ($_SERVER ['REQUEST_METHOD'] === 'POST') {
    $no =filter_input(INPUT_POST, 'deleteNo');
    $pass =filter_input(INPUT_POST, 'password');
    //削除処理
    $message = "削除成功";
    }else{
    die("不正アクセス");
    }
    ?>
    <html>
    <body>
    処理結果:<?=$message?>
    </body>
    </html>
    -----------------------

    あと気になる点はPOSTされたデータを型キャストしているところですかね。
    不正な入力情報が渡されることが心配であればバリデーション(入力内容のチェック)をして
    不正であればエラーとして返すべきですね。まあこの辺りは次の段階でしょうけど。
    安易なキャストはバグの温床となります。ご注意を。

    キャンセル

+1

的外れでしたら、すみません。

function disp(){
  if(window.confirm('本当にいいんですね?')){
     return true;
  } else{
     //下のphpコード、おそらく必要ないように思えます。
     <?php $_POST["delete"] = NULL; ?>
     window.alert('キャンセルされました');
     return false;
  }
}
<!-- formにonsubmitをつけます。↓ -->
<form id="deleteForm" action="<?php echo($_SERVER['SCRIPT_NAME']) ?>" method="POST" onsubmit="return disp()">

 <p>削除対象番号:</p><!-- 削除対象番号 -->
  <input type="number" name="deleteNo">
  <p>消去パスワード:</p>
  <input type="password" name="delpas" required="required" maxlength='8' placeholder='8字以内' autocomplete="off">

 <!-- 元々あったonclickを削除。↓ -->
  <input id="deleteSubmit" type="submit" name="delete" value="削除">
</form>


参考になるかもしれません。
https://stackoverflow.com/questions/4227043/how-do-i-cancel-form-submission-in-submit-button-onclick-event?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/18 13:30

    回答ありがとうございます!
    このやり方でもできました😭
    とても助かりました!

    キャンセル

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

  • PHP

    21389questions

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

  • JavaScript

    17586questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    9613questions

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