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

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

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

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

Q&A

解決済

1回答

825閲覧

ページを更新すると前回と同じ投稿が勝手にされる。

takuo5

総合スコア48

PHP

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

0グッド

0クリップ

投稿2020/04/14 02:28

前提・実現したいこと

PHPで簡易掲示板を作成しております。構造は以下のとおりです。

dbc.php(投稿一覧表示 + 投稿フォーム) post_create.php(投稿のバリデーション + データベース操作・処理)

フォームに投稿者・本文を入力して投稿を押すと投稿一覧に内容が表示されますが、ブラウザの更新ボタンを押すと同じ内容で新たに投稿が追加されます。
これを解決したいです。

dbc.php

<!-- MySQLとPHPを接続するためのファイル --> <?php // 関数一つに一つの機能のみ持たせる // 1.データベース接続 // 2.データを取得する // 3.カテゴリー名を表示 // 1.データベース接続 // 引数:なし // 返り値:接続結果を返す function dbConnect(){ $dsn = 'mysql:host=157.112.147.201; dbname=ppftest_db; charset=utf8'; $user = 'ppftest_user'; $pass = 'N4xib5Xr'; // 接続成功したときと失敗したときの分岐処理 try{ $dbh = new PDO($dsn, $user, $pass,[ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]); } catch(PDOException $e){ echo '接続失敗'. $e->getMessage(); exit(); }; return $dbh; } // 2.データを取得する // 引数:なし // 返り値:取得したデータ function getAllPost(){ $dbh = dbConnect(); // ①SQLの準備 $sql = 'SELECT * FROM post_yamamoto'; // SQLの実行 $stmt = $dbh->query($sql); // SQLの結果を受け取る $result = $stmt->fetchall(PDO::FETCH_ASSOC); return $result; $dbh = null; } // 取得したデータを表示 $postData = getAllPost(); // 3. ユーザー名を表示 // 引数:数字 // 返り値: ユーザー名の文字列 // // function setUserName($user_name){ // if($user_name === '1'){ // return // } // } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>簡易掲示板</title> </head> <body> <h2>一覧表示機能(<?php echo count($postData); ?>件)</h2> <ul> <?php foreach ($postData as $column): ?> <!-- 投稿者・投稿日時・本文 --> <li> [<?php echo $column['post_name'] ?>] / [<?php echo $column['post_datetime'] ?>] <br> [本文] <br> <?php echo $column['post_text'] ?> </li><br> <?php endforeach; ?> </ul> <h2>投稿機能</h2> <form action="post_create.php" method="post"> 投稿者 <span> <input type="text" name="post_name"><br> 本文 <br> <textarea name="post_text" rows="8" cols="80"></textarea> <br> <input type="submit" name="btn_submit" value="投稿"> </form> <p> <a href="form.php">新規作成</a> </p> </body> </html>

post_create.php

<?php require_once('dbc.php'); $posts = $_POST; if (empty($posts['post_name'])){ exit('投稿者を入力してください'); } if (empty($posts['post_text'])){ exit('本文を入力してください'); } if( !empty($_POST['btn_submit']) ) { $sql = 'INSERT INTO post_yamamoto(post_name, post_text) VALUES (:post_name, :post_text)'; $dbh = dbConnect(); $dbh->beginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':post_name',$posts['post_name'], PDO::PARAM_STR); $stmt->bindValue(':post_text',$posts['post_text'], PDO::PARAM_STR); $stmt->execute(); // 成功した場合は登録処理を実行。 $dbh->commit(); echo '投稿成功しました!'; } catch (PDOException $e) { // 失敗した場合は元の状態に戻す。 $dbh->rollBack(); exit($e); } } ?>

試したこと

下記の対策方法をpost_create.phpに実装を試みていますがうまくいきません。
リンク内容
上記以外で良い方法があれば教えていただきたいです。

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

phpmyadmin
Mysql
xserver

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

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

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

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

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

hoshi-takanori

2020/04/14 06:43

dbc.php の中で何か (html だけでなく、html コメントも含む) を出力してしているので、その際にヘッダーも自動的に出力されてしまいます。 DB に関する関数定義だけの php ファイルを作って、それを dbc.php と post_create.php から require するのがいいと思います。
takuo5

2020/04/14 07:22

ありがとうございます。 HTMLコードを別にindex.phpというファイルを作成して移し替え、requireでデータベース接続のコードをdbc.phpから呼ぶようにすると解決しました。 データベースを確認すると二重投稿もされず改善できました。 ありがとうございます。
guest

回答1

0

ベストアンサー

再読込すると、同じ内容がPOSTされるからでしょう。
「echo '投稿成功しました!';」のかわりに投稿一覧画面にリダイレクトすればいいと思います。

投稿2020/04/14 03:02

rjunakc

総合スコア368

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

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

takuo5

2020/04/14 04:28 編集

ご回答頂きましてありがとうございます。 「echo '投稿成功しました!';」を削除して下記の文を入れて試しました。 header('Location: (URL省略)/dbc.php'); しかしながら、再度同じ内容が投稿されたと同時に下記のエラーも出ました Warning: Cannot modify header information - headers already sent by (output started at (URL 省略)/dbc.php:3) in (URL 省略)//post_create.php on line 31 dbc.phpの3行目を見ましたが<?phpの開始タグしかないのですがこれはどうなっているのでしょうか? headerに関する記述はないのですが、、、
takuo5

2020/04/14 07:23

上記のhosho-takanoriさんのアドバイスどおりにすると改善されました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問