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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

2回答

1267閲覧

更新するだけでMySQLにデータが飛んでしまう

hati3693

総合スコア24

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2018/08/01 02:17

前提・実現したいこと

フォームのデータをデータベースに入れる練習をしています。
送信するとデータに登録するまではできたのですが、フォーム画面と送信完了画面をF5で更新すると、それだけでデータベースに空のデータが保存されるのをやめたいです。
おそらく最初の接続のところで送信の処理をしているような気がするのですが、まだ理解できていない部分が多くどこでその処理をしているのかがわかりません。

form.php・・・フォーム(更新すると空のデータが保存される)
confirm.php・・・確認
formend.php・・・完了画面(更新すると空のデータが保存される)

form.php

<?php // データソースを変数に格納 $dsn = 'mysql:host=○○;dbname=○○;charset=utf8'; // ユーザー名/PASS $user = '○○'; $password = '○○'; // SQL接続 // PDOの処理を記述 try { $dbh = new PDO($dsn, $user, $password); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // SQL作成 $sql = "SELECT * FROM テーブル名"; // SQL実行 $res = $dbh->query($sql); // エラー処理 } catch (PDOException $e) { // 強制終了 exit('データベース接続失敗。'.$e->getMessage()); } // データの追加 $sql = "INSERT INTO テーブル名 (date, title, content) VALUES('".$date."', '".$title."', '".$content."')"; $stmt = $dbh -> prepare($sql); $stmt -> execute(); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="confirm.php" method="post"> <div> <dl> <dt>日付</dt> <dd><input type="date" name="date" required></dd> </dl> <dl> <dt>タイトル</dt> <dd><input type="text" name="title" required></dd> </dl> <dl> <dt>内容</dt> <dd><textarea name="content" cols="30" rows="10" required></textarea></dd> </dl> <input type="submit" value="確認"> </div> </form> </body> </html>

confirm.php

<?php session_start(); $date = htmlspecialchars($_POST['date'], ENT_QUOTES, 'UTF-8'); $title = htmlspecialchars($_POST['title'], ENT_QUOTES, 'UTF-8'); $content = htmlspecialchars($_POST['content'], ENT_QUOTES, 'UTF-8'); $_SESSION['date']=$date;//セッション変数に格納 $_SESSION['title']=$title; $_SESSION['content']=$content; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="formend.php" method="post"> <div> <dl> <dt>日付</dt> <dd><?php echo $date;?></dd> </dl> <dl> <dt>タイトル</dt> <dd><?php echo $title;?></dd> </dl> <dl> <dt>内容</dt> <dd><?php echo $content;?></dd> </dl> <input type="submit" value="登録"> </div> </form> </body> </html>

formend.php

<?php session_start(); $date = htmlspecialchars($_SESSION['date'], ENT_QUOTES, 'UTF-8'); $title = htmlspecialchars($_SESSION['title'], ENT_QUOTES, 'UTF-8'); $content = htmlspecialchars($_SESSION['content'], ENT_QUOTES, 'UTF-8'); // データソースを変数に格納 $dsn = 'mysql:host=○○;dbname=○○;charset=utf8'; // ユーザー名/PASS $user = '○○'; $password = '○○'; // SQL接続 // PDOの処理を記述 try { $dbh = new PDO($dsn, $user, $password); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // SQL作成 $sql = "SELECT * FROM テーブル名"; // SQL実行 $res = $dbh->query($sql); // エラー処理 } catch (PDOException $e) { // 強制終了 exit('データベース接続失敗。'.$e->getMessage()); } //データ追加 $sql = "INSERT INTO テーブル名 (date, title, content) VALUES('".$date."', '".$title."', '".$content."')"; $stmt = $dbh-> prepare($sql); $stmt -> execute(); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <p>登録完了</p> <p><a href="">一覧に戻る</a></p> </body> </html>

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

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

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

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

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

date

2018/08/01 02:29

なぜ form.php にINSERT処理があるのですか?
hati3693

2018/08/01 02:35

おっしゃる通りINSERT部分を削除したら直りました。そのあたりも完全に理解していない初心者なので・・・すみません。精進します!
guest

回答2

0

解決になってますが、多分以下で引っかかります。

送信完了画面をF5

さいきょうの二重サブミット対策
ここがよくまとまっています。

投稿2018/08/01 02:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/08/01 03:03 編集

質問のコード、htmlspecialchars の使い方とか prepare とか、諸々おかしいので学習用として参考にしないほうが良いかと。
hati3693

2018/08/01 04:43

おっしゃるとおり、エラーがでてしまいました Fatal error: Uncaught Error: Call to a member function prepare() on null in /home/formend.php:12 Stack trace: #0 {main} thrown in /home/formend.php on line 12 もし解決策がわかるならご教示いただきたく・・
退会済みユーザー

退会済みユーザー

2018/08/01 04:55

質問のコードは学習に不向きだとコメントしたと思うのですけど。 問題箇所を解説する気はありません。 発生しているエラーは、PDO の使い方の初歩なので、まずはそこから学習してください。
guest

0

自己解決

form.phpのINSERT処理を削除で解決しました。

投稿2018/08/01 02:35

hati3693

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問