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

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

ただいまの
回答率

90.32%

  • PHP

    21359questions

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

  • MySQL

    6186questions

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

  • phpMyAdmin

    691questions

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

フォームで受け取ったデータをデータベースに登録したい。

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,171

tatata-ta

score 7

新規登録画面を作成中です(入力内容をデータベースに保存)
フォームで受け取ったデータを作成済みのテーブルに登録したいのですが、
うまくいきません。
調べてるうちにどんどんわからなくなって質問させていただきました。
どこがおかしくて、データが登録されないのか指摘していただけると幸いです。

【環境】
PC:mac
xampp
ecripse
mysql(local)

【質問】
作成した入力フォーム(ニックネーム、パスワード、メールアドレス)
へ入力されたデータを phpmyadmin 上に作成したテーブル(user)に
登録したいのですが、データがphpmyadminに登録されません。
行いたい処理は以下の通りです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
処理1
入力されたニックネーム、メールアドレス、パスワードを受け取り、変数に入れる。

処理2
データベースに接続する(PDOを使う)

処理3
データベース(userテーブル)に新規登録する。

処理4
signup_complete.phpに画面遷移する。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
フォームに入力された内容が、phpmyadmin上で確認できれば
良いのですが、どの処理の段階で失敗しているのか・・・
INSERT文のどこかに問題があるのか
変数の定義の仕方が間違っているのか
原因がつかめずにいます。

記述しましたコードを貼りますので
原因と考えられるところを教えていただけないでしょうか?

※ブラウザ上でフォームに入力してから、signup_complete.phpに画面遷移するまでエラーは出ません。しかし、phpmyadminのテーブルには反映されないということです。

ここから以下、自分の記述したコードです。↓

===================================

<?php 
require_once('config.php');

if ($_SERVER['REQUEST_METHOD'] !='POST') {
    // 初めて画面にアクセスした時の処理
}else{
    // フォームからサブミットされた時の処理

    //処理1
    //入力された値を変数に代入する

    if(isset($_POST['user_screen_name'])){
    $user_screen_name = $_POST['user_screen_name'];
    }
    if(isset($_POST['user_password'])){
    $user_password = $_POST['user_password'];
    }
    if(isset($_POST['user_email'])){
    $user_email = $_POST['user_email'];
    }

    //処理2
    //データベースにPDOで接続
    //以下4行はdbへの接続するための情報
    $host = "localhost";   //データベース サーバー
    $user = "****";        //テーダベースユーザー名
    $pass = "*****";    //接続パスワード
    $db = "mykakugen";     //データベース名

    $param = "mysql:dbname=".$db.";host=".$host;    

    //あらかじめ定義したユーザー名や、パスワードを使ってPDOでdbに接続
    $pdo = new PDO($param,$user,$pass);

    //データベースにアクセスする文字コードをutf8に設定
    $pdo->query('SET NAMES utf8;');

    //処理3
    //db(user)に登録する
    //$stmt = ステートメントの略。dbに対する1つの要求、処理の単位
    $stmt = $pdo->prepare("INSERT INTO user (
        user_screen_name,
        user_password,
        user_email,
        created_at,
        )VALUES(
        :user_screen_name,
        :user_password,
        :user_email,
        :now(),
        )");

    //ex:)$stmt->bindValue(':id', $_GET["id"], PDO::PARAM_INT);
    $stmt->bindValue(':user_screen_name',$_POST["user_screen_name"],PDO::PARAM_STR);
    $stmt->bindValue(':user_password',$_POST["user_password"],PDO::PARAM_STR);
    $stmt->bindValue(':user_email',$_POST["user_email"],PDO::PARAM_STR);
    $stmt->bindValue(':created_at',$_POST["created_at"],PDO::PARAM_STR);

    $flag = $stmt->execute();

    unset($pdo);

    //処理4
    //signup_complete.phpに移動する

    header("Location: signup_complete.php");

    exit;


}
?>
<!DOCTYPE html>
<html lang=ja>
    <head>
        <meta charset="utf-8">
        <title>ユーザー登録 | <?php echo SERVICE_NAME; ?></title>
        <meta name="description" content="自分だけの格言をいつも忘れないために。格言リマインダー「マイカクゲン」"/>
        <meta name="kyeword" content="マイカクゲン,格言,リマインダー"/>
        <link href="css/bootstrap.min.css" rel="stylesheet">
        <script src="js/bootstrap.min.js"></script>
        <link href="css/mykakugen.css" rel="stylesheet">
    </head>
    <body id="main">

    <div class="nav navbar-inverse navbar-fixed-top">
     <div class="navbar-inner">
      <div class="container">
       <a class="navbar-brand" href="<?php echo SITE_URL; ?>"><?php echo SERVICE_SHORT_NAME; ?></a>
       <ul class="nav navbar-nav">
        <li class="active"><a href="./signup.php">格言登録</a></li>
        <li><a href="./item_list.php">格言リスト</a></li>
        <li><a href="./setting.php">設定</a></li>
        <li><a href="./login.php">ログアウト</a></li>
       </ul>
      </div>
     </div>
    </div>

    <div class="cotainer">

        <h1>ユーザー登録</h1>

        <form method="POST" class="panel panel-default panel-body">
            <div class="form-group">
             <!--<label>ニックネーム</label>-->
             <input type="text" class="form-control" name="user_screen_name" value=""placeholder="ニックネーム"/>
            </div>
            <br/>

            <div class="form-group">
             <!--<label>パスワード</label>-->
             <input type="password" class="form-control" name="user_password" value="" placeholder="パスワード"/>
            </div>
            <br/>

            <div class="form-group">
             <!--<label >メールアドレス</label>-->
             <input type="text" class="form-control" name="user_email" value="" placeholder="メールアドレス"/>
            </div>
            <br/>

            <div class="form-group">
             <input type="submit" class="btn btn-success btn-block" value="アカウントを作成"/>
            </div>
        </form>

    <hr>
    <footer class="footer">
     <p><?php echo COPYRIGHT; ?></p>
    </footer>

    </div><!-- container -->
    </body>
