前提
PHPとMySQLを用いた写真共有のWEBアプリケーションを作っています。
写真閲覧機能のコメント欄を実装中に以下の問題が発生しました。
発生している問題・エラーメッセージ
写真や写真投稿日、写真投稿者名、写真投稿者のコメントは、正しく表示されます。
しかし、閲覧者のコメント欄を表示させる際に、どうしても一番上に、写真を投稿した人の名前、写真の投稿日、以下のエラーメッセージが表示されます。私が実現したいことは、閲覧者のコメント欄に、これらを表示させないようにすることです。
そのためには、コードをどのように改良すべきか、ご教示いただけますと幸いです。
エラーメッセージ
Notice: Undefined index: comment in C:\xampp\htdocs\production\browsing_comment.php on line 54
該当のソースコード
PHP
1<!--contents.php(投稿された写真を表示させるページ)--> 2<?php 3//データベース接続 4$server = "localhost:3308"; 5$userName = "phpuser"; 6$password = "phpuserpw"; 7$dbName = "forum"; 8 9$mysqli = new mysqli($server, $userName, $password, $dbName); 10 11if ($mysqli->connect_error) { 12 //DB接続エラー時 13 echo $mysqli->connect_error; 14 exit(); 15} else { 16 //文字コードの設定(文字化け防止のためUTF-8) 17 $mysqli->set_charset("utf-8"); 18} 19//画像表示のSQL文(実際はパラメーターを取得し、con_idに数字を代入する) 20$sql = "SELECT * FROM contents where con_id =1;"; 21//クエリの実行 22$result = $mysqli->query($sql); 23//クエリー失敗 24if (!$result) { 25 echo $mysqli->error; 26 exit(); 27} 28//連想配列で取得 29while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 30 $rows[] = $row; 31} 32 33//結果セットを解放 34$result->free(); 35// データベース切断 36$mysqli->close(); 37?> 38<!DOCTYPE html> 39<html> 40 <head> 41 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 42 <link rel="stylesheet" type="text/css" media="screen" href="style.css" /> 43 <script src="https://www.w3schools.com/lib/w3.js"></script> 44 <title> 写真閲覧</title> 45 </head> 46 <div class="box1"style="border: solid 4px black; 47 box-sizing: border-box; 48 text-align: center; 49 line-height: 30px; 50 font-weight: bold;"> 51 <h1><a class="title" href="top.php">写真共有掲示板</a></h1> 52 </div> 53 54 <div class="box2"style="border: solid 4px black; 55 box-sizing: border-box; 56 text-align: center; 57 line-height: 30px; 58 font-weight: bold;"> 59 <body> 60 <!--ログインの有無で表示を変える--> 61 <?php 62 session_start(); 63 if (array_key_exists("user", $_SESSION)) { 64 echo $_SESSION['user'] . "さん<br>"; 65 echo '<a href="\SantetsuPhoto\logout.php">ログアウト</a><br>'; 66 } else { 67 echo "ゲストさん<br>"; 68 echo '<a href="\SantetsuPhoto\login.php">ログイン・アカウント登録</a><br>'; 69 } 70 ?> 71 <?php 72 foreach ($rows as $row) { 73 ?> 74 <!--SQL文に基づいたデータを表示--> 75 <!--画像を表示--> 76 <img src="data:image/jpg;base64,<?php echo 77 base64_encode($row['picture']); ?>"width="450px" height="300px"><br> 78 79 <!--画像の題名を表示--> 80 <h10><font size="5"><?php echo $row['picname'] ?></font></h10><br> 81 <!--画像の投稿者と投稿日を表示--> 82 <p>投稿者:<?php echo $row['user_name'] ?> 83 投稿日:<?php echo $row['DATE'] ?></p><br> 84 85 <hr> 86 <!-- 投稿者コメントを表示 --> 87 <!-- アコーディオンメニューを使用 --> 88 <div onclick="obj = document.getElementById('menu1').style; 89 obj.display = (obj.display == 'none') ? 'block' : 'none';"> 90 <a style="float: center;cursor:pointer;">▼投稿者コメント</a><br> 91 </div> 92 <hr> 93 <!--// アコーディオンメニュー展開ボタン --> 94 95 <!-- アコーディオンメニューで折りたたまれる部分 --> 96 <div id="menu1" style="text-align:left; display:none;clear:both;"> 97 98 <?php echo $row['explanation'] ?> 99 <hr> 100 <br> 101 102 </div> 103 <!-- コメント欄を表示 --> 104 <!-- アコーディオンメニューを使用 --> 105 <div onclick="obj = document.getElementById('menu2').style; 106 obj.display = (obj.display == 'none') ? 'block' : 'none';"> 107 <a style="float: center;cursor:pointer;">▼コメント欄</a><br> 108 </div> 109 <!--// アコーディオンメニュー展開ボタン --> 110 111 <!-- アコーディオンメニューで折りたたまれる部分 --> 112 <div id="menu2" style="text-align:left; display:none;clear:both;"> 113<!--ログインの有無で表示を変える--> 114 <?php 115 if (array_key_exists("user", $_SESSION)) { 116 require 'com_form.php'; 117 } else { 118 echo "コメントの投稿は、ログイン時のみ有効です。<br>"; 119 echo '<a href="\SantetsuPhoto\login.php">ログイン・アカウント登録</a><br>'; 120 } 121 ?> 122 <hr> 123 <br> 124 <!--コメント欄は、browsing_comment.phpから持ってくる--> 125 <?php require 'browsing_comment.php'; ?> 126 <hr> 127 <br> 128 <!--戻るボタン--> 129 <button class="back" type="button" style="text-align:crnter; 130 outline: none;"onclick="history.back()"><img src="back.jpg" alt="戻る" ></button> 131 132 </div> 133 134 <hr> 135 <?php 136 } 137 ?> 138 139 140 </div> 141 142</body> 143</html>
PHP
1<!--comment.php(投稿されたコメントを出すページ)--> 2<?php 3//データベース接続 4$server = "localhost:3308"; 5$userName = "phpuser"; 6$password = "phpuserpw"; 7$dbName = "forum"; 8 9$mysqli = new mysqli($server, $userName, $password, $dbName); 10 11if ($mysqli->connect_error) { 12 //DB接続エラー時 13 echo $mysqli->connect_error; 14 exit(); 15} else { 16 //文字コードの設定(文字化け防止のためUTF-8) 17 $mysqli->set_charset("utf-8"); 18} 19//コメント表示のSQL文(実際はパラメーターを取得し、con_idに数字を代入する) 20$sql = "select * from comment where con_id = 1;"; 21//クエリの実行 22$result = $mysqli->query($sql); 23//クエリー失敗 24if (!$result) { 25 echo $mysqli->error; 26 exit(); 27} 28//連想配列で取得 29while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 30 $rows[] = $row; 31} 32 33//結果セットを解放 34$result->free(); 35//$result2->free(); 36// データベース切断 37$mysqli->close(); 38?> 39<!DOCTYPE html> 40<html> 41 42 <body> 43 44 <?php 45 foreach ($rows as $row) { 46 ?> 47 48 49 50 <hr> 51 52 53 <td> 54 <p class="comment"><?php echo $row['user_name'] ?> 55 <?php echo $row['DATE'] ?><br> 56 <?php echo $row['comment'] ?></p> 57 </td> 58 59 60 61 <hr> 62 <?php 63 } 64 ?> 65 66</div> 67 68</body> 69</html>
###テーブルの構成
contentsテーブル(投稿された写真とその情報を格納するテーブル)
con_id
picture(投稿された写真)
picname(写真の題名)
explanation(写真投稿者のコメント)
user_name(写真投稿者名)
DATE(写真投稿日)
comment(写真閲覧者のコメントを格納するテーブル)
com_id
comment(閲覧者コメント)
user_name(閲覧者コメント投稿者名)
con_id(どの写真にコメントしたかを把握するもの)
DATE(閲覧者コメント投稿日)
試したこと
エラーメッセージを解消させるために、contentsテーブルのexplanationカラムと、commentテーブルのcommentカラムを、どちらかのカラム名に統一させて、それに合わせてPHPも書き換えると、エラー文が消え、エラー文が出ていた場所に、写真投稿者のコメントが表示されるようになりました。しかし、その方法は、写真投稿者のコメントと、閲覧者のコメントが一緒に表示され、見ずらいので、写真投稿者のコメントと閲覧者のコメントを分けて表示できるようにできればと考えています。
初めての質問のため、分かりづらい部分が多いかと思いますが、ご教示いただけますと幸いです。
補足情報(FW/ツールのバージョンなど)
XAMPP、 NetBeans IDE 8.2を使用
PHPのバージョンは、PHP7.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/11 15:12