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

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

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

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

PHP

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

Q&A

解決済

3回答

7651閲覧

お問い合わせフォームから送信したデータがデータベースに格納されない

k2font

総合スコア12

MySQL

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

PHP

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

0グッド

1クリップ

投稿2015/01/31 17:25

ドットインストールを見ながらPHPでお問い合せフォームを作っています。
8割方完成したのですが、どうしてもドハマりしてしまう部分があるので、質問させていただきます。

お問い合わせのフォームには「名前」「メールアドレス」「お問い合わせの内容」を書く欄があり、すべての欄に記入をして送信ボタンを押すと、一見送信が成功したように見えるのですが、データベースの中身を見ると**「メールアドレス」と「お問い合わせの内容」だけ何も格納されないまま**になります(「名前」だけ格納される)。

これは何故でしょうか。phpMyAdminでデータベースの設定をよく確認したり、PHPのコードを確認しましたが、解決する気配がありません。
以下にソースコードと開発環境を示しますので、ご回答よろしくお願いします。

以下、コード
contact.php(メインページ)

lang

1 require_once('config.php'); 2 require_once('functions.php'); 3 4 session_start(); 5 6 if($_SERVER['REQUEST_METHOD'] != "POST") { 7 //投稿前 8 //CSFR対策 9 setToken(); 10 } else { 11 //投稿後 12 checkToken(); 13 14 $name = $_POST['name']; 15 $email = $_POST['email']; 16 $memo = $_POST['memo']; 17 18 $error = array(); 19 20 //エラー処理 21 if(!filter_var($email, FILTER_VALIDATE_EMAIL)) { 22 $error['email'] = 'メールアドレスの形式が正しくありません'; 23 } 24 25 if($email = '') { 26 $error['email'] = 'メールアドレスを入力してください'; 27 } 28 29 if($memo = '') { 30 $error['memo'] = 'お問い合せ内容を入力してください'; 31 } 32 33 if(empty($error)) { 34 // DBに格納 35 $dbh = connectDb(); 36 37 $sql = "insert into entries 38 (name, email, memo, created, modified) 39 values 40 (:name, :email, :memo, now(), now())"; 41 42 $stmt = $dbh -> prepare($sql); 43 $params = array( 44 ":name" => $name, 45 ":email" => $email, 46 ":memo" => $memo 47 ); 48 49 $stmt -> execute($params); 50 51 //送信完了ページヘ 52 header('Location: '.SITE_URL.'thanks.php'); 53 exit; 54 } 55 } 56?> 57 58<!DOCTYPE html> 59<html> 60 <head> 61 <meta charset="UTF-8"> 62 <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"> 63 <title>お問い合わせ</title> 64 65 <link rel="stylesheet" href="css/metro-bootstrap.css"> 66 <link href="css/metro-bootstrap-responsive.css" rel="stylesheet"> 67 <link rel="stylesheet" href="css/main.css"> 68 <link href="css/iconFont.css" rel="stylesheet"> 69 <script src="js/jquery/jquery.min.js"></script> 70 <script src="js/jquery/jquery.widget.min.js"></script> 71 <script src="js/jquery/jquery.mousewheel.js"></script> 72 <script src="min/metro.min.js"></script> 73 <script src="js/aScroller.js"></script> 74 <script src="bootstrap/js/bootstrap.min.js"></script> 75 76 <link rel="shortcut icon" href="img/favicon.ico"> 77 </head> 78 79 <body class="metro"> 80 <div id="s_menu"> 81 <div class="maintext"> 82 <h1>お問い合わせ</h1> 83 <p>お問い合せは以下のフォームよりお願いします</p> 84 <p>※「*」部分は必須項目です</p> 85 86 <!-- 以下フォーム部分 --> 87 <form method="post" action=""> 88 <p>お名前* : <input type="text" name="name" value=""></p> 89 <p> 90 メールアドレス* : <input type="text" name="email" value="<?php echo h($email); ?>"> 91 <?php 92 if($error['email']) { 93 echo h($error['email']); 94 } 95 ?> 96 </p> 97 <p>お問い合わせ内容* : </p> 98 <p><textarea name="memo" cols="100" rows="15"><?php echo h($email); ?></textarea></p> 99 <?php 100 if($error['memo']) { 101 echo h($error['memo']); 102 } 103 ?> 104 <p><input type="submit" value="送信"></p> 105 <input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>"> 106 </form> 107 </div> 108 </div> 109 </body> 110</html>

config.php

lang

1 define('DSN', 'mysql:host=(ホスト名);dbname=(データベースの名前)'); 2 define('DB_USER', '(ユーザーネーム)'); 3 define('DB_PASSWORD', '(パスワード)'); 4 5 define('SITE_URL', '(サイトのURL)'); 6 define('ADMIN_URL', SITE_URL.'admin/'); 7 8 error_reporting(E_ALL & ~E_NOTICE); 9 10 session_set_cookie_params(0, '/contact_php/'); 11?>

functions.php

lang

1 function connectDb() { 2 try { 3 return new PDO(DSN, DB_USER, DB_PASSWORD); 4 } catch (PDOException $e) { 5 echo $e -> getMessage(); 6 exit(); 7 } 8 } 9 10 function h($s) { 11 return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); 12 } 13 14 function setToken() { 15 /* 処理 */ 16 } 17 18 function checkToken() { 19 /* 処理 */ 20 } 21?>

