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

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

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

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

Q&A

解決済

2回答

771閲覧

PHP 日記 掲示板 削除、編集がうまくいかない

ruin_atamaga

総合スコア13

PHP

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

0グッド

0クリップ

投稿2020/07/22 09:18

編集2020/07/22 10:44

前提・実現したいこと

phpで日記を、掲示板をもとに作っている初心者です。
本文とタイトルをDBとつなげて表示する簡単なものですが、削除、編集の時idが定義されていないというエラーが出ます。(undefined index id)
Googleで調べた結果issetを使い1回目と2回目の処理を分けるとありましたが、自分のコードでの応用が分かりません。また、参考にしたのは(https://gray-code.com/php/make-the-board-vol1/)
このサイトです

該当のソースコード

PHP
ソースコード

PHP

1<?php 2 3// データベースの接続情報 4define( 'DB_HOST', 'localhost'); 5define( 'DB_USER', 'root'); 6define( 'DB_PASS', ''); 7define( 'DB_NAME', 'board'); 8 9// タイムゾーン設定 10date_default_timezone_set('Asia/Tokyo'); 11 12// 変数の初期化 13$message_id = null; 14$mysqli = null; 15$sql = null; 16$res = null; 17$error_message = array(); 18$message_data = array(); 19 20session_start(); 21 22 23if( empty($_SESSION['admin_login']) || $_SESSION['admin_login'] !== true ) { 24 25 // ログインページへリダイレクト 26 header("Location: ./admin.php"); 27} 28 29 30if( !empty($_GET['message_id']) && empty($_POST['message_id']) ) { 31 32 $message_id = (int)htmlspecialchars($_GET['message_id'], ENT_QUOTES); 33 34 // データベースに接続 35 $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); 36 37 // 接続エラーの確認 38 if( $mysqli->connect_errno ) { 39 $error_message[] = 'データベースの接続に失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error; 40 } else { 41 42 // データの読み込み 43 $sql = "SELECT * FROM message WHERE id = $message_id"; 44 $res = $mysqli->query($sql); 45 46 if( $res ) { 47 $message_data = $res->fetch_assoc(); 48 } else { 49 50 // データが読み込めなかったら一覧に戻る 51 header("Location: ./admin.php"); 52 } 53 54 $mysqli->close(); 55 } 56 57} elseif( !empty($_POST['message_id']) ) { 58 59 $message_id = (int)htmlspecialchars( $_POST['message_id'], ENT_QUOTES); 60 61 // データベースに接続 62 $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); 63 64 // 接続エラーの確認 65 if( $mysqli->connect_errno ) { 66 $error_message[] = 'データベースの接続に失敗しました。 エラー番号 ' . $mysqli->connect_errno . ' : ' . $mysqli->connect_error; 67 } else { 68 $sql = "DELETE FROM message WHERE id = $message_id"; 69 $res = $mysqli->query($sql); 70 } 71 72 $mysqli->close(); 73 74 // 更新に成功したら一覧に戻る 75 if( $res ) { 76 header("Location: ./admin.php"); 77 } 78} 79 80?> 81<!DOCTYPE html> 82<html lang="ja"> 83<head> 84<meta charset="utf-8"> 85<title>ひと言掲示板 管理ページ(投稿の削除)</title> 86</head> 87<body> 88<h1>ひと言掲示板 管理ページ(投稿の削除)</h1> 89<?php if( !empty($error_message) ): ?> 90 <ul class="error_message"> 91 <?php foreach( $error_message as $value ): ?> 92 <li><?php echo $value; ?></li> 93 <?php endforeach; ?> 94 </ul> 95<?php endif; ?> 96<p class="text-confirm">以下の投稿を削除します。<br>よろしければ「削除」ボタンを押してください。</p> 97<form method="post"> 98 <div> 99 <label for="view_name">表示名</label> 100 <input id="view_name" type="text" name="view_name" value="<?php if( !empty($message_data['view_name']) ){ echo $message_data['view_name']; } ?>" disabled> 101 </div> 102 <div> 103 <label for="message">本文</label> 104 <textarea id="message" name="message" disabled><?php if( !empty($message_data['message']) ){ echo $message_data['message']; } ?></textarea> 105 </div> 106 <a class="btn_cancel" href="admin.php">キャンセル</a> 107 <input type="submit" name="btn_submit" value="削除"> 108 <input type="hidden" name="message_id" value="<?php echo $message_data['id']; ?>"> 109</form> 110</body> 111</html> 112 113 114 115 116 117 118編集機能の方 119<?php 120//DB接続情報 121define( 'DB_HOST', 'localhost'); 122define( 'DB_USER', 'root'); 123define( 'DB_PASS', ''); 124define( 'DB_NAME', 'board'); 125// タイムゾーン設定 126date_default_timezone_set('Asia/Tokyo'); 127 128// 変数の初期化 129$message_id = null; 130$mysqli = null; 131$sql = null; 132$res = null; 133$error_message = array(); 134$message_data = array(); 135 136session_start(); 137 138// 管理者ログイン 139if( empty($_SESSION['admin_login']) || $_SESSION['admin_login'] !== true ) { 140 141 // ログインページへリダイレクト 142 header("Location: ./admin.php"); 143} 144if( !empty($_GET['message_id'])&& empty($_POST['message_id']) ) { 145//取得 146 $message_id = (int)htmlspecialchars($_GET['message_id'], ENT_QUOTES); 147 148 // データベースに接続 149 $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); 150 151 // 接続エラーの確認 152 if( $mysqli->connect_errno ) { 153 $error_message[] = 'データベースの接続に失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error; 154 } else { 155 156 // データの読み込み 157 $sql = "SELECT * FROM message WHERE id = $message_id"; 158 $res = $mysqli->query($sql); 159 160 if( $res ) { 161 $message_data = $res->fetch_assoc(); 162 } else { 163 164 // データが読み込めなかったら一覧に戻る 165 header("Location: ./admin.php"); 166 } 167 168 $mysqli->close(); 169 } 170} 171elseif( !empty($_POST['message_id']) ) { 172 173 $message_id = (int)htmlspecialchars( $_POST['message_id'], ENT_QUOTES); 174 175 if( empty($_POST['view_name']) ) { 176 $error_message[] = 'titleを入力してください。'; 177 } else { 178 $message_data['view_name'] = htmlspecialchars($_POST['view_name'], ENT_QUOTES); 179 } 180 181 if( empty($_POST['message']) ) { 182 $error_message[] = '本文を入力してください。'; 183 } else { 184 $message_data['message'] = htmlspecialchars($_POST['message'], ENT_QUOTES); 185 } 186 187 if( empty($error_message) ) { 188 // データベースに接続 189 $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); 190 191 // 接続エラーの確認 192 if( $mysqli->connect_errno ) { 193 $error_message[] = 'データベースの接続に失敗しました。 エラー番号 ' . $mysqli->connect_errno . ' : ' . $mysqli->connect_error; 194 } else { 195 $sql = "UPDATE message set view_name = '$message_data[view_name]', message= '$message_data[message]' WHERE id = $message_id"; 196 $res = $mysqli->query($sql); 197 } 198 199 $mysqli->close(); 200 201 // 更新に成功したら一覧に戻る 202 if( $res ) { 203 header("Location: ./admin.php"); 204 } 205 206 207 } 208 209} 210 211 212?> 213<!DOCTYPE html> 214<html lang="ja"> 215<head> 216<meta charset="utf-8"> 217<title>管理ページ</title> 218 219</head> 220<body> 221<h1>管理ページ</h1> 222 223<?php if( !empty($error_message) ): ?> 224 <ul class="error_message"> 225 <?php foreach( $error_message as $value ): ?> 226 <li><?php echo $value; ?></li> 227 <?php endforeach; ?> 228 </ul> 229<?php endif; ?> 230<form method="post"> 231 <div> 232 <label for="view_name">タイトル</label> 233 <input id="view_name" type="text" name="view_name" value="<?php if( !empty($message_data['view_name']) ){ echo $message_data['view_name']; } ?>"> 234 </div> 235<div> 236 <label for="message">本文</label> 237 <textarea id="message" name="message"><?php if( !empty($message_data['message']) ){ echo $message_data['message']; } ?></textarea> 238 </div> 239 240 241 <a class="btn_cancel" href="admin.php">キャンセル</a> 242 <input type="submit" name="btn_submit" value="書き込む"> 243 <input type="hidden" name="message_id" value="<?php echo $message_data['id']; ?>"> 244 </form> 245</body> 246</html>

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

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

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

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

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

m.ts10806

2020/07/22 09:58

コードはマークダウンのcode機能を利用してご提示ください。 あと、出ているエラーは珍しいものではないので、調べれば原因や対応策はたくさん出てきます。 なにを調べどう試したか具体的に記載してください。 あと…、あまり好ましくない実装がたくさん見られます。なにを参考に作られたのでしょう?
ruin_atamaga

2020/07/22 12:20

質問の修正を行いました
m.ts10806

2020/07/22 20:33 編集

なるほど。ただ、記事の更新日が最近と言うだけで実装はお世辞にも良いとは言えませんね。セキュリティ対策ほぼ皆無です。覚えたところで使える実装にはなりませんけど・・ 同種の質問のコードでレビュー的な回答は過去に幾つもついているので、確認したほうがいいかもしれません。
guest

回答2

0

自己解決

PHP

1 <input type="hidden" name="message_id" value="<?php if( !empty($message_data['id']) ) {echo $message_data['id'];} ?>">

とすることによって自己解決
セキュリティのどこが問題か簡単に教えてもらえるとうれしいのですが。。。

投稿2020/07/24 02:01

ruin_atamaga

総合スコア13

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

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

0

<input type="hidden" name="message_id" value="<?php echo $message_data['id']; ?>">

の $message_data['id'] が、どこにも定義されていないようです。

DBのテーブル構造を教えていただければ、もう少し先に進めるのですが。。

投稿2020/07/22 12:46

IKIX

総合スコア142

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問