</html>


===================================

回答の程、宜しくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2017/02/22 01:14

    質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。また、「うまくいかない」とは「何をしたときに」「どうなると思って」「どうなったのか」を、出ているエラーなどと併せて、具体的に記述されたほうが回答を得られやすいと思います。

    キャンセル

  • tatata-ta

    2017/02/22 02:35

    修正いたしました。ご指摘ありがとうございます。

    キャンセル

回答 4

+3

$pdo->prepareで:created_atというパラメータを定義していないのに、バインドしようとしているのでエラーが起きているのではないでしょうか。
さらにはcreated_atという値はSubmitしていないのに、$_POSTで取り出そうとしています。
また、処理1でPOSTの値を変数に代入しているのに使っていませんね(これはエラーの原因ではないですが)。
おそらく、実現したいのは↓のようなことではないでしょうか?

<?php 
require_once('config.php');

if ($_SERVER['REQUEST_METHOD'] !='POST') {
    // 初めて画面にアクセスした時の処理
}else{
    // フォームからサブミットされた時の処理

    //処理1
    //入力された値を変数に代入する

    if(isset($_POST['user_screen_name'])){
    $user_screen_name = $_POST['user_screen_name'];
    }
    if(isset($_POST['user_password'])){
    $user_password = $_POST['user_password'];
    }
    if(isset($_POST['user_email'])){
    $user_email = $_POST['user_email'];
    }

    //処理2
    //データベースにPDOで接続
    //以下4行はdbへの接続するための情報
    $host = "localhost";   //データベース サーバー
    $user = "****";        //テーダベースユーザー名
    $pass = "*****";    //接続パスワード
    $db = "mykakugen";     //データベース名

    $param = "mysql:dbname=".$db.";host=".$host;    

    //あらかじめ定義したユーザー名や、パスワードを使ってPDOでdbに接続
    $pdo = new PDO($param,$user,$pass);

    //データベースにアクセスする文字コードをutf8に設定
    $pdo->query('SET NAMES utf8;');

    //処理3
    //db(user)に登録する
    //$stmt = ステートメントの略。dbに対する1つの要求、処理の単位
    $stmt = $pdo->prepare("INSERT INTO user (
        user_screen_name,
        user_password,
        user_email,
        created_at,
        )VALUES(
        :user_screen_name,
        :user_password,
        :user_email,
        now(),
        )");

    //ex:)$stmt->bindValue(':id', $_GET["id"], PDO::PARAM_INT);
    $stmt->bindValue(':user_screen_name',$user_screen_name, PDO::PARAM_STR);
    $stmt->bindValue(':user_password',$user_password, PDO::PARAM_STR);
    $stmt->bindValue(':user_email',$user_email, PDO::PARAM_STR);

    $flag = $stmt->execute();

    unset($pdo);

    //処理4
    //signup_complete.phpに移動する

    header("Location: signup_complete.php");

    exit;


}
?>

