PHPの学習としまして簡易な掲示板を作成したのですが、うまくいかない部分がありご助言頂きたいです。
以下は、ユーザのコメント入力画面である、「bbs.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 27 $stmt->bindValue(':page',$page,PDO::PARAM_INT); 28 $stmt->bindValue(':num',$num,PDO::PARAM_INT); 29 $stmt->execute(); 30 31 }catch(PDOException $e){ 32 echo "エラー: " . $e->getMessage(); 33 } 34 35 36 37?> 38 39 <html> 40 <head> 41 <title>交流サイト:掲示板</title> 42 <meta charset="utf-8"> 43 </head> 44 <body> 45 <h1>掲示板</h1> 46 <form action="write.php" method="post"> 47 <p>名前:<input type="text" name="name" value="<?php echo isset($_COOKIE['name']) ? $_COOKIE['name'] : '' ?>"></p> 48 <p>タイトル:<input type="text" name="title" size="60"></p> 49 <textarea name="comment"></textarea> 50 <p>削除パスワード(数字4桁):<input type="text" name="pass"> 51 <input type="submit" name="submit" value="書き込む"> 52 <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>"> 53 </form> 54 <hr> 55 <?php 56 while($row = $stmt->fetch()): 57 $title = $row['title'] ? $row['title'] : '(無題)'; 58 ?> 59 <p>名前:<?php echo $row['name'] ?></p> 60 <p>タイトル:<?php echo $title ?></p> 61 <p><?php echo nl2br(htmlspecialchars($row['comment'],ENT_QUOTES,'UTF-8'),false) ?></p> 62 <p><?php echo $row['created_at'] ?></p> 63 <form action="delete.php" method="post"> 64 <input type="hidden" name="id" value="<?php echo $row['id']; ?>"> 65 削除パスワード:<input type="password" name="pass"> 66 <input type="submit" value="削除"> 67 <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>"> 68 </form> 69 <?php 70 endwhile; 71 //ページ数の表示 72 try{ 73 $stmt = $dbh->prepare("SELECT COUNT(*) FROM post"); 74 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 75 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 76 77 //クエリの実行 78 $stmt->execute(); 79 80 }catch(PDOException $e){ 81 echo "エラー:" . $e->getMessage(); 82 } 83 /** 84 * コメントの件数を取得 85 *fetchColumn関数で 最初のレコードを取り出し、最初の列「id」のデータを取り出す 86 * idは降順に設定されているため、コメントの件数が分かる 87 * */ 88 $comments = $stmt->fetchColumn(); 89 $max_page = ceil($comments / $num); 90 echo '<p>'; 91 for($i = 1; $i <= $max_page; $i++){ 92 echo '<a href="bbs.php?page=' . $i .'">' . $i . 93 '</a> '; 94 } 95 echo '</p>'; 96 ?> 97 98 </body> 99 </html>
上記を実行した際の画像が以下になります。
以下の画像は、削除パスワードを入力し、削除ボタンを押したら、データベースよりコメント情報(名前、タイトル、日付)を削除する処理となる、「delete.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 $err_msg = []; 10 11 if($pass == ''){ 12 13 $err_msg[] = 'パスワードが入力されていません'; 14 15 } 16 17 //CRLF対策 18 if(!password_verify(session_id(),$token)){ 19 header('Location:bbs.php'); 20 exit(); 21 }; 22 23 if(count($err_msg) === 0){ 24 25 26 $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8'; 27 $user = 'root'; 28 $password = ''; 29 30 try{ 31 $dbh = new PDO($dsn,$user,$password); 32 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 33 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 34 $stmt = $dbh->prepare(" 35 SELECT password FROM post where id = :id 36 "); 37 $stmt->bindValue(':id',$id,PDO::PARAM_INT); 38 39 $stmt->execute(); 40 41 $db_pass = $stmt->fetch(); 42 43 if(!password_verify($pass,$db_pass['password'])){ 44 45 die('パスワードが違います'); 46 47 } 48 49 }catch(PDOException $e){ 50 51 die('エラー:'. $e->getMessage()); 52 } 53 54 try{ 55 $dbh = new PDO($dsn,$user,$password); 56 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 57 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 58 $stmt = $dbh->prepare( 59 "DELETE FROM post WHERE id = :id AND password = :pass" 60 ); 61 62 $stmt->bindValue(':id',$id,PDO::PARAM_INT); 63 $stmt->bindvalue(':pass',$pass,PDO::PARAM_STR); 64 $stmt->execute(); 65 66 }catch(PDOExeption $e){ 67 68 die( "エラー:" . $e->getMessage()); 69 } 70 71 header('Location: bbs.php'); 72 exit(); 73 74 } 75 76?>
以下は、コメント情報を格納しているテーブルである、「post」テーブルになります。
お聞きしたい部分なのですが、削除パスワードを正しく入力しているにも関わらず、「delete.php」にて削除処理がなされず、「bbs.php」に投稿されたコメントが残り続けています。
原因が分からない為、ご助言頂けましたら幸いです。よろしくお願いします。
回答4件
あなたの回答
tips
プレビュー