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

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回答

2052閲覧

PHPとMySQLを連携させた掲示板で削除が実行されません

chimo

総合スコア55

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グッド

2クリップ

投稿2020/06/07 04:57

編集2020/06/07 07:36

PHPとMySQLを組み合わせて簡単な掲示板を作成しました。
【コード】

php

1<?php 2 3try{ 4 5 //DBへ接続 6 $pdo = new PDO( 7 'mysql:host=localhost;dbname=****;charaset=utf8', 8 '****', 9 '****', 10 [ 11 PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 12 PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC, 13 PDO::ATTR_EMULATE_PREPARES=>false, 14 ] 15 ); 16 17 echo "接続成功"; 18 echo "<br>"; 19 20 //-----------------【CREATEでテーブルを作る】---------------- 21 $tb_name='keijiban2'; 22 23 $sql= "CREATE TABLE IF NOT EXISTS $tb_name ( 24 number INT AUTO_INCREMENT PRIMARY KEY, 25 name VARCHAR(20), 26 message VARCHAR(200), 27 regi_date DATETIME, 28 password VARCHAR(10) 29 )ENGINE=InnoDB DEFAULT CHARSET=utf8"; 30 31 $stmt=$pdo->prepare($sql); 32 $stmt->execute(); 33 34 //-------テーブルの存在を確認------- 35 $rs=$pdo->query("SHOW TABLES"); 36 $table=$rs->fetchAll(PDO::FETCH_COLUMN); 37 if(in_array($tb_name,$table)){ 38 echo "テーブルの存在を確認しました"."<br>"; 39 echo "テーブル名:".$tb_name."<br>"; 40 }else{ 41 echo "テーブル:".$tb_name."がありません"; 42 } 43 44 // 変数の初期化 45 $now_date = null; 46 $data = null; 47 $split_data = null; 48 $message = array(); 49 $message_array = array(); 50 $success_message = null; 51 $delete = null; 52 $del_con = null; 53 $del_data = array(); 54 55 //-------------------【MySQLにデータを書き込む】------------------- 56 57 if( isset($_POST['btn_submit']) ) { 58 59 //---------未入力のバリデーション-------- 60 if(empty($_POST['view_name'])){ 61 echo '名前を入力してください!'; 62 exit(); 63 } 64 65 if(empty($_POST['message'])){ 66 echo 'メッセージを入力してください!'; 67 exit(); 68 } 69 70 if(empty($_POST['pass'])){ 71 echo 'パスワードを入力してください!'; 72 exit(); 73 } 74 //------------INSERTでデータを入力-------------- 75 $number=NULL; 76 $name=$_POST['view_name']; 77 $message=$_POST['message']; 78 $password=$_POST['pass']; 79 80 //SQL文をかく 81 $sql="INSERT INTO $tb_name (number,name,message,regi_date,password) VALUES (:number,:name,:message,now(),:password)"; 82 $stmt=$pdo->prepare($sql); 83 $stmt->bindValue( ':number', $number, PDO::PARAM_INT ); 84 $stmt->bindValue( ':name', $name, PDO::PARAM_STR ); 85 $stmt->bindValue( ':message', $message, PDO::PARAM_STR ); 86 $stmt->bindValue( ':password', $password, PDO::PARAM_STR ); 87 $stmt->execute(); 88 89 //INSERT内容をブラウザで確認 90 $stmt=$pdo->prepare("SELECT * FROM $tb_name"); 91 $stmt->execute(); 92 foreach($stmt as $loop){ 93 echo "number:".$loop['number']."<br>". 94 "name:".$loop['name']."<br>". 95 "message:".$loop['message']."<br>". 96 "regi_date:".$loop['regi_date']."<br>". 97 "password:".$loop['password']."<br>"; 98 } 99 100 //投稿が成功したことを示すメッセージ 101 $success_message = 'メッセージを送信しました'; 102 } 103 //----------------【DELETEで指定した番号のメッセージを削除】-------------------- 104 if(isset($_POST['btn_delete'])){ 105 106 if((empty($_POST['deleteNo']))||(empty($_POST['pass']))){ 107 echo '削除番号とパスワードの両方を入力してください'; 108 exit(); 109 } 110 111 $deleteNo = $_POST['deleteNo']; 112 $delete_pass = $_POST['pass']; 113 114 $stmt=$pdo->prepare("SELECT * FROM $tb_name"); 115 $stmt->execute(); 116 117 //間違い探し 118 /*--------------------------------------------------------------- 119 foreach($stmt as $loop){ 120 echo $deleteNo."<br>"; 121 echo $loop['number']."<br>"; 122 echo $delete_pass."<br>"; 123 echo $loop['password']."<br>"; 124 } 125 ----------------------------------------------------------------*/ 126 127 foreach($stmt as $loop){ 128 if(($deleteNo==$loop['number'])&&($delete_pass==$loop['password'])){ 129 //DELETEの処理 130 $sql="DELETE FROM $tb_name WHERE number=:number"; 131 $stmt=$pdo->prepare($sql); 132 $stmt->bindValue(':number',$deleteNo,PDO::PARAM_INT); 133 $stmt->execute(); 134 echo "メッセージを削除しました"; 135 }else{ 136 echo "パスワードまたは削除番号が間違っています"; 137 exit(); 138 } 139 } 140 } 141 142 //---------------【SELECTでデータを選択してフォーム下に表示する】----------------- 143 $stmt=$pdo->prepare("SELECT * FROM $tb_name"); 144 $stmt->execute(); 145 146 foreach($stmt as $loop){ 147 $message = array( 148 'post_no'=>$loop['number'], 149 'view_name'=>$loop['name'], 150 'message'=>$loop['message'], 151 'post_date'=>$loop['regi_date'] 152 ); 153 array_unshift($message_array, $message); 154 } 155 156 /*--------------【テーブルを削除する】---------------- 157 $stmt=$pdo->prepare("drop table $tb_name"); 158 $stmt->execute(); 159 ------------------------------------------------------*/ 160 161}catch(PDOException $e){ 162 header('Content_Type:text/plain;charset=UTF-8',true,500); 163 exit($e->getMessage()); 164} 165 166//接続を閉じる 167$pdo = null; 168 169?> 170 171 172<!------------------------------<HTML>-----------------------------------> 173 174<!DOCTYPE html> 175<html lang="ja"> 176<head> 177<meta charset="utf-8"> 178<title>簡易掲示板</title> 179</head> 180 181<body> 182<h2>簡易掲示板(^-^*)</h2> 183 <?php if(!empty($success_message)):?> 184 <p class="success_message"><?php echo $success_message;?></p> 185 <?php endif; ?> 186 187 <form method="post"> 188 <div> 189 <label for="pass">パスワード</label> 190 <input type="password" name="pass" value="<?php if(isset($_POST['btn_edit'])){ echo $edit_pass; } ?>"> 191 </div> 192 <div> 193 <label for="view_name">名前</label> 194 <input type="text" name="view_name" value="<?php if(isset($_POST['btn_edit'])){ echo $edit_name; } ?>"> 195 </div> 196 <div> 197 <label for="message">メッセージ</label> 198 <textarea name="message"><?php if(isset($_POST['btn_edit'])){ echo $edit_message; } ?></textarea> 199 <input type="submit" name="btn_submit" value="投稿"> 200 <input type="hidden" name="keep_editNo" value="<?php if(isset($_POST['btn_edit'])){ echo $edit_no; } ?>"> 201 <input type="submit" name="execute_edit" value="編集"> 202 </div> 203 </form> 204 205 <form method="post" action="kadai_2_06_edit.html"> 206 <div> 207 <input type="submit" name="btn_edit" value="投稿を編集"> 208 </div> 209 </form> 210 211 <form method="post" action="kadai_2_06_delete.html"> 212 <div> 213 <input type="submit" name="btn_delete" value="投稿を削除"> 214 </div> 215 </form> 216 217<hr> 218<!-------------------フォーム下に表示-----------------------> 219<section> 220 <?php if( !empty($message_array) ): ?> 221 <?php foreach( $message_array as $value ): ?> 222 <div class="info"> 223 <h2><?php echo $value['post_no'].":".$value['view_name']; ?></h2> 224 <p><?php echo $value['post_date']; ?></p> 225 <p><?php echo $value['message']; ?></p> 226 </div> 227 <?php endforeach; ?> 228 <?php endif; ?> 229</section> 230 231</body> 232</html>

【エラー】
エラーが出ているわけではありませんが、削除ボタンをおして、パスワードと削除したいメッセージの投稿番号(削除番号)を入力しても、あっているはずなのに「パスワードまたは削除番号が間違っています」と表示されてしまいます

【デバッグ】
①本当にパスワードと削除番号が一致しているか確かめるために以下のコードで確かめました

php

1//間違い探し 2 /*--------------------------------------------------------------- 3 foreach($stmt as $loop){ 4 echo $deleteNo."<br>"; 5 echo $loop['number']."<br>"; 6 echo $delete_pass."<br>"; 7 echo $loop['password']."<br>"; 8 } 9 ----------------------------------------------------------------*/

結果:一致していました。

➁そもそもif文の中が機能しているのか以下のコードで確かめた

php

1foreach($stmt as $loop){ 2 if(($deleteNo==$loop['number'])&&($delete_pass==$loop['password'])){ 3 //間違い探し 4 echo $deleteNo."<br>"; 5 echo $loop['number']."<br>"; 6 echo $delete_pass."<br>"; 7 echo $loop['password']."<br>"; 8 9 //DELETEの処理 10 $sql="DELETE FROM $tb_name WHERE number=:number"; 11 $stmt=$pdo->prepare($sql); 12 $stmt->bindValue(':number',$deleteNo,PDO::PARAM_INT); 13 $stmt->execute(); 14 echo "メッセージを削除しました"; 15 }else{ 16 echo "パスワードまたは削除番号が間違っています"; 17 exit(); 18 } 19 }

結果://間違い探しの内容(値)が表示されず、「パスワードまたは削除番号が間違っています」のみ表示された

【追記】回答をうけて削除部分を以下のように書きなおしました

php

1//----------------【DELETEで指定した番号のメッセージを削除】-------------------- 2 3 $deleteNo=$_POST['deleteNo']; 4 $delete_pass=$_POST['pass']; 5 6 //SELECTで削除番号とパスワードが一致するデータを取得 7 $sql="SELECT * FROM $tb_name WHERE number=:number,password=:password"; 8 $stmt=$pdo->prepare($sql); 9 $stmt->bindValue(':number',$deleteNo,PDO::PARAM_INT); 10 $stmt->bindValue(':password',$delete_pass,PDO::PARAM_STR); 11 12 $delete=$stmt->execute(); 13 14 if($delete){ 15 $sql="DELETE FROM $tb_name WHERE $deleteNo"; 16 $stmt->$pdo->prepare($sql); 17 $stmt->execute(); 18 echo "メッセージを削除しました"; 19 }else{ 20 echo "パスワードまたは削除番号が間違っています"; 21 } 22

セレクトでパスワードと削除番号と一致するデータを取得しその結果をif文に渡し、trueの場合削除を行うという意図でコードを書きました。実行した結果以下のようなエラーが出てしまいました。

Notice: Undefined index: deleteNo in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_advanced/kadai_2_advanced.php on line 173 Notice: Undefined index: pass in /home/co-19-208.99sv-coco.com/public_html/kadai_2.php/kadai_2_advanced/kadai_2_advanced.php on line 174 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'password=?' at line 1

しかし、該当箇所を見てみてもおかしい部分は見つかりません。

他になにかデバッグ方法や解決策あれば教えていただきたいです!

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

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

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

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

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

guest

回答1

0

ベストアンサー

PHP

1 foreach($stmt as $loop){ 2 if(($deleteNo==$loop['number'])&&($delete_pass==$loop['password'])){ 3 //DELETEの処理 4 $sql="DELETE FROM $tb_name WHERE number=:number"; 5 $stmt=$pdo->prepare($sql); 6 $stmt->bindValue(':number',$deleteNo,PDO::PARAM_INT); 7 $stmt->execute(); 8 echo "メッセージを削除しました"; 9 }else{ 10 echo "パスワードまたは削除番号が間違っています"; 11 exit(); // $stmtに複数値が入っている場合、1件目で終了してしまうけど良いのでしょうか? 12 } 13 }

投稿2020/06/07 05:29

kei344

総合スコア69407

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

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

chimo

2020/06/07 05:34

ご回答ありがとうございます!!一件目では終了させたくないのですが...どうすればいんでしょう...;;;
kei344

2020/06/07 05:41

foreach内でDELETEの処理をするのではなく、値が合致しているかどうかだけを確認するようにすれば良いとは思います。(変数を用意して、一つでも合ってたらそれをtrueにしてforeachを抜けるとか) ただ、そもそも全権取得してからforeachでチェックするのではなく、合致するレコードがあるかをDBに問い合わせるのが普通だと思います。
chimo

2020/06/07 06:19

お返事ありがとうございます。「合致するレコードがあるかをDBに問い合わせる」というのはselect from whereで確認するのでしょうか...?
chimo

2020/06/07 06:22

if(合致するデータがDBにある){ //trueの時の処理 } と書くのでしょうか...?
kei344

2020/06/07 06:29

WHERE のときだし、if(合致するデータがDBにある)ではありますね。 PHPの入門書は良書より悪書のほうが目立つ気はしますが、入門書などで体系的に勉強されたほうが良いと思います。あるかはわかりませんが、PHP7以降でデバッグ環境構築方法が載っている入門書を探してみてください。
chimo

2020/06/07 07:38

アドバイスありがとうございます!助言をうけてコード書き直してみましたので、お時間あればご確認して頂きたいです。またphpの入門書に関するアドバイスもありがとうございます。悪書の方が多いみたいですので、いろいろ探してよさそうなものを選んでみようと思います。有難うございます。
kei344

2020/06/07 08:57

追記について、「Notice: Undefined index: 」で検索しましたか?してないならしましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問