signup_complete.phpに画面遷移するまでエラーは出ません。

リダイレクトしているから見られないのではと思います。
一時的に「header("Location: signup_complete.php");」をコメントにして実行してはいかがでしょう。
それでもエラーが表示されなければ、php.iniの設定を変更するか、冒頭にdisplay_errorsとerror_reportingを記述してください。
→参考

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/22 21:34

    回答ありがとうございます。
    解決いたしましたら、再度コメントさせていただきます。
    取り急ぎ、まず回答頂けとことに感謝いたします。

    キャンセル

+1

いろいろエラー処理的なものは省略すべきでは無いですが、ここでは練習として省略します。

<?php
// POST送信が無かった特に何も無い様なので、POSTがあったらという条件にしました。
if($_SERVER['REQUEST_METHOD'] === 'POST') {
  // どちらが正解かはわかりませんが、私が好んで使っているfilter_inputを書いてみました。これは参考までです。
    /*if(isset($_POST['user_screen_name'])){
    $user_screen_name = $_POST['user_screen_name'];
    }
    if(isset($_POST['user_password'])){
    $user_password = $_POST['user_password'];
    }
    if(isset($_POST['user_email'])){
    $user_email = $_POST['user_email'];
    }*/

    $user_screen_name = filter_input(INPUT_POST, 'user_screen_name');
    $user_password    = filter_input(INPUT_POST, 'user_password');
    $user_email       = filter_input(INPUT_POST, 'user_email');

  // 当たり前ですが、この辺は書き換えてください
    $host = "****";   //データベース サーバー
    $user = "****";        //テーダベースユーザー名
    $pass = "****";    //接続パスワード
    $db = "***";     //データベース名

  // ここでcharsetも入れちゃってます
    $param = 'mysql:host='.$host.';dbname='.$db.';charset=utf8';

  // PDOなのでtry catchの書き方は簡単なので覚えたほうが良いと思います。
    try {
        $pdo = new PDO($param, $user, $pass);
    // SQLを別で書いてますが、同じことですので、、、
        $sql = "
                INSERT INTO user
                    (user_screen_name, user_password, user_email, created_at)
                    VALUES
                    (:user_screen_name, :user_password, :user_email, now())"; // :now()ではnow()が動きません
        $stmt = $pdo->prepare($sql);
    // 上で変数に入れているのに何故かそれを使われてなかったのと
       // バインドするところに$_POSTとかをいきなりやっちゃうのは癖とかつけないほうがいい気がします
        $stmt->bindValue(':userName', $user_screen_name);
        $stmt->bindValue(':userPass', $user_password);
        $stmt->bindValue(':email', $user_email);
    // 元々あった:created_atは存在してなかったので消してます。
        $stmt->execute();
    } catch(PDOException $e) {
        echo $e->getMessage();
        exit;
    }
}

?>


一応これでこちらでは動作しました。
多少nameとか違ったりしているかもしれません、テスト環境作るのに手抜いて、、、

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/22 21:34

    回答ありがとうございます。
    解決いたしましたら、再度コメントさせていただきます。
    取り急ぎ、まず回答頂けとことに感謝いたします。

    キャンセル

0

:now(),

っておかしくないですか?
その後の表記ではcreated_atになっているような・・

またPDOを利用するならエラーが拾えるようにtry~catchしてください

try{
  $dsn = 'mysql:host=localhost; dbname=xxxx';
  $user = 'xxxx';
  $password = 'xxxx';
  $pdo = new PDO($dsn, $user,$password);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
  $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8');
  $sql="xxxxx";
  $stmt = $pdo->prepare($sql);
  $stmt->execute(xxx);
}catch(PDOException $e){
  die($e->getMessage());
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/22 21:34

    回答ありがとうございます。
    解決いたしましたら、再度コメントさせていただきます。
    取り急ぎ、まず回答頂けとことに感謝いたします。

    キャンセル

0

 //データベースにアクセスする文字コードをutf8に設定
    $pdo->query('SET NAMES utf8;');


これは絶対にやってはいけません!

PDOのコンストラクタのデータソース名に charset=utf8 を含める必要があります。

正しい指定方法は以下の通りです。

$dsn = "mysql:dbname=mykakugen;host=localhost;charset=utf8";
$user = 'root';
$pass = '';

SET NAMES utf8 を使いたければ

$pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");


としなければなりません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • PHP

    21359questions

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

  • MySQL

    6186questions

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

  • phpMyAdmin

    691questions

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