データベースはMySQLを使用し、定義は以下のとおりです。

lang

1| Field | Type | Null | Key | Default | Extra | 2+----------+--------------+------+-----+---------+----------------+ 3| id | int(11) | NO | PRI | NULL | auto_increment | 4| name | varchar(255) | YES | | NULL | | 5| email | varchar(255) | YES | | NULL | | 6| memo | text | YES | | NULL | | 7| created | datetime | YES | | NULL | | 8| modified | datetime | YES | | NULL | | 9+----------+--------------+------+-----+---------+----------------+ 10

以上です。
なお、config.phpのdefineには正しい情報が記入されているものとします。
また、setToken()とcheckToken()はfunctions.php内に正しく記入されているものとします。
もちろん、冒頭の「<?php」も正しく記入されているものとします。

解答よろしくお願いします。

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

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

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

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

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

guest

回答3

0

私もPHP経験が浅いですが・・・
$sql = "insert into entries
(name, email, memo, created, modified)
values
('{$name}', '{email}', '{memo}', now(), now())";
これでも行きませんか?

あと、IDがNot NullなのにデフォルトがNULLってのもちょっと気になりますね・・・。

投稿2015/01/31 22:33

h-yoshinaka

総合スコア118

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

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

k2font

2015/02/01 02:25

上記の方法を試し、emailとmemo(本文)にもデータが格納されるようになりましたが、格納されたデータが「{email}」と「{memo}」になってしまいます。 試しに{$email}と{$memo}にしましたが、こうすると値が格納されなくなります。 データベースの定義ミス(NOT NULLなのにデフォルトがNULL)は先ほど気づいたので直しました汗 ありがとうございます。 朝早くからご回答有難うございます。もう少し模索をしてみます。
guest

0

PHPには詳しくないのですみませんが、質問の内容を見る限りはデバッグするのが近道だと思います。

DBにexecuteする直前の値を確認し、問題なければ直後にDBから値を取得してください。
そこまで切り分けが出来てからもう一度ご質問をお願いします。

投稿2015/01/31 19:21

y.kagano

総合スコア22

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

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

k2font

2015/02/01 02:41

$email = $_POST['email']; $memo = $_POST['memo']; とした後に var_dump($email); var_dump($memo); を行った所、しっかりと値は格納されていました。 しかし、エラーチェック(3つのif文の羅列)をし、$paramsに格納をした直後に var_dump($params); を行った所、値は格納されていませんでした。 どうやら、この辺で躓いてるようです。 ありがとうございました。
guest

0

自己解決

自己解決しました。回答していただいたお二方、ありがとうございました。

以下のコード部分

lang

1if($email = '') { 2 $error['email'] = 'メールアドレスを入力してください'; 3} 4 5if($memo = '') { 6 $error['memo'] = 'お問い合せ内容を入力してください'; 7}

lang

1$email=''

lang

1!isset($email)

にしたら正常に格納されました。
理由はよく分かりません。

投稿2015/02/01 03:04

k2font

総合スコア12

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

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

fabled

2015/02/01 05:33

> 理由 `$email = ''`だと代入だからでは?
k2font

2015/02/01 05:59

「==」にすべきですよね笑 初歩的なところで躓いていました。 ありがとうございました。
h-yoshinaka

2015/02/01 16:23

if(!$email)でも行けると思う。 issetだけだと漏れが出るはず。 nullなのかブランクなのかを全て網羅するにはis_nullとissetと合わせた方が良いと思いますよ。
k2font

2015/02/02 01:23

>>if(!$email)でも行けると思う。 そうなのですか! それは初耳です! is_nullとissetを組み合わせる方法については、調べた限りだとかなり簡単に実現できることがわかったので、この方法でも書いてみます。 ありがとうございます。
h-yoshinaka

2015/02/02 09:17

私は実はif(!$text)があまり信用出来ない(nullなのか0なのかブランクなのかの判定が不透明なので。)下記のようなファンクション作ってます。 function nullCheck($text) { if ((is_null($text) || (empty($text) || (!isset($text))) { return false; } return true; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問