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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

1回答

1528閲覧

PDOによるMySQLでのデータ取得が上手くいきません

dcf

総合スコア20

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2019/04/15 10:44

現在PHPで掲示板を作成しているのですが、削除フォームに書き込み番号とパスワードを入力し、その書き込み番号に該当するパスワード(書き込み時に入力されたもの)をデータベースから取得し、削除フォームに入力されたパスワードと合致していれば削除するという仕組みにしたいです。
しかし、データベースから書き込み番号に該当するパスワードを取得する部分が上手くいかないです。取得された値をvar_dump関数で表示してみると論理値(True or False)になっておりデータベースからパスワードが正確に取得できていないことがわかりましたが、具体的な解決手段が分かっていない状態です。恐らく「WHERE = $deletenumber」によってテーブルの位置を指定する部分が間違っていると思っていますが解決方法が分かりません。コードは以下の通りです。

<!DOCTYPE html> <html lang = “ja”> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>掲示板</title> </head> <body> <?php //PDOの変数定義(セキュリティ上の都合から変数の値は消しています) $servername = $username = $password = $dbname =
//表の描画 echo "<table style='border: solid 1px black;'>"; echo "<tr><th>書き込み番号</th><th>名前</th><th>内容</th><th>書き込み時刻</th></tr>"; //書き込みに関するクラスの定義 class TableRows extends RecursiveIteratorIterator { function __construct($it) { parent::__construct($it, self::LEAVES_ONLY); } function current() { return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>"; } function beginChildren() { echo "<tr>"; } function endChildren() { echo "</tr>" . "\n"; } } //変数定義 $time = date("Y/m/d H:i:s"); $err_msg1 = ""; $err_msg2 = ""; $err_msg3 = ""; $err_msg4 = ""; $err_msg5 = ""; $message =""; $name = ( isset( $_POST["name"] ) === true ) ?$_POST["name"]: ""; $comment = ( isset( $_POST["comment"] ) === true ) ? trim($_POST["comment"]) : ""; $deletenumber = ( isset( $_POST["deletenumber"] ) === true ) ?$_POST["deletenumber"]: ""; $editnumber = ( isset( $_POST["editnumber"] ) === true ) ?$_POST["editnumber"]: ""; $inputpass = ( isset( $_POST["inputpass"] ) === true ) ?$_POST["inputpass"]: ""; $deletepass = ( isset( $_POST["deletepass"] ) === true ) ?$_POST["deletepass"]: ""; $editpass = ( isset( $_POST["editpass"] ) === true ) ?$_POST["editpass"]: ""; try{ //PDO関連 $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); // $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //掲示板処理 if(isset($_POST["btn1"]) === true){ //書き込み処理 if($_POST["state"] != "editmode"){ if($name === "" ){ $err_msg1 = "名前を入力してください"; echo $err_msg1.'<br>'; echo '<br>'; }elseif($comment === "" ){ $err_msg2 = "コメントを入力してください"; echo $err_msg2.'<br>'; echo '<br>'; }elseif($pass === ""){ $err_msg3 = "パスワードを入力してください"; echo $err_msg3.'<br>'; echo '<br>'; }elseif($err_msg1 === "" && $err_msg2 ==="" && $err_msg3 ===""){ //MySQLへの書き込み $sql = "INSERT INTO bbs(name, comment, time, password) VALUES('$name', '$comment', '$time', '$inputpass')"; $conn->exec($sql); } }elseif($_POST["state"] == "editmode"){ if($name === "" ){ $err_msg1 = "名前を入力してください"; echo $err_msg1.'<br>'; echo '<br>'; }elseif($comment === "" ){ $err_msg2 = "コメントを入力してください"; echo $err_msg2.'<br>'; echo '<br>'; }elseif($pass === ""){ $err_msg3 = "パスワードを入力してください"; echo $err_msg3.'<br>'; echo '<br>'; }elseif($err_msg1 === "" && $err_msg2 ==="" && $err_msg3 ===""){ //MySQLの編集 $sql_2 = "UPDATE bbs SET comment = '$comment' WHERE number = '$editnumber' "; $conn->exec($sql_2); } } }elseif(isset($_POST["btn2"]) === true){ //削除処理   //MySQLの参照による削除 if($deletepass === ""){ $err_msg4 = "パスワードが入力されていません!".'<br>'; echo $err_msg4; }elseif($err_msg4 === ""){ $sql_delete = $conn->prepare("SELECT password FROM bbs WHERE number = '$deletenumber' "); $registeredpass = $sql_delete->execute(); if($deletepass === (string)$registeredpass){ $sql_3 = $conn->prepare("UPDATE bbs SET name = 'この書き込みは削除されました', comment = 'この書き込みは削除されました', time = '0' WHERE number = '$deletenumber' "); $sql_3->execute(); }elseif($deletepass !== (string)$registeredpass){ echo "パスワードが間違っています!".'<br>'; echo '<br>'; } } }elseif(isset($_POST["btn3"]) === true){ //編集処理 //MySQLの参照で入力フォームへ送信 $sql_edit = "SELECT password FROM bbs WHERE number = '$editnumber' "; $registeredpass_2 = $conn->exec($sql_edit); if($editpass === ""){ $err_msg5 = "パスワードが入力されていません!".'<br>'; echo $err_msg5; }elseif($err_msg5 === ""){ if($editpass === $registeredpass_2){ $get_name_0 = "SELECT name FROM bbs WHERE number = '$editnumber' "; $get_comment_0 = "SELECT comment FROM bbs WHERE number = '$editnumber' "; $get_name = $conn->exec($get_name_0); $get_comment = $conn->exec($get_comment_0); }elseif($editpass !== $registeredpass_2){ echo "パスワードが間違っています".'<br>'; echo '<br>'; } } } //書き込み表示 //MySQLの読み込みと表示 $stmt = $conn->prepare("SELECT number, name, comment, time FROM bbs ORDER BY number ASC"); $stmt->execute(); $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { echo $v; } }catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?> <h1>書き込みフォーム</h1> <form action=".php" method="post"> <?php if(isset($_POST["btn3"])):?> <div>名前</div> <input type="text" name="name" value="<?php echo $get_name; ?>"><br></br> <div>内容</div> <input type="text" name="comment" value="<?php echo $get_comment; ?>"><br></br> <div>パスワード</div> <input type ="password" name="inputpass"><br></br> <input type="hidden" name="state" value ="editmode"> <input type="submit" name="btn1" value="書き込む"> <?php else:?> <div>名前</div> <input type="text" name="name"><br></br> <div>内容</div> <input type="text" name="comment"><br></br> <div>パスワード</div> <input type ="password" name="inputpass"><br></br> <input type="submit" name="btn1" value="書き込む"> <?php endif;?> </form> <h1>削除用フォーム</h1> <form action=".php" method="post" id ="submit"> <div>削除番号</div> <input type="text" name="deletenumber"><br></br> <div>パスワード</div> <input type ="password" name="deletepass" ><br></br> <input type="submit" name="btn2" value="削除する"> </form> <h1>編集用フォーム</h1> <form action=".php" method="post"> <div>編集番号</div> <input type="text" name="editnumber"><br></br> <div>パスワード</div> <input type ="password" name="editpass" ><br></br> <input type="submit" name="btn3" value="編集する"> </form> <br></br> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <script> $(function () { $('#submit').submit(function () { return confirm("本当に削除してもよろしいですか?"); }); }); </script>
</body> </html>

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

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

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

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

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

