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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Q&A

解決済

2回答

805閲覧

PHPで入力チェックの警告が最初から表示されてしまう

cacao86

総合スコア97

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

0グッド

1クリップ

投稿2020/05/08 11:55

編集2020/05/08 12:05

PHPで簡易掲示板を作成しています。削除する時にパスワードの入力を要求し、空または間違っていたら警告を出して再入力をさせるようにしています。現在、削除画面に遷移した時点で最初から「*パスワードが間違っています。正しく入力してください。」と表示されてしまいます。SESSIONを使おうとしましたが使い方がよくわからずで四苦八苦しています。
どのようにすれば、入力チェックしてから警告を表示するよになるのか助言いただきたいです。
よろしくお願いします!

php

1delete.php(削除画面) 2 3<?php 4require_once('function.php'); 5require('dbconnect.php'); 6 7 $id = $_POST['id']; 8 $stmt = $db->prepare("select * from table WHERE id = :id"); 9 $stmt->execute(array(':id' => $_POST['id'])); 10 $result = $stmt->fetch(PDO::FETCH_ASSOC); 11 12 if(!empty($_POST)){ 13 if ($_POST['password'] === '') { 14 $error['password'] = 'blank'; 15 } 16 if ($_POST['password'] !== $result['password']){ 17 $error['password'] = 'miss'; 18 } 19 if(empty($error)){ 20 $stmt = $db->prepare("update table set deleted_at = cast(now() as datetime) WHERE id = $id"); 21 $stmt->execute(); 22 header('Location: index.php'); 23 exit(); 24 } 25 } 26?> 27<!DOCTYPE html> 28<html lang="ja"> 29<head> 30 <meta charset="UTF-8"> 31 <title>削除</title> 32</head> 33<body> 34 <h3>以下の内容を削除します。</h3> 35 <div class=""> 36 ID<?php echo $result['id']; ?> 37 </div> 38 <form action="" method="post"> 39 <div> 40 <input type="hidden" name="id" value="<?php print(h($result['id'])); ?>"> 41 </div><br> 42 <div>件名: 43 <?php print(h($result['subject']))?> 44 </div><br> 45 <div>本文: 46 <?php print(h($result['body']))?> 47 </div><br> 48 <div>パスワード: 49 <input type="password" name="password" required> 50 <?php if ($error["password"] === "blank") : ?> 51 <p class="error">*パスワードを入力してください</p> 52 <?php endif; ?> 53 <?php if ($error["password"] === "miss") : ?> 54 <p class="error">*パスワードが間違っています。正しく入力してください。</p> 55 <?php endif; ?> 56 </div><br> 57 <input type="submit" value="削除する" onclick="return check()"> 58 </form> 59 </div> 60 <p> 61 <a href="index.php">投稿一覧へ</a> 62 </p> 63 <p> 64 <a href="create.php">新規投稿へ</a> 65 </p> 66 67 <script type="text/javascript"> 68 function check(){ 69 if(window.confirm('本当に削除しますか?')){ 70 return true; 71 var elements = document.getElementsByName('id') ; 72 if(elements == true){ 73 location.href = "delete.php"; 74 }else{ 75 window.alert('キャンセルされました'); 76 return false; 77  } 78 } 79 } 80 </script> 81</body> 82</html> 83

下記の[削除]を押してPOSTでdelete.phpへ遷移しています。
$pはIDで以下の画像だと1657に当たります。

php

