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> '; 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のコメントを削除する為、パスワードを入力し削除ボタンを押すと、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>
回答1件
あなたの回答
tips
プレビュー