現在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 id,name,title,comment,created_at,password 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 58 $title = $row['title'] ? $row['title'] : '(無題)'; 59 ?> 60 <p>名前:<?php echo $row['name'] ?></p> 61 <p>タイトル:<?php echo $title ?></p> 62 <p><?php echo nl2br(htmlspecialchars($row['comment'],ENT_QUOTES,'UTF-8'),false) ?></p> 63 <p><?php echo $row['created_at'] ?></p> 64 <form action="delete.php" method="post"> 65 <input type="hidden" name="id" value="<?php echo $row['id']; ?>"> 66 削除パスワード:<input type="password" name="pass"> 67 <input type="submit" value="削除"> 68 <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>"> 69 </form> 70 <?php 71 endwhile; 72 //ページ数の表示 73 try{ 74 $stmt = $dbh->prepare("SELECT COUNT(*) FROM post"); 75 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 76 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 77 78 //クエリの実行 79 $stmt->execute(); 80 81 }catch(PDOException $e){ 82 echo "エラー:" . $e->getMessage(); 83 } 84 /** 85 * コメントの件数を取得 86 *fetchColumn関数で 最初のレコードを取り出し、最初の列「id」のデータを取り出す 87 * idは降順に設定されているため、コメントの件数が分かる 88 * */ 89 $comments = $stmt->fetchColumn(); 90 $max_page = ceil($comments / $num); 91 echo '<p>'; 92 for($i = 1; $i <= $max_page; $i++){ 93 echo '<a href="bbs.php?page=' . $i .'">' . $i . 94 '</a> '; 95 } 96 echo '</p>'; 97 ?> 98 99 </body> 100 </html>
下記はコメントを投稿すると、名前やパスワードのバリデーションチェックを行い、データベースへ情報を記録する為の、「write.php」です。
<?php include 'includes/login.php'; error_reporting(E_ALL); ini_set('display_errors', '1'); $err_message = []; if(!empty($_POST)){ $title = filter_input(INPUT_POST,'title',FILTER_SANITIZE_SPECIAL_CHARS); $token = filter_input(INPUT_POST,'token',FILTER_SANITIZE_SPECIAL_CHARS); if(!$name = filter_input(INPUT_POST,'name',FILTER_SANITIZE_SPECIAL_CHARS)){ $err_message[] = '名前が入力されていません'; } if(!$pass = filter_input(INPUT_POST,'pass',FILTER_SANITIZE_SPECIAL_CHARS)){ $err_message[] = 'パスワードが入力されていません'; } if(!$comment = filter_input(INPUT_POST,'comment',FILTER_SANITIZE_SPECIAL_CHARS)){ $err_message[] = 'コメントが入力されていません'; } } if(!preg_match("/^[0-9]{4}$/",$pass)){ $err_message[] = 'パスワードを4文字で入力してください'; } $pass = password_hash($pass,PASSWORD_DEFAULT); if(count($err_message) === 0){ //CSRF対策 if(!password_verify(session_id(),$token)){ header('Location:bbs.php'); exit(); } setcookie('name',$name,time() + 60 * 60 * 24 * 30); //データベースに接続 $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8'; $user = 'root'; $password = ''; try{ $db = new PDO($dsn,$user,$password); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $stmt = $db->prepare(" INSERT INTO post (name,title,comment,created_at,password) VALUES (:name, :title, :comment, now(), :pass)"); $stmt->bindValue(':name',$name,PDO::PARAM_STR); $stmt->bindValue(':title',$title,PDO::PARAM_STR); $stmt->bindValue(':comment',$comment,PDO::PARAM_STR); $stmt->bindValue(':pass',$pass,PDO::PARAM_STR); $stmt->execute(); }catch(PDOException $e){ die ('エラー:' . $e->getMessage()); } } ?> <html> <head> <meta charset="utf-8"> <title>Page Title</title> </head> <body> <?php echo implode("<br />",$err_message); ?> <h4>投稿に成功しました。</h4> <p><a href="bbs.php">戻る</a> </body> </html>
下記はコメントの削除パスワードを入力すると、データベースから情報を削除する為の、「delete.php」です。
php
1<?php 2 include 'includes/login.php'; 3 error_reporting(E_ALL); 4 ini_set("display_errors",1); 5 6 //エラーメッセージ 7 $err_msg = []; 8 9 if(!empty($_POST)){ 10 11 if(!$pass = filter_input(INPUT_POST,'pass',FILTER_SANITIZE_SPECIAL_CHARS)){ 12 13 $err_msg[] = 'パスワードが入力されていません。'; 14 15 } 16 17 18 $token = filter_input(INPUT_POST,'token',FILTER_SANITIZE_SPECIAL_CHARS); 19 20 //POSTされたIDを取得 21 $id = filter_input(INPUT_POST,'id',FILTER_SANITIZE_SPECIAL_CHARS); 22 $id = intval($id); 23 24 } 25 26 //CRLF対策 27 if(!password_verify(session_id(),$token)){ 28 header('Location:bbs.php'); 29 exit(); 30 }; 31 32 if(count($err_msg) === 0){ 33 34 35 $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8'; 36 $user = 'root'; 37 $password = ''; 38 39 try{ 40 $dbh = new PDO($dsn,$user,$password); 41 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 42 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 43 $stmt = $dbh->prepare(" 44 SELECT password FROM post where id = :id 45 "); 46 47 $stmt->bindValue(':id',$id,PDO::PARAM_INT); 48 49 $stmt->execute(); 50 51 $db_pass = $stmt->fetch(); 52 53 if(!password_verify($pass,$db_pass['password'])){ 54 55 die('パスワードが違います'); 56 } 57 58 $stmt = $dbh->prepare(" 59 DELETE FROM post WHERE id = :id 60 "); 61 62 $stmt->bindValue(':id',$id,PDO::PARAM_INT); 63 $stmt->execute(); 64 65 }catch(PDOException $e){ 66 67 die( "エラー:" . $e->getMessage()); 68 } 69 70 header('Location: bbs.php'); 71 exit(); 72 73 } 74 75?>
よろしくお願いいたします。
回答6件
あなたの回答
tips
プレビュー