以下のコードで理解できないところがあります。
createThread.phpの中で、以下のような部分があります。
$escaped["username"] = htmlspecialchars($_POST["username"], ENT_QUOTES, "UTF-8"); $escaped["body"] = htmlspecialchars($_POST["body"], ENT_QUOTES, "UTF-8"); $sql = "INSERT INTO comment(username,body,post_date,thread_id) VALUES (:username,:body,NOW(),(SELECT id FROM thread WHERE title = :title));"; $stmt=$pdo->prepare($sql); $stmt->bindParam(':username',$escaped['username'],PDO::PARAM_STR); $stmt->bindParam(':body',$escaped['body'],PDO::PARAM_STR); $stmt->bindParam(':title',$escaped['title'],PDO::PARAM_STR); $stmt->execute();
ここで、スレッドを投稿するときに、すでに
$stmt->bindParam(':title',$escaped['title'],PDO::PARAM_STR);
を書いているにもかかわらず、再度この箇所でtitleを追加しているのが理解できません。
また、なぜ$escaped["title"] = htmlspecialchars($_POST["title"], ENT_QUOTES, "UTF-8");
がないのかも(省略できるのかも)わかりません。
connect.php
1<?php 2 3$dsn = 'mysql:host=localhost;dbname=practice_bulletin_board'; 4$user = 'root'; 5$password = 'root'; 6 7try { 8$pdo = new PDO($dsn, $user, $password); 9}catch(PDOException $error){ 10 echo $error->getMessage(); 11}
index.php
1<?php 2 3include_once("./app/database/connect.php"); 4 5if(isset($_POST["submitButton"])){ 6 7if(empty($_POST['username'])||empty($_POST['body'])){ 8 $error_message = "投稿に失敗しました。名前とコメントの両方を入力してください"; 9} else if(strlen($_POST['username']) > 30){ 10 $error_message = "投稿に失敗しました。名前は30字以内で入力してください。"; 11} else if(strlen($_POST['body']) > 300) { 12 $error_message = "投稿に失敗しました。コメントは300字以内で入力してください。"; 13} else { 14$escaped["username"] = htmlspecialchars($_POST["username"], ENT_QUOTES, "UTF-8"); 15$escaped["body"] = htmlspecialchars($_POST["body"], ENT_QUOTES, "UTF-8"); 16$sql = "INSERT INTO comment(username,body,post_date) VALUES (:username,:body,NOW());"; 17$stmt=$pdo->prepare($sql); 18$stmt->bindParam(':username',$escaped['username'],PDO::PARAM_STR); 19$stmt->bindParam(':body',$escaped['body'],PDO::PARAM_STR); 20$stmt->execute(); 21header('Location: ./'); 22exit; 23 } 24} 25 26$sql = "SELECT * FROM thread"; 27$pdo->query('SET NAMES utf8'); 28$stmt = $pdo->prepare($sql); 29$stmt->execute(); 30$thread_array = $stmt; 31 32$sql = "SELECT * FROM comment"; 33$pdo->query('SET NAMES utf8'); 34$stmt = $pdo->prepare($sql); 35$stmt->execute(); 36$comment_array = $stmt; 37 38 39 40 41?> 42 43 44 45 46<!DOCTYPE html> 47<html lang="ja"> 48<head> 49 <meta charset="UTF-8"> 50 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 51 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 52 <title>練習用の掲示板</title> 53 <link rel="stylesheet" href="style.css"> 54</head> 55<body> 56 57 <!--ヘッダー部分--> 58 <div class="header"> 59 <div class="title"> 60 <h1>お得な掲示板</h1> 61 </div> 62 <div class="login"> 63 <h1>ログイン</h1> 64 </div> 65 </div> 66 <hr> 67 68 <?php if(isset($error_message)){ 69 echo $error_message; 70 } 71 ?> 72 73 <!--スレッド部分--> 74 <!--スレッドのタイトルや名前、コメントの表示場所 --> 75 <?php foreach($thread_array as $thread) : ?> 76 <div class="threadWapper"> 77 <div class="threadTitle"> 78 <h1>【タイトル】<span class="realTitle"><?php echo $thread['title']; ?></span></h1> 79 </div> 80 <article class="article"> 81 <?php foreach($comment_array as $comment): ?> 82 <div class="userName"><p>名前:<span class="realName"><?php echo $comment['username'] ?></span></p></div> 83 <div class="postTime"><p>投稿時間:<span class="realTime"><?php echo $comment['post_date'] ?></span></p></div> 84 <div class="postComment"><p><?php echo $comment['body'] ?></p></div> 85 <?php endforeach ?> 86 <!--投稿フォーム--> 87 <form class="formWrapper" method="POST"> 88 <div class="name_form"> 89 <input type="submit" value="書き込む" name="submitButton"> 90 <label >名前: 91 <input type="text" name="username"> 92 </label> 93 </div> 94 <div> 95 <textarea class="commentTextArea" name="body"></textarea> 96 </div> 97 </form> 98 </div> 99 <?php endforeach ?> 100 101 <div class="newThreadWrapper"> 102 <div class="newchildThreadWrapper"> 103 <button><a href="./createThread.php">新規スレッド書き込み</a></button> 104 </div> 105 </div> 106 107</body> 108</html>
createThread.php
1<?php 2 3include_once("./app/database/connect.php"); 4 5if(isset($_POST["threadSubmitButton"])){ 6 7if(empty($_POST['title'])||empty($_POST['username'])||empty($_POST['body'])){ 8 $error_message = "投稿に失敗しました。スレッドを立ち上げるには、タイトルと名前とコメント全てを入力してください"; 9} else if(strlen($_POST['title']) > 50){ 10 $error_message = "投稿に失敗しました。タイトルは50字以内で入力してください。"; 11} else if(strlen($_POST['username']) > 30){ 12 $error_message = "投稿に失敗しました。名前は30字以内で入力してください。"; 13} else if(strlen($_POST['body']) > 300) { 14 $error_message = "投稿に失敗しました。コメントは300字以内で入力してください。"; 15} else { 16$escaped["title"] = htmlspecialchars($_POST["title"], ENT_QUOTES, "UTF-8"); 17$sql = "INSERT INTO thread(title) VALUES (:title);"; 18$stmt=$pdo->prepare($sql); 19$stmt->bindParam(':title',$escaped['title'],PDO::PARAM_STR); 20$stmt->execute(); 21 22$escaped["username"] = htmlspecialchars($_POST["username"], ENT_QUOTES, "UTF-8"); 23$escaped["body"] = htmlspecialchars($_POST["body"], ENT_QUOTES, "UTF-8"); 24$sql = "INSERT INTO comment(username,body,post_date,thread_id) 25VALUES (:username,:body,NOW(),(SELECT id FROM thread WHERE title = :title));"; 26$stmt=$pdo->prepare($sql); 27$stmt->bindParam(':username',$escaped['username'],PDO::PARAM_STR); 28$stmt->bindParam(':body',$escaped['body'],PDO::PARAM_STR); 29$stmt->bindParam(':title',$escaped['title'],PDO::PARAM_STR); 30$stmt->execute(); 31 32header('Location: ./'); 33exit; 34 } 35} 36 37?> 38 39 40<!DOCTYPE html> 41<html lang="ja"> 42<head> 43 <meta charset="UTF-8"> 44 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 45 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 46 <title>新規スレッドの作成ページ</title> 47 <link rel="stylesheet" href="style.css"> 48 49</head> 50<body> 51 <div class="submitPageTitle"> 52 <h2>新規スレッド立ち上げフォーム</h2> 53 </div> 54 55 <?php if(isset($error_message)){ 56 echo $error_message; 57 } 58 ?> 59 60 <form class="threadForm" method="POST"> 61 <div> 62 <label>スレッドのタイトル: 63 <input type="text" name="title"> 64 </label> 65 <br> 66 <label class="nameBox">名前: 67 <input type="text" name="username"> 68 </label> 69 </div> 70 <div> 71 <textarea name="body" class="commentTextArea"></textarea> 72 </div> 73 <input type="submit" name="threadSubmitButton"> 74 </form> 75</body> 76</html>
回答1件
あなたの回答
tips
プレビュー