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

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

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

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

PHP

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

Q&A

解決済

1回答

755閲覧

投稿ボタンを押下でSQLに書き込んだ内容がサイトに反映されるようにしたい

Wsan

総合スコア5

MySQL

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

PHP

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

1グッド

0クリップ

投稿2022/10/16 02:55

前提

PHPをもちいた掲示板作成を行っています。
投稿機能を実装中に以下のようなことが起こりました。
どのようにすればこの状況を切り抜けられるか、調べるとよいキーワードなどをお教えいただけますと幸いです。

実現したいこと

投稿ボタンを押したら、投稿がすぐに反映されるようにする。

発生している問題・エラーメッセージ

エラーメッセージはないです。
SQLに投稿内容を書き込むことはできますが、書き込んだ最新内容はリロードしないと反映されないという状況です。

該当のソースコード

html,php,SQL

ソースコード <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>掲示板: A - 新規スレッド</title> <link rel="stylesheet" href="stylesheet.css"> </head> <body> <div class="header0"> <div class="header00"> <h1 class="title">掲示板: A </h1> </div> </div> <?php $ThreadTitle_array=array(); try{ $pdo=new PDO('mysql:host=localhost;dbname=a_data','root',''); } catch (PDOException $e) { echo $e->getMessage(); } $sql="SELECT page_id ,pagename , post_time FROM `page` WHERE page_id=1;"; $ThreadTitle_array = $pdo->query($sql); foreach($ThreadTitle_array as $ThreadTitle): ?> <div class="ThreadHeader"> <div class="ThreadHeader1"> <h3><?php echo $ThreadTitle["pagename"]?></h3> </div> </div> <?php endforeach; $comment_array=array(); $sql="SELECT id ,username , post_time ,comment FROM `a` WHERE page_id=1;"; $comment_array = $pdo->query($sql); foreach($comment_array as $comment): ?> <div class="thread"> <div class="thread1"> <span class = "id"><?php echo $comment["id" ]?>.</span> <span class="username"><?php echo $comment["username"] ?></span><br> <span class="post_time"><?php echo $comment["post_time"]; ?></span> <br></br> <soan class="comment"><?php echo $comment["comment"]; ?></span> </div> </div><?php endforeach; ?> <!--*入力欄--> <form class="post" action="1.php" method="post"> <div class="post1"> <p class=name_mail>名前 & メールアドレス</p> <?php if (isset($_POST["button"])) { //表示名の入力チェック if (empty($_POST["username1"])) { $error_message[1] = "↓お名前を入力してください。↓"; ?> <p class=error_message><?php echo $error_message[1]; ?></p> <?php } ?> <input class="input1" placeholder="名前" name=username1> <input class="input2" placeholder="メールアドレス(非表示)"> </div> <p class=post_comment>投稿内容</p> <?php //コメントの入力チェック if (empty($_POST["comment1"])) { $error_message[2] = "↓コメントを入力してください。↓"; ?><p class=error_message><?php echo $error_message[2]; ?></p> <?php } } ?> <textarea name="comment1"></textarea> <input type="submit" value="投稿" name="button" > </form> <?php $current_date = null; $message = array(); $message_array = array(); $success_message = null; $error_message = array(); $escaped = array(); $statment = null; $res = null; if (isset($_POST["button"])) { //入力チェック if (empty($_POST["username1"])) { $error_message[1] = "お名前を入力してください。"; } elseif (empty($_POST["comment1"])) { $error_message[2] = "コメントを入力してください。"; } else { $escaped[1] = htmlspecialchars($_POST["username1"], ENT_QUOTES, "UTF-8"); $escaped[2] = htmlspecialchars($_POST["comment1"], ENT_QUOTES, "UTF-8"); //トランザクション開始 $pdo->beginTransaction(); $id=15; $current_date = date("Y-m-d H:i:s"); try { //SQL作成 $statment = $pdo->prepare("INSERT INTO a (id,username,post_time,comment,page_id) VALUES (:id,:username,:current_date,:comment,1 );"); $statment->bindvalue(':id', $id, PDO::PARAM_INT); $statment->bindvalue(':username', $escaped[1], PDO::PARAM_STR); $statment->bindvalue(':comment', $escaped[2], PDO::PARAM_STR); $statment->bindvalue(':current_date', $current_date, PDO::PARAM_STR); $res = $statment->execute(); $res = $pdo->commit(); } catch (Exception $e) { //エラーが発生したときはロールバック(処理取り消し) $pdo->rollBack(); //echo $e->getMessage(); } } $statment = null; } } $pdo=null; ?> </div> <div class="header2"> </div> </body> </html>

試したこと

SQLに書き込み後にリロードすればいいのではと考え、以下を「$statement=null;」前の「}」の前に入れましたが、当然、この文の前にecho等がありますので「Cannot modify header information 」のエラーが出ます。

if (isset($_POST["button"])) {
header('Location: ./');
exit();

補足情報(FW/ツールのバージョンなど)

・php myadmin使用
・xampp v3.3.0使用
・php v8.1.6使用

yukkuri_55👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

処理順の問題です。
現状だと表示処理後に登録処理を行っています。
登録処理後に表示処理を行えば、登録された状態のデータが取得できます。
登録処理自体は表示と無関係のサーバーサイド側で完結する処理にもなるので、
DOCTYPE宣言より前に書いて差し支えないと思います。

あと別件ですが、htmlspecialchars()はHTML出力する文字列に対して行うものであって、
データ登録時に入力情報を加工することになるので、データ登録時に使用してはいけません。
表示処理にて出力するところに使いましょう。(つまりecho)

投稿2022/10/16 03:14

m.ts10806

総合スコア80765

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

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

Wsan

2022/10/16 05:31

ありがとうございます。解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問