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

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

ただいまの
回答率

90.50%

  • PHP

    24082questions

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

  • mysqli

    178questions

    MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

フォームデータをデータベースに格納する[PHP]

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 796

mccandless

score 2

お世話になります。

フォームでポストされたデータをデータベース(MySQL)に格納したいのですが、
下記のコードでは格納が出来ません。
修正方法をご教示お願い致します。

エラーメッセージは出ておりません。確認方法がいたらないだけかもしれませんが。

var_dump($stmt);では下記値になります。
object(PDOStatement)#2 (1) { ["queryString"]=> string(93) "INSERT INTO entries (name,email,memo,created,modified)VALUES(:name,:email,:memo,now(),now());" } 

■index.php
<?php
session_start();

require_once('config.php');
require_once('functions.php');

if($_SERVER['REQUEST_METHOD'] != "POST"){ 
    //CSRF対策
    setToken();
}else{
    checkToken();
    $name = (string)filter_input(INPUT_POST, 'name');
    $email = (string)filter_input(INPUT_POST, 'email');
    $memo = (string)filter_input(INPUT_POST, 'memo');

    /*$name= $_POST['name'];
    $email= $_POST['email'];
    $memo= $_POST['memo'];*/

    $error = array();

    //エラー処理
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        $error['email'] = '※メールアドレスの形式が正しくありません';
    }
    if($email==''){
        $error['email'] = '※メールアドレスを入力して下さい。';
    }
    if($memo==''){
        $error['memo'] = '※内容を入力して下さい。';
    }

    if(empty($error)){
        //DBに格納
        $dbh= connectDb();

        $sql= "INSERT INTO entries (name,email,memo,created,modified)VALUES(:name,:email,:memo,now(),now());";
        $stmt = $dbh->prepare($sql);
        $params= array(":name" => $name,":email" => $email, ":memo" => $memo);
        $stmt->execute($params);
        if (!$stmt) {
            echo "\nPDO::errorInfo():\n";
            print_r($dbh->errorInfo());
        }

/*
var_dump($stmt);
*/

        //ありがとうページへ
        header('Location:'.SITE_URL.'thanks.html');
        exit;
    }
}
?>
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="ie6 oldie" lang="ja"> <![endif]-->
<!--[if IE 7]>    <html class="ie7 oldie" lang="ja"> <![endif]-->
<!--[if IE 8]>    <html class="ie8 oldie" lang="ja"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="" lang="ja">
<!--<![endif]-->
<!--[if lt IE 9]>
<script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
<![endif]-->

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="">
<meta name="description" content="">
<meta name="viewport" content="width=device-width; initial-scale=1.0">
<title>フォーム</title>

</head>
<body>
<div class="warpper">
    <div class="container">
    <h1>お問い合わせフォーム</h1>
    <form method="post" action="">

        <p>会員様氏名:<input type="text" name="name" value="<?php echo h($name);?>" class="text"></p>
        <p>メール※:<input type="text" name="email" value="<?php echo h($email);?>" class="text"></p>
<font class="fcr" style="margin-bottom: 20px;"><?php if($error['email']){echo h($error['email']); }?></font>

        <p>ご要望・ご質問等※:</p>
        <p><textarea name="memo" cols="40" rows="5"><?php echo h($memo);?></textarea></p>
<font class="fcr" style="margin-bottom: 20px;"><?php if($error['memo']){echo h($error['memo']); }?></font>

        <p><input type="submit" value="送信" class="btnA"></p>
        <input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>">
    </form>

<p><a href="<?php echo ADMIN_URL; ?>">管理者メニューへ</a></p>
    </div><!-- /container -->
</div><!-- /warpper -->

</body>
</html>

■config.php
<?php

//定数の設定
define('DSN','mysql:host=localhost;dbname=contacts_php;charset=utf8');
define('DB_USER','dbuser');
define('DB_PASSWORD','※※※※');
define('SITE_URL','http://localhost/php/contacts_php/');

define('ADMIN_URL',SITE_URL.'admin/');

// 文字化け対策
$options=array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET'utf8'");

//エラー出力の設定「NOTICE」以外のエラー全て出力しなさい
error_reporting(E_ALL & ~E_NOTICE);

//セッションの有効範囲設定(contacts_phpフォルダのみに)
session_set_cookie_params(0,'/contacts_php/');

?>

■functions.php
<?php

function connectDb(){
    try{
        return new PDO(DSN, DB_USER, DB_PASSWORD);
    }catch(PDOException $e){
        echo $e->getMessage();
        exit;
    }
}

function h($s){
    return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}

function setToken(){
    if(!isset($_SESSION['token'])){
        $_SESSION['token'] = sha1(uniqid(mt_rand(), true));
    }
}

function checkToken(){
    if(empty($_POST['token']) || $_POST['token'] != $_SESSION['token']){
        echo "不正な投稿です!";
        exit;
    }
}

?>

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • root_jp

    2016/02/24 14:01

    何か具体的にエラーが出ていれば教えてください。
    $name や $email に値はちゃんと入っていますか?
    バリデーションはうまく動いていますか?

    キャンセル

  • mccandless

    2016/02/24 14:14

    ご指摘ありがとうございます。

    エラーメッセージは出ておりません。確認方法がいたらないだけかもしれませんが。

    var_dump($stmt);では下記値になります。
    object(PDOStatement)#2 (1) { ["queryString"]=> string(93) "INSERT INTO entries (name,email,memo,created,modified)VALUES(:name,:email,:memo,now(),now());" }

    キャンセル

  • root_jp

    2016/02/24 14:23

    レコードそのものが作成されていないのか、レコードは作成されているが値が入っていないのか、どちらですか?

    キャンセル

  • mccandless

    2016/02/24 14:37

    ご連絡ありがとうございます。

    レコードそのものが作成されていないと思います。

    ターミナル以下になるため。
    mysql> select * from ※※※※;
    Empty set (0.00 sec)

    キャンセル

回答 1

0

細かな点は見ていません。
最小限のコードにして確認するとか、ポイントとなる点を想定通りの値が設定されているかを確認していくことが問題解決の近道かと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/24 14:21

    ご指摘ありがとうございます。
    各変数ごと確認してみます。

    キャンセル

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

  • PHP

    24082questions

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

  • mysqli

    178questions

    MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。