質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1704閲覧

PHPで掲示板作成中です。スレッドに対応したコメントを表示する機能を作る最中で、理解できない記述があります。

GooGoo2023

総合スコア7

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/01/30 06:07

以下のコードで理解できないところがあります。
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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javahack

2023/01/30 06:13

何を参考にしているのか知りませんが、DBに入れる値をhtmlspecialchars()でエスケープしている時点でOUTです。さっさと捨てて他の参考書に移りましょう。
m.ts10806

2023/01/30 06:44 編集

エラーハンドリングなしなのも実装としてはアウトですね。 何かしら問題やエラーが発生してても見えるようになってません。 また、ご自身で書いたのでないのでしたら出典の明示を。
otn

2023/01/30 10:05

> なぜhtmlspecialchars()を使ってはいけないのでしょうか? 使うべきところで使ってないので、これを書いた人が htmlspecialchars() の意味を理解していないことが明らかです。 とりあえずは、こういうドキュメントで正しい脆弱性対応について学べます。 https://www.ipa.go.jp/security/vuln/websecurity.html
m.ts10806

2023/01/30 19:07

アカウントを取得しないと見れない(もしかしたら有償?)ものでしたら、 この手のQAサービスでは回答得られにくいかと(オンライン学習使って技術を身に着けていった回答者はおそらく少ない)そもそもUdemy側に質問は出来ませんか?教材については提供元に問い合わせるのが確実です。 あと、質問は編集できますので。
m.ts10806

2023/01/30 19:11 編集

>htmlspecialchars() 読んで字のごとく、「HTMLの特殊文字を変換」するもので、「ブラウザに表示する際に利用するもの」だからです。DBに保存するからといって必ずブラウザに対して表示させるとは限りません。 また、入力した情報を「加工して」保存していることになるので、これはよろしくありません。 ユーザが意図しない変換を行う可能性もあります。 つまり、本当に教材の通りだとしたら、誤った知識を身に着けていることになります(もし就職を意識して学習しているのでしたらマズいレベル)
guest

回答1

0

ベストアンサー

2個のテーブルにINSERTしてるからじゃないでしょうか

ちなみにhtmpspecialcharacter でのHTMLエスケープはデータ記録時ではなく、HTMLへのデータ出力時におこなうものです

投稿2023/01/30 06:12

編集2023/01/30 07:19
yuma.inaura

総合スコア1453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GooGoo2023

2023/01/30 09:52

理解できました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問