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

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

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

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

PHP

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

Q&A

解決済

1回答

2905閲覧

postされた値を元にデータベースからデータを削除したいです

newyee

総合スコア213

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/03/03 13:35

編集2019/03/04 03:10

PHPの学習としまして、簡易な掲示板を作成したのですが、つまずいてしまった為、お聞きしたい箇所がございます

php

1<?php 2include 'includes/login.php'; 3 error_reporting(E_ALL); 4 ini_set("display_errors",1); 5 //1ページに表示されるコメントの数 6 $num = 10; 7 $user = 'root'; 8 $password = ''; 9 $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8'; 10 //ページ数が指定されている時 11 $page = 0; 12 if(isset($_GET['page']) && $_GET['page'] > 0){ 13 $page = intval($_GET['page']) -1; 14 15 } 16 17 try{ 18 $dbh = new PDO($dsn,$user,$password); 19 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 20 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 21 22 $stmt = $dbh->prepare("SELECT * FROM post ORDER BY created_at DESC LIMIT 23 :page,:num"); 24 //パラメーターを割り当て 25 $page = $page * $num; 26 $stmt->bindValue(':page',$page,PDO::PARAM_INT); 27 $stmt->bindValue(':num',$num,PDO::PARAM_INT); 28 $stmt->execute(); 29 30 }catch(PDOException $e){ 31 echo "エラー: " . $e->getMessage(); 32 } 33 34 35 36?> 37 38 <html> 39 <head> 40 <title>交流サイト:掲示板</title> 41 <meta charset="utf-8"> 42 </head> 43 <body> 44 <h1>掲示板</h1> 45 <form action="write.php" method="post"> 46 <p>名前:<input type="text" name="name" value="<?php echo isset($_COOKIE['name']) ? $_COOKIE['name'] : '' ?>"></p> 47 <p>タイトル:<input type="text" name="title" size="60"></p> 48 <textarea name="comment"></textarea> 49 <p>削除パスワード(数字4桁):<input type="text" name="pass"> 50 <input type="submit" name="submit" value="書き込む"> 51 <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>"> 52 </form> 53 <hr> 54 <?php 55 while($row = $stmt->fetch()): 56 $title = $row['title'] ? $row['title'] : '(無題)'; 57 ?> 58 <p>名前:<?php echo $row['name'] ?></p> 59 <p>タイトル:<?php echo $title ?></p> 60 <p><?php echo nl2br(htmlspecialchars($row['comment'],ENT_QUOTES,'UTF-8'),false) ?></p> 61 <p><?php echo $row['created_at'] ?></p> 62 <form action="delete.php" method="post"> 63 <input type="hidden" name="id" value="<?php echo $row['id']; ?>"> 64 削除パスワード:<input type="password" name="pass"> 65 <input type="submit" value="削除"> 66 <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>"> 67 </form> 68 <?php 69 endwhile; 70 //ページ数の表示 71 try{ 72 $stmt = $dbh->prepare("SELECT COUNT(*) FROM post"); 73 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 74 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 75 76 //クエリの実行 77 $stmt->execute(); 78 79 }catch(PDOException $e){ 80 echo "エラー:" . $e->getMessage(); 81 } 82 /** 83 * コメントの件数を取得 84 *fetchColumn関数で 最初のレコードを取り出し、最初の列「id」のデータを取り出す 85 * idは降順に設定されているため、コメントの件数が分かる 86 * */ 87 $comments = $stmt->fetchColumn(); 88 $max_page = ceil($comments / $num); 89 echo '<p>'; 90 for($i = 1; $i <= $max_page; $i++){ 91 echo '<a href="bbs.php?page=' . $i .'">' . $i . 92 '</a>&nbsp;'; 93 } 94 echo '</p>'; 95 ?> 96 97 </body> 98 </html>

上記は掲示板の、コメントの表示部分及び、ユーザの名前、コメントなどの入力部分を表示し、投稿されたコメントをデータベースより取得し、表示する「bbs.php」になります。

php

