編集機能を追加し、メモの内容は表示されるのですが変更する内容が保存されません。
下記のサイトを参考にしております。
https://gray-code.com/php/make-the-board-vol20/
該当のソースコード
<?php // データベースの接続情報 define( 'DB_HOST', 'localhost'); define( 'DB_USER', 'root'); define( 'DB_PASS', 'root'); define( 'DB_NAME', 'board'); // タイムゾーン設定 date_default_timezone_set('Asia/Tokyo'); // 変数の初期化 $now_date = null; $data = null; $file_handle = null; $split_data = null; $message_array = array(); $error_message = array(); $clean = array(); session_start(); if( !empty($_POST['btn_submit']) ) { // メッセージの入力チェック if( empty($_POST['message']) ) { $error_message[] = 'なにか入力してください。'; } else { $clean['message'] = h( $_POST['message'], ENT_QUOTES); } if( empty($error_message) ) { // データベースに接続 $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); // 接続エラーの確認 if( $mysqli->connect_errno ) { $error_message[] = '書き込みに失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error; } else { // 文字コード設定 $mysqli->set_charset('utf8'); // 書き込み日時を取得 $now_date = date("Y-m-d H:i:s"); // データを登録するSQL作成 $sql = "INSERT INTO message (message, post_date) VALUES ( '$clean[message]', '$now_date')"; // データを登録 $res = $mysqli->query($sql); if( $res ) { $_SESSION['success_message'] = '書き込みに成功しました。'; } else { $error_message[] = '書き込みに失敗しました。'; } // データベースの接続を閉じる $mysqli->close(); } header('Location: ./'); } } // データベースに接続 $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); // 接続エラーの確認 if( $mysqli->connect_errno ) { $error_message[] = 'データの読み込みに失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error; } else { $sql = "SELECT id,message,post_date FROM message ORDER BY post_date DESC"; $res = $mysqli->query($sql); if( $res ) { $message_array = $res->fetch_all(MYSQLI_ASSOC); } $mysqli->close(); } //htmlspecialcharsのショートカット function h($value){ return htmlspecialchars($value, ENT_QUOTES); } ?> <!DOCTYPE html> <html lang="ja"> <head> <title>メモ</title> <script src="js/count.js"></script> <link rel="stylesheet" type=text/css href="style.css"> </head> <body> <!--メインコンテンツ--> <h1>メモ</h1> <?php if( empty($_POST['btn_submit']) && !empty($_SESSION['success_message']) ): ?> <p class="success_message"><?php echo $_SESSION['success_message']; ?></p> <?php unset($_SESSION['success_message']); ?> <?php endif; ?> <?php if( !empty($error_message) ): ?> <ul class="error_message"> <?php foreach( $error_message as $value ): ?> <li>・<?php echo $value; ?></li> <?php endforeach; ?> </ul> <?php endif; ?> <form method=post> <div> <textarea id="area1" id="message" name="message" onkeyup="viewStrLen();" cols="50" rows="10" placeholder="ここに書いてね"></textarea> </div> <input type="submit" name="btn_submit" value="登録" class="btn-square"> <form method="get" action="./download.php"> <input type="submit" name="btn_download" class="btn-square" value="CSV"> </form> <p id="strLen">文字</p> </form> <section> <?php if(!empty($message_array) ){ ?> <?php foreach($message_array as $value ){ ?> <article> <div class="info"> <h2><?php echo $value['view_name']; ?></h2> <time><?php echo date('Y年m月d日 H:i',strtotime($value['post_date'])); ?></time> <?php if($_SESSION['id']); ?> <form method="get" mode="delete.php<?php echo($message['id']); ?>"> <a class="btn-square" href="edit.php?message_id=<?php echo $value['id']; ?>">編集</a> <a class="btn-square" href="delete.php?message_id=<?php echo $value['id']; ?>">削除</a> </form> </div> <p><?php echo $value['message']; ?></p> </article> <?php } ?> <?php } ?> </section> </body> </html> [edit.php] <?php // データベースの接続情報 define( 'DB_HOST', 'localhost'); define( 'DB_USER', 'root'); define( 'DB_PASS', 'root'); define( 'DB_NAME', 'board'); // タイムゾーン設定 date_default_timezone_set('Asia/Tokyo'); // 変数の初期化 $message_id = null; $mysqli = null; $sql = null; $res = null; $error_message = array(); $message_data = array(); session_start(); if(!empty($_GET['message_id']) && empty($_POST['message_id'])) { $message_id = (int)h($_GET['message_id'], ENT_QUOTES); // データベースに接続 $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); // 接続エラーの確認 if( $mysqli->connect_errno ) { $error_message[] = 'データベースの接続に失敗しました。 エラー番号 '.$mysqli->connect_errno.' : '.$mysqli->connect_error; } else { // データの読み込み $sql = "SELECT * FROM message WHERE id = $message_id"; $res = $mysqli->query($sql); if( $res ) { $message_data = $res->fetch_assoc(); } else { // データが読み込めなかったら一覧に戻る header("Location: ./index.php"); } $mysqli->close(); } }elseif(!empty($_POST['message_id'])){ $message_id = (int)h($_POST['message_id'], ENT_QUOTES); if( empty($_POST['message']) ) { $error_message[] = '入力してください。'; } else { $message_data['message'] = h($_POST['message'], ENT_QUOTES); } if( empty($error_message) ) { // データベースに接続 $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME); // 接続エラーの確認 if( $mysqli->connect_errno ) { $error_message[] = 'データベースの接続に失敗しました。 エラー番号 ' . $mysqli->connect_errno . ' : ' . $mysqli->connect_error; } else { $sql = "UPDATE message set post_date = '$message_data[post_date]', message= '$message_data[message]' WHERE id = $message_id"; $res = $mysqli->query($sql); } $mysqli->close(); // 更新に成功したら一覧に戻る if( $res ) { header("Location: ./index.php"); } } } //htmlspecialcharsのショートカット function h($value){ return htmlspecialchars($value, ENT_QUOTES); } ?> <!DOCTYPE html> <html lang="ja"> <head> <title>編集</title> <script src="js/count.js"></script> <link rel="stylesheet" type=text/css href="style.css"> </head> <body> <!--メインコンテンツ--> <h1>編集</h1> <?php if( !empty($error_message) ): ?> <ul class="error_message"> <?php foreach( $error_message as $value ): ?> <li>・<?php echo $value; ?></li> <?php endforeach; ?> </ul> <?php endif; ?> <form method=post> <div> <textarea id="area1" id="message" name="message" onkeyup="viewStrLen();" cols="50" rows="10" placeholder="ここに書いてね"><?php if(!empty($message_data['message']) ){ echo $message_data['message']; }?></textarea> </div> <a class="btn-square" href="index.php">キャンセル</a> <a class="btn-square" href="index.php?message_id=<?php echo $value['id']; ?>">登録</a> <input type="hidden" name="message_id" value="<?php echo $message_data['id']; ?>"> <p id="strLen">文字</p> </form> </body> </html>
このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
ifなどのあらゆる分岐に下記を埋め込んで結果を教えてください(ひとまずどこを通っているか確認するデバッグの1歩目です)
echo __LINE__.PHP_EOL;
edit.phpの下記のコードに入力したら38,105とテキストエリアに表示されました。
⬇️
// データの読み込み
$sql = "SELECT * FROM message WHERE id = $message_id";
$res = $mysqli->query($sql);
if( $res ) {
$message_data = $res->fetch_assoc();
echo __LINE__.PHP_EOL;
} else {
// データが読み込めなかったら一覧に戻る
header("Location: ./index.php");
}
$mysqli->close();
}
※これが105の部分です。
<textarea id="area1" id="message" name="message" onkeyup="viewStrLen();" cols="50" rows="10" placeholder="ここに書いてね"><?php echo __LINE__.PHP_EOL;if(!empty($message_data['message']) ){ echo $message_data['message']; }?></textarea>
もっとたくさん分岐点はあると思いますが・・・。
要は「そこ(出力されたのはファイルの行数)を通った」という意味になるのでそこから処理を追っていけるはずです。
分かりました。
他のところにも入力したら出力されたので、処理を追ってみます。
無事に解決しました。
アドバイスをくださった皆様、ご協力ありがとうございました。
解決までの経緯を自身で回答書かれて自己解決とされた方が良いように思います(現状だとベストアンサーに選ばれた回答がどのように解決のヒントとなったのか分からないので、せめてコメントで書いてあげてください)
回答1件
あなたの回答
tips
プレビュー