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
しかし、該当箇所を見てみてもおかしい部分は見つかりません。
他になにかデバッグ方法や解決策あれば教えていただきたいです!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/07 05:34
2020/06/07 05:41
2020/06/07 06:19
2020/06/07 06:22
2020/06/07 06:29
2020/06/07 07:38
2020/06/07 08:57