1<?php 2include 'includes/login.php'; 3 error_reporting(E_ALL); 4 ini_set("display_errors",1); 5 $id = intval($_POST['id']); 6 $pass = $_POST['pass']; 7 $token = $_POST['token']; 8 //var_dump($id); 9 10 11 if($id == '' || $pass == ''){ 12 echo '入力エラーです'; 13 //header('Location:bbs.php'); 14 exit(); 15 } 16 if(!password_verify(session_id(),$token)){ 17 echo 'セッションエラー'; 18 //header('Location:bbs.php'); 19 exit(); 20 }; 21 22 $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8'; 23 $user = 'root'; 24 $password = ''; 25 try{ 26 $dbh = new PDO($dsn,$user,$password); 27 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 28 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 29 $stmt = $dbh->prepare( 30 "DELETE FROM post WHERE id = :id AND password = :pass" 31 ); 32 33 $stmt->bindValue(':id',$id,PDO::PARAM_INT); 34 $stmt->bindvalue(':pass',$pass,PDO::PARAM_STR); 35 $stmt->execute(); 36 37 }catch(PDOExeption $e){ 38 39 echo "エラー:" . $e->getMessage(); 40 } 41 42 header("Location:bbs.php"); 43 exit(); 44 45?>

上記は、投稿されたコメントの削除リクエストが、フォームより送信された場合、データベースより、投稿されたコメント、投稿したユーザー名、日付、タイトルを削除し、「bbs.php」へと遷移させる、「delete.php」になります。

下記の画像は、bbs.phpの画像です。
イメージ説明

お聞きしたい部分なのですが、bbs.phpのコメントを削除する為、パスワードを入力し削除ボタンを押すと、delete.phpにて、データベースに追加されている投稿されているコメント情報が削除されるはずなのですが、データベースからコメント情報を削除できません。
エラーも出ていない為、原因が分かりません。
どなたか、ご助言頂けましたら幸いです。よろしくお願いします。
※追記です
以下は投稿されたコメントをデータベースに追加する「write.php」になります

php

1<?php 2include 'includes/login.php'; 3error_reporting(E_ALL); 4ini_set('display_errors', '1'); 5$name = $_POST['name']; 6 7$title = $_POST['title']; 8$comment = $_POST['comment']; 9$pass = $_POST['pass']; 10$token = $_POST['token']; 11$err_message = []; 12 13if($name == '' || $comment == ''){ 14 $err_message[] = '名前または、コメントが入力されていません'; 15 16} 17 18if(!preg_match("/^[0-9]{4}$/",$pass)){ 19 $err_message[] = 'パスワードを4文字で入力してください'; 20 21} 22 23if(count($err_message) === 0){ 24 //CSRF対策 25 if(!password_verify(session_id(),$token)){ 26 header('Location:bbs.php'); 27 exit(); 28 } 29 30 setcookie('name',$name,time() + 60 * 60 * 24 * 30); 31 32 33 34 //データベースに接続 35 $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8'; 36 $user = 'root'; 37 $password = ''; 38 39 try{ 40 $db = new PDO($dsn,$user,$password); 41 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 42 $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 43 $stmt = $db->prepare(" 44 INSERT INTO post (name,title,comment,created_at,password) 45 VALUES (:name, :title, :comment, now(), :pass)"); 46 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 47 $stmt->bindValue(':title',$title,PDO::PARAM_STR); 48 $stmt->bindValue(':comment',$comment,PDO::PARAM_STR); 49 $stmt->bindValue(':pass',$pass,PDO::PARAM_STR); 50 $stmt->execute(); 51 52 }catch(PDOException $e){ 53 die ('エラー:' . $e->getMessage()); 54 } 55 56} 57 58?> 59<html> 60<head> 61 <meta charset="utf-8"> 62 <title>Page Title</title> 63 64</head> 65<body> 66 <?php 67 echo implode("<br />",$err_message); 68 ?> 69 <p><a href="bbs.php">戻る</a> 70</body> 71</html>

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

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

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

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

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

m.ts10806

2019/03/03 13:42

PDOException拾っているところでそこで止めずにheader()でリダイレクトしてるから 何かしら異常検知しても分かるようになってませんよ<エラーも出ていない
newyee

2019/03/04 01:38

ご指摘ありがとうございます。 すみません。ご指摘頂いた箇所が把握できない為、具体的に、どの箇所か教えて頂けませんでしょうか?
m.ts10806

2019/03/04 01:41

2つ目のPHPのここ }catch(PDOExeption $e){ echo "エラー:" . $e->getMessage(); } header("Location:bbs.php"); exit(); すごく簡単なコードで試してみるといいですよ。 echo "a"; header("Location:test.php"); として「a」が見れるかどうか。 このコードの作りだと PDOExeption で異常が何か起きていたとしても画面確認できません。 異常が起きているのを拾ってくれてるのですから、処理を進めてはいけません。
newyee

