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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

NetBeans

NetBeansは Java、HTML5、PHP、C/C++のアプリケーションのフレームワーク、もしくは統合開発環境(NetBeans IDE)の両方を指します

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1354閲覧

初めての質問です。写真共有サイトのコメント欄の表示がうまく表示されません。

thunderbird683

総合スコア2

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

NetBeans

NetBeansは Java、HTML5、PHP、C/C++のアプリケーションのフレームワーク、もしくは統合開発環境(NetBeans IDE)の両方を指します

PHP

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

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/11/11 13:07

前提

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答の前提1:Noticeの意味

Notice: Undefined index: comment
ですから、存在しないcommentというindexを使おうとしていますよ。
という事です。
ここで言うindexは配列のインデックス(添字)です。

例えば以下のようなコードで同じNoticeが発生します

PHP

1 2$arr = []; 3echo $arr['comment']: 4 5

これは以下のようにしてindexが存在するときだけそのindexを使用することで解決可能です。

PHP

1 2$arr = []; 3if(array_key_exists('comment',$arr) === true){ 4 echo $arr['comment']; 5} 6

もしくは、前処理で必ずそのindexが存在するようにすることでも解決可能です。

PHP

1 2//comment 3$arr = ['comment' => 'test_comment']; 4echo $arr['comment']; 5

回答の前提2:質問の状況と質問中の解決方法の問題点

今回のケースだと$rowsに構造の異なるcontentsテーブルcommentテーブルの両方のデータが混ざって入っているため、Noticeが発生しています。

シンプルに再現するとこんな感じ(試してみてくださいね)

PHP

1$rows[] = ['comment' => 'test_comment']; 2$rows[] = ['explain' => 'test_explain']; 3 4foreach($rows as $key => $val){ 5 echo $key.'週目のループ'; 6 echo $val['comment']; 7} 8 9

0週目のループではNoticeは発生しませんが、1週目のループではNoticeが発生してしまいました。

質問中に試された解決方法は以下のような感じです。

PHP

1$rows[] = ['comment' => 'test_comment']; 2$rows[] = ['comment' => 'test_explain']; 3 4foreach($rows as $key => $val){ 5 echo $key.'週目のループ'; 6 echo $val['comment']; 7} 8

これは前提1で言うところの後者の解決方法になります。
場合によってはアリなのですが、今回はご自身で把握されているように、問題があります。

回答

解決方法はいくつもありますが、今回の問題の本質は$rowsを使いまわしていることにあるように思います。
異なる用途なのに変数を使い回すと無駄に複雑になってしまうので、用途毎に変数を分離しましょう。

例えば、以下のような感じでコンテンツ用の配列とコメント用の配列を別に用意することで、コメントとコンテンツを別々に扱うことが可能になり、array_key_exists()を使用する必要がなくなります。

PHP

1$commentRows[] = ['comment' => 'test_comment']; 2$contentsRows[] = ['explain' => 'test_explain']; 3 4foreach($commentRows as $commentKey => $comment){ 5 echo $commentKey.'週目のループ'; 6 echo $comment['comment']; 7} 8foreach($contentsRows as $contentsKey => $contents){ 9 echo $contentsKey.'週目のループ'; 10 echo $contents['explain']; 11} 12

ここまでのサンプルを把握されたら、同じような方針で質問のソースを編集してみてください。
質問中のソースだと2箇所ある以下部分の$rowsをそれぞれふさわしい名前に変更して、表示している方(HTML内でforeachしている部分)でもその名前の配列を使うようにします。
もしforeach()の使い方に不安があるとかよく理解していない場合は先に
PHPマニュアル foreachの説明をよく読み、サンプルを実際に動かしてみて理解してください。

PHP

1 2while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 3 //ここで配列をテーブルごとにふさわしい名前の配列に格納する 4 $commentRows[] = $row; 5}

PHP

1 2while ($row = $result->fetch_array(MYSQLI_ASSOC)) { 3 //ここで配列をテーブルごとにふさわしい名前の配列に格納する 4 $contentsRows[] = $row; 5}

投稿2020/11/11 14:39

編集2020/11/11 14:45
tanat

総合スコア18713

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

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

thunderbird683

2020/11/11 15:12

どこが問題かとか、どこを修正すべきか非常に分かりやすく書いていただきありがとうございました。 お陰様で、問題解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問