m.ts10806

2019/04/15 12:23

コードはマークダウンのcode機能を利用してご提示ください
guest

回答1

0

ベストアンサー

phpコード開始冒頭に、

php

1ini_set('display_errors', 1); 2error_reporting(E_ALL);

などとすることで、エラーがwebブラウザ内に出力されるようになるので、
まずはエラー内容を確認しましょう。

--

以下は、気になったところの指摘。エラーに直接関係ないかもしれない。

せっかくMySQL接続にPDOを使っているなら、
SELECT文などのクエリーに直接変数を当てるのではなく、
PHP: PDOStatement::bindParam - Manual
を使いましょう。
例えば:

php

1$sql_delete = $conn->prepare("SELECT password FROM bbs WHERE number = :deletenumber;"); 2$sql_delete->bindParam(':deletenumber', $deletenumber, PDO::PARAM_INT); 3$registeredpass = $sql_delete->execute();

みたいな。

また、データベースの識別子(スキーマ名、テーブル名、カラム名など)は
バッククォートをつけるとデータベースの予約語と混在しても実行できるようになります。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.2 スキーマオブジェクト名

識別子に特殊文字が含まれている場合、または識別子が予約語である場合、その識別子を参照するときは必ず引用符で囲む必要があります。

識別子引用符文字は逆引用符 (「`」) です。

投稿2019/04/15 11:24

編集2019/04/15 11:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

dcf

2019/04/16 06:33

アドバイスありがとうございました その他の手段も検索しつつ試行したところ無事に解決致しましたので報告させていただきます
退会済みユーザー

退会済みユーザー

2019/04/16 06:59

トラブル解決にどのくらい役に立ったかわかりませんが、 (今後、将来)同じようなトラブルにハマる人のために、 どのようにして解決に至ったか第三者にわかるように書き添えていただきたいところです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問