1foreach ($tree as $p => $t) { 2 $data = $this->data[$p]; 3 echo "<table>"; 4 if($data['parent_id']===null){ 5 echo <<<EOT 6 <tr> 7 <td>{$p}</td> 8 <td><a href="edit.php?id={$p}">{$data['subject']}</a></td> 9 <td>{$data['post_user']}</td> 10 <td>{$data['created_at']}</td> 11 <form action="child_create.php" method="GET"> 12 <td><button name="id" value="{$p}">[コメント]</button></td> 13 </form> 14 <form action="delete.php" method="POST"> 15 <td><button name="id" value="{$p}">[削除]</button></td> 16 </form> 17 </tr> 18 EOT;

削除画面遷移後以下の画像のように最初から警告が出てしまっています。
イメージ説明

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

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

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

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

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

m.ts10806

2020/05/08 11:57

削除画面にはどのように遷移しているのでしょうか。
guest

回答2

0

ベストアンサー

formの場所が怪しい気がしないでもない。置いてはダメな場所に置いてる気がする。


下記の[削除]を押してPOSTでdelete.phpへ遷移しています。

ということはdelete.phpに遷移したときのREQUEST METHODは「POST」です。

if(!empty($_POST)){

ここはtrueになるから入るし

if ($_POST['password'] === '') {

ここは本来はundefined indexのはず(だから式は成り立たない)

けど

if ($_POST['password'] !== $result['password']){

idを送信していることにより$resultは取れてるので、この式は成り立ち

$error['password'] = 'miss';

に至る。

あらゆる分岐にecho入れてみれば良いですよ。

php

1<?php 2require_once('function.php'); 3require('dbconnect.php'); 4echo __LINE__.PHP_EOL; 5 $id = $_POST['id']; 6 $stmt = $db->prepare("select * from table WHERE id = :id"); 7 $stmt->execute(array(':id' => $_POST['id'])); 8 $result = $stmt->fetch(PDO::FETCH_ASSOC); 9 10 if(!empty($_POST)){ 11echo __LINE__.PHP_EOL; 12 if ($_POST['password'] === '') { 13echo __LINE__.PHP_EOL; 14 $error['password'] = 'blank'; 15 } 16 if ($_POST['password'] !== $result['password']){ 17echo __LINE__.PHP_EOL; 18 $error['password'] = 'miss'; 19 } 20 if(empty($error)){ 21echo __LINE__.PHP_EOL; 22 $stmt = $db->prepare("update table set deleted_at = cast(now() as datetime) WHERE id = $id"); 23 $stmt->execute(); 24 header('Location: index.php'); 25 exit(); 26 } 27 } 28?> 29

これで数字が出力されていればdelete.phpの該当行数を通っているということ。
var_dump()の次くらいにデバッグで用いる手段です。


で「どのようにすれば」ですが、そこは既に指摘があるように設計を見直すべきかと思います。
「一般的な削除機能ってどうなっているだろう」検証するところから入ってみてください。

もちろん、自身が作ろうとしているものですから、そのまま適用できそうな機能ってないかもしれませんが、「一般的なやり方」を知ってこそできると思うので、まずそこから、ですね。

見た感じ、パスワードを入力して照合させるみたいですが、そのパスワードって誰が決めたものでしょう?
パスワードが分かれば誰でも削除できていいの?総当たり攻撃で全部削除されたらどうする?

このあたりを考えてみてください。

現状を打開するだけならそこまで難しいことは必要ではないです。GETやPOSTの特性をきちんと捉え、切り分けていけばいいだけですから。でも本当にそれでいいのか?は考えてもらいたいです。

投稿2020/05/08 14:31

m.ts10806

総合スコア80861

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

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

cacao86

2020/05/11 07:03

echo __LINE__.PHP_EOL;でどこまで通っているか理解できました。 POSTとGETを見直して書いたら解決できました。 ありがとうございます。 また、今後の参考にしたくお尋ねしたいのですが、formの置き場所がダメというのはどういう事でしょうか?詳しく教えてください。
m.ts10806

2020/05/11 07:35

>formの置き場所がダメというのはどういう事でしょうか? TDの外、というか間?と言うべきか、 HTML文法的に、要素を置ける場所ではないです。 文法チェックしてみると良いです。 http://www.htmllint.net/html-lint/htmllint.html#
cacao86

2020/05/11 09:07

勉強になりました! ありがとうございます。
m.ts10806

2020/05/11 09:45

そういうこともあるので、先に正しいHTMLを組んでからPHPを組んでください。「モック作成」という本来必須のの工程になります。
guest

0

idとpasswordだけ渡してdeleteを判断するのは困難。
action:delなど何をするかも書いてください

投稿2020/05/08 12:05

yambejp

総合スコア115010

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

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

yambejp

2020/05/08 12:06

del情報があるときは警告をだすなど、判断基準になります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問