2019/03/04 02:21

ご返信ありがとうございます。 簡単なコードでエラーを発生させ試してみましたら、echoされず、PDOExceptioonで拾ったエラーメッセージも表示されませんでした...そして、header("Location :bbs")を取り除きましたら、エラーが発生しました。ずっとtry,catch文では、tryの中で発生したエラーはcatchで補足され、それ以降の処理は止まるものだと勘違いしていました... 2つ目のPHPである、「delete.php」なのですが、header()関数を取り除き試してみたのですが、エラーはできませんでした...
m.ts10806

2019/03/04 02:25

明示的に止めるようにしないと止まることはないです。 プログラムは書いたとおりに動くわけであって、思ったとおりに動くわけではありません。 >2つ目のPHPである、「delete.php」なのですが、header()関数を取り除き試してみたのですが、エラーはできませんでした... あれ?エラーは「delete.php」ですよね。私の指摘は2つ目のコードのことで「header("Location :bbs")を取り除きましたら、エラーが発生しました。」は2つ目のコードではないのですか?
newyee

2019/03/04 02:26

delete.phpのコードに関しましては、参考書に記載されていたものを自分で一度参考にしながら書いてみたものなのですが、恐らく、delete.phpの最後で、header('Location : bbs.php')としなければ、データを削除した後に、bbs.php(掲示板のコメント一覧ページ)に戻れないからだと思いますが、それですと、エラーメッセージは出力されないですし、難しい所ですね...
m.ts10806

2019/03/04 02:28

単にcatchブロックでdie()なりexit()なり止める様にすれば良いだけでは。 }catch(PDOExeption $e){ die( "エラー:" . $e->getMessage()); }
m.ts10806

2019/03/04 02:28

PDOExeption をCatchしているということはtryブロックの中は正常終了してないわけですから、次に進める必要はないです。
newyee

2019/03/04 02:34

あ、すみません。エラーが発生したのは、一度、簡単なコードで、意図的にエラーを発生させ、PDOExceptionで拾ったエラーをcatch文で出力する処理を書いた後に、header('Location:bbs.php')を書いた状態であったら、エラーが出力されるかどうかを、試してみたんですが、header('Location:bbs.php')を取り除いたら、エラーが出力されたのですが、それはテスト用に作ったコードでしたので、delete.phpではないです。勘違いするような書き方をしてしまい申し訳ないです。
newyee

2019/03/04 02:43

>単にcatchブロックでdie()なりexit()なり止める様にすれば良いだけでは 確かにそうですよね...修正したいと思います。
m.ts10806

2019/03/04 03:00

あと念のため、データを追加するほうのコードも提示しておいてください。
newyee

2019/03/04 03:03

承知しました。追記しておきます。
m.ts10806

2019/03/04 03:11

passは平で保存してると言うことでいいですね?(セキュリティ上はNGです)
newyee

2019/03/04 03:15 編集

重大なミスを犯してしまっていることに気づいたのですが、投稿するパスワードを入力する際、COOKIEに保存されていたパスワードが候補として出た為、毎回それを選んで削除ボタンを押していたのですが、検索候補に出た名前と、コメント一覧の投稿者の名前が違っていることに気づき、パスワードを手入力しましたら、コメントを削除できました。プログラム上のミスなどでもなく、単なる僕の勘違いでした...お手数をお掛けしてすみませんでした...
newyee

2019/03/04 03:16

なんか本当に申し訳ないです...
newyee

2019/03/04 03:23

コメントの削除パスワードは暗号化していなかったですね... 参考書通りに進めていまして、コメントの削除パスワードは暗号化されていなかったので、良いのかなと思ったのですが、暗号化した方が良いですよね...修正してみたいと思います。
m.ts10806

2019/03/04 03:47 編集

まあ、よくありますね。 コードに問題がないのであれば大体ヒューマンエラーです。 そこはデバッグで(変数の内容確認含め)問題の切り分けが可能です。 参考までにDB接続部分作り変えたものを提示しようかなと思ってましたが、 今の質問者さんには宇宙コードになりそうなので、アドバイスだけ。 同じ処理を何度も繰り返し書くのは無駄です。 そのために変数があるわけですが、それは処理も同じです。 DB接続情報作って、try-catchで囲ってpdoをnewして・・・ これ何回も出てくるのでまとめた方が良いです。 あと扱うテーブルが多くなってくるとselect * from aaa where ・・・ 同じく、何度も書くのは無駄です。 変わるのはテーブルとwhereの条件部分なので、そこは変数や配列をうまくつかって共通化しましょう。
m.ts10806

2019/03/04 03:29

ちなみに書籍は「とりあえず動いて挙動を実感できる」を優先させているものが多いのは確かなので、 「実際はこうすべき」といったところは書籍だけでは得られない部分だったりします。 「PHP7対応したよ!」という書籍であっても未だに比較で===ではなく==を使っていたり $_POSTから直接値を参照したりしているので、そのあたりはQiitaなどの優良記事を参考したほうがいい部分でもあります。
m.ts10806

2019/03/04 03:34

ひとまず、顛末と解決した方法を書いて自己解決としておいてください。 申し訳ないと思うことはないと思います。確認不足とかない話ではないので。 ただ、クッキーとかキャッシュとかって結構根深かったりするので、 パスワード入力するフィールドにtype=passwordを使わないという手もあったりします。
newyee

2019/03/04 04:02

ご丁寧に、教えてくださりありがとうございます。 コメントを削除するパスワードを暗号化し、データベースに入力し、その暗号化されたパスワードを入力された値と照合しようとした際も、DBに接続し、プリペアードステートメントを書いて、などという処理を書いていたら、DBに接続する処理が増えてしまいますし、確かにかなりの手間ですよね... 一度、粗方、掲示板が出来上がりましたら、そこらへんを考慮して、修正して作りなおしていきたいと思います。 >ひとまず、顛末と解決した方法を書いて自己解決としておいてください 了解しました。ご丁寧にアドバイスくださり、誠にありがとうございました。
m.ts10806

2019/03/04 04:07

DBの処理をまとめるものこそオブジェクト指向でクラスにまとめるのが有用です。 この際、関数化から少しずつチャレンジしてみては?
newyee

2019/03/04 04:11

そうですね...オブジェクト指向の知識はまだまだ全然なので、色々調べながら、一度チェレンジしてみようと思います。
m.ts10806

2019/03/04 04:12

案ずるより産むがやすしという言葉があります。 敬遠しているうちは難しそう俺には無理だと感じるだけで導入部分だけでしたら やってみたら案外大丈夫なものです(使いこなすというところまで最初は考えなくても良いです)
newyee

2019/03/04 04:24

分かりました。一度思い切ってチャレンジしてみようと思います!
m.ts10806

2019/03/04 04:27

そこで詰まったら質問すれば良い というのがあるはずなので、じっくりしっかりできると思います。
guest

回答1

0

自己解決

データベースから投稿されたコメントが削除できないと、ご質問させて頂いたのですが、削除パスワードを入力する際、COOKIEに保存されているパスワードを選んで入力していたのですが、COOKIEに保存されていたコメントのユーザー名のパスワードと実際の削除しようとした、コメントのパスワードが違った為、削除することができませんでした。単なる自分の勘違いによるものでしたので、以後気を付けたいと思います。

投稿2019/03/04 05:04

newyee

総合スコア213

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問