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

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

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

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

Q&A

解決済

PHPでお問い合わせ入力データをデータベースに保存したい

tomotomo4322
tomotomo4322

総合スコア7

PHP

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

1回答

0グッド

0クリップ

322閲覧

投稿2023/01/16 17:05

編集2023/01/17 10:56

前提

Viewsフォルダにcontact.php, confirm.php, complete.php
ControllersフォルダにContactControl.php
ModelsフォルダにDb.phpをそれぞれ作成。

confirm.phpにて送信ボタンがクリックされ、complete.phpに渡ってきた入力データをデータベースに保存したい。
complete.php内にrequire_onceにてDb.phpを呼び出しています。

実現したいこと

confirm.phpにて送信ボタンがクリックされ、complete.phpに渡ってきた入力データをデータベースに保存したい。

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

処理自体は正常にできているようだが、phpmyadminのテーブルを確認すると入力内容が保存されていないです。

試しにDb.php内にて『echo $name;』及び『echo "接続成功";』と出力したところ、正常に画面に出力されたため、接続やconfirm.phpからの入力値自体は渡ってきているようです。

該当のソースコード

complete.php

1<?php 2if ($_SERVER["REQUEST_METHOD"] != "POST") { 3 header("Location: contact.php"); 4 exit(); 5} 6ini_set('display_errors', "On"); 7 8require_once(ROOT_PATH .'Models/Db.php'); 9ConectDb(); 10 11 12 13?> 14 15<!DOCTYPE html> 16<html lang="ja"> 17<head> 18 <meta charset="utf-8"> 19 <title>お問い合わせ完了画面</title> 20 <link rel="stylesheet" href="../public/css/style.css"> 21</head> 22<body> 23 <div class="container"> 24 <h1 class="contact_title">完了画面</h1> 25 <div class="completeMessage"> 26 <h2> 27 お問い合わせ内容を送信しました。<br> 28 ありがとうございました。 29 </h2> 30 </div> 31 <div><a href="index.php">トップ画面へ</a></div> 32 </div> 33</body>

Db.php

1 2function ConnectDb() 3{ 4 $dsn = 'mysql:host=localhost;dbname=casteria;charset=utf8'; 5 $user = 'root'; 6 $password = ''; 7 8 try { 9 $dbh = new PDO($dsn, $user, $password); 10 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 11 $dbh->beginTransaction(); 12 13 // $fullname = $_SESSION['fullname']; 14 // $furigana = $_SESSION['furigana']; 15 // $tellNumber = $_SESSION['tellNumber']; 16 // $email = $_SESSION['email']; 17 // $message = $_SESSION['message']; 18 19 $fullname = $_POST['fullname']; 20 $kana = $_POST['furigana']; 21 $tel = $_POST['tellNumber']; 22 $email = $_POST['email']; 23 $body = $_POST['message']; 24 25 $sql = "INSERT INTO contacts (fullname, kana, tel, email, body) VALUES (:fullname, :furigana, :tellNumber, :email, :message)"; 26 $stmt = $dbh->prepare($sql); 27 $params = array(':fullname' => $fullname, 'furigana' => $kana, 'tellNumber' => $tel, 'email' => $email, 'message' => $body); 28 $stmt->execute($params); 29 30 echo "接続成功"; 31 echo $fullname; 32 } catch (PDOException $e) { 33 echo "接続失敗: " . $e->getMessage() . "\n"; 34 exit(); 35 } 36}

試したこと

『php データベース 保存されない』と検索したのですが、答えに辿り付けませんでした。

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

環境はMAMPを使用しています。

phpmyadminのテーブルのスクショと完了画面のスクショを添付いたします。
イメージ説明

イメージ説明
どうかよろしくお願いいたします。

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

m.ts10806

2023/01/16 23:14

>phpmyadminのテーブル 細かいですが、「MySQLのテーブル」です。 phpMyAdminはあくまでMySQLを操作するためのツールで、手段の1つです。 コマンドラインや他のGUIツールでもアクセスできます。
m.ts10806

2023/01/16 23:19 編集

ちなみにテーブル定義はどうなっていますか? phpMyAdminの「構造」タブをスクリーンショットするか、 「エクスポート」でCREATE TABLE文を出力してご提示ください(後者の方がこちらで再現できるのでありがたい) また、細かいですが・・・ Conect → Connect stml   → stmt としたほうが良いかと( statement の略でおそらくstmtとしている記事のほうが多いです) https://www.php.net/manual/ja/pdo.prepare.php ※あくまで「命名」でプログラムにとってはそういう文字列の集合体でしかないのですが、  プログラムを書いたり読むのは人間なので、なるべく正しく綴り、略称も良く使われるものを採用した方が良いです
tomotomo4322

2023/01/17 01:37

m.ts10806様 おはようございます。 ご指摘いただき誠にありがとうございました! MySQLとphpMyadminの関係性が理解できました。 また、変数名についてもご指摘していただいた内容を理解いたしました! 今後気をつけて命名するようにします! CREATE TABLE文は下記の通りになっております。 どうかよろしくお願いいたします。 、、、 -- phpMyAdmin SQL Dump -- version 5.1.1 -- https://www.phpmyadmin.net/ -- -- ホスト: localhost:8889 -- 生成日時: 2023 年 1 月 17 日 10:32 -- サーバのバージョン: 5.7.34 -- PHP のバージョン: 7.4.21 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; -- -- データベース: `casteria` -- -- -------------------------------------------------------- -- -- テーブルの構造 `contacts` -- CREATE TABLE `contacts` ( `id` int(11) NOT NULL COMMENT 'システムID', `fullname` varchar(50) NOT NULL COMMENT '氏名', `kana` varchar(50) NOT NULL COMMENT 'フリガナ', `tel` varchar(11) DEFAULT NULL COMMENT '電話番号', `email` varchar(100) NOT NULL COMMENT 'メールアドレス', `body` text COMMENT 'お問い合わせ内容', `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '送信日時' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- ダンプしたテーブルのインデックス -- -- -- テーブルのインデックス `contacts` -- ALTER TABLE `contacts` ADD PRIMARY KEY (`id`); -- -- ダンプしたテーブルの AUTO_INCREMENT -- -- -- テーブルの AUTO_INCREMENT `contacts` -- ALTER TABLE `contacts` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'システムID'; COMMIT; 、、、
m.ts10806

2023/01/17 03:44

質問は編集できますので
tomotomo4322

2023/01/17 11:09

m.ts10806様 今回の問題について解決することができました。 トランザクションを指定しているのにコミットをしていなかったことが原因でした。 初歩的なミスで申し訳ございません; この度はありがとうございました!
m.ts10806

2023/01/17 20:23

後から参考にする人もいるので、念のため追記しておいてもらえると。

回答1

1

ベストアンサー

トランザクション指定しているのですから最後にコミットしてください
コミットしないでセッションが終了すればロールバックされます

PHP

1$dbh->beginTransaction(); 2//・・・ 3$stml->execute($params); 4dbh->commit();

もしくはbeginTransactionさえ指定しなければオートコミットします

投稿2023/01/17 03:23

編集2023/01/17 03:25
yambejp

総合スコア109990

m.ts10806👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

tomotomo4322

2023/01/17 11:07

yambejp 様 ご回答いただき誠にありがとうございました! yambejp様のお陰で無事に解決することができました! トランザクションの内容をきちんと理解できてませんでした。 トランザクションについてもう一度インプットします。 ありがとうございました^ ^

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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