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

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

4回答

5014閲覧

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

tatata-ta

総合スコア13

MySQL

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

phpMyAdmin

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

PHP

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

0グッド

1クリップ

投稿2017/02/21 14:38

編集2017/02/21 18:24

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

【環境】
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

1<?php 2require_once('config.php'); 3 4if ($_SERVER['REQUEST_METHOD'] !='POST') { 5 // 初めて画面にアクセスした時の処理 6}else{ 7 // フォームからサブミットされた時の処理 8 9 //処理1 10 //入力された値を変数に代入する 11 12 if(isset($_POST['user_screen_name'])){ 13 $user_screen_name = $_POST['user_screen_name']; 14 } 15 if(isset($_POST['user_password'])){ 16 $user_password = $_POST['user_password']; 17 } 18 if(isset($_POST['user_email'])){ 19 $user_email = $_POST['user_email']; 20 } 21 22 //処理2 23 //データベースにPDOで接続 24 //以下4行はdbへの接続するための情報 25 $host = "localhost"; //データベース サーバー 26 $user = "****"; //テーダベースユーザー名 27 $pass = "*****"; //接続パスワード 28 $db = "mykakugen"; //データベース名 29 30 $param = "mysql:dbname=".$db.";host=".$host; 31 32 //あらかじめ定義したユーザー名や、パスワードを使ってPDOでdbに接続 33 $pdo = new PDO($param,$user,$pass); 34 35 //データベースにアクセスする文字コードをutf8に設定 36 $pdo->query('SET NAMES utf8;'); 37 38 //処理3 39 //db(user)に登録する 40 //$stmt = ステートメントの略。dbに対する1つの要求、処理の単位 41 $stmt = $pdo->prepare("INSERT INTO user ( 42 user_screen_name, 43 user_password, 44 user_email, 45 created_at, 46 )VALUES( 47 :user_screen_name, 48 :user_password, 49 :user_email, 50 :now(), 51 )"); 52 53 //ex:)$stmt->bindValue(':id', $_GET["id"], PDO::PARAM_INT); 54 $stmt->bindValue(':user_screen_name',$_POST["user_screen_name"],PDO::PARAM_STR); 55 $stmt->bindValue(':user_password',$_POST["user_password"],PDO::PARAM_STR); 56 $stmt->bindValue(':user_email',$_POST["user_email"],PDO::PARAM_STR); 57 $stmt->bindValue(':created_at',$_POST["created_at"],PDO::PARAM_STR); 58 59 $flag = $stmt->execute(); 60 61 unset($pdo); 62 63 //処理4 64 //signup_complete.phpに移動する 65 66 header("Location: signup_complete.php"); 67 68 exit; 69 70 71} 72?> 73<!DOCTYPE html> 74<html lang=ja> 75 <head> 76 <meta charset="utf-8"> 77 <title>ユーザー登録 | <?php echo SERVICE_NAME; ?></title> 78 <meta name="description" content="自分だけの格言をいつも忘れないために。格言リマインダー「マイカクゲン」"/> 79 <meta name="kyeword" content="マイカクゲン,格言,リマインダー"/> 80 <link href="css/bootstrap.min.css" rel="stylesheet"> 81 <script src="js/bootstrap.min.js"></script> 82 <link href="css/mykakugen.css" rel="stylesheet"> 83 </head> 84 <body id="main"> 85 86 <div class="nav navbar-inverse navbar-fixed-top"> 87 <div class="navbar-inner"> 88 <div class="container"> 89 <a class="navbar-brand" href="<?php echo SITE_URL; ?>"><?php echo SERVICE_SHORT_NAME; ?></a> 90 <ul class="nav navbar-nav"> 91 <li class="active"><a href="./signup.php">格言登録</a></li> 92 <li><a href="./item_list.php">格言リスト</a></li> 93 <li><a href="./setting.php">設定</a></li> 94 <li><a href="./login.php">ログアウト</a></li> 95 </ul> 96 </div> 97 </div> 98 </div> 99 100 <div class="cotainer"> 101 102 <h1>ユーザー登録</h1> 103 104 <form method="POST" class="panel panel-default panel-body"> 105 <div class="form-group"> 106 <!--<label>ニックネーム</label>--> 107 <input type="text" class="form-control" name="user_screen_name" value=""placeholder="ニックネーム"/> 108 </div> 109 <br/> 110 111 <div class="form-group"> 112 <!--<label>パスワード</label>--> 113 <input type="password" class="form-control" name="user_password" value="" placeholder="パスワード"/> 114 </div> 115 <br/> 116 117 <div class="form-group"> 118 <!--<label >メールアドレス</label>--> 119 <input type="text" class="form-control" name="user_email" value="" placeholder="メールアドレス"/> 120 </div> 121 <br/> 122 123 <div class="form-group"> 124 <input type="submit" class="btn btn-success btn-block" value="アカウントを作成"/> 125 </div> 126 </form> 127 128 <hr> 129 <footer class="footer"> 130 <p><?php echo COPYRIGHT; ?></p> 131 </footer> 132 133 </div><!-- container --> 134 </body> 135</html>

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

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

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

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

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

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

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

kei344

2017/02/21 16:14

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

2017/02/21 17:35

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

回答4

0

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

PHP

1<?php 2require_once('config.php'); 3 4if ($_SERVER['REQUEST_METHOD'] !='POST') { 5 // 初めて画面にアクセスした時の処理 6}else{ 7 // フォームからサブミットされた時の処理 8 9 //処理1 10 //入力された値を変数に代入する 11 12 if(isset($_POST['user_screen_name'])){ 13 $user_screen_name = $_POST['user_screen_name']; 14 } 15 if(isset($_POST['user_password'])){ 16 $user_password = $_POST['user_password']; 17 } 18 if(isset($_POST['user_email'])){ 19 $user_email = $_POST['user_email']; 20 } 21 22 //処理2 23 //データベースにPDOで接続 24 //以下4行はdbへの接続するための情報 25 $host = "localhost"; //データベース サーバー 26 $user = "****"; //テーダベースユーザー名 27 $pass = "*****"; //接続パスワード 28 $db = "mykakugen"; //データベース名 29 30 $param = "mysql:dbname=".$db.";host=".$host; 31 32 //あらかじめ定義したユーザー名や、パスワードを使ってPDOでdbに接続 33 $pdo = new PDO($param,$user,$pass); 34 35 //データベースにアクセスする文字コードをutf8に設定 36 $pdo->query('SET NAMES utf8;'); 37 38 //処理3 39 //db(user)に登録する 40 //$stmt = ステートメントの略。dbに対する1つの要求、処理の単位 41 $stmt = $pdo->prepare("INSERT INTO user ( 42 user_screen_name, 43 user_password, 44 user_email, 45 created_at, 46 )VALUES( 47 :user_screen_name, 48 :user_password, 49 :user_email, 50 now(), 51 )"); 52 53 //ex:)$stmt->bindValue(':id', $_GET["id"], PDO::PARAM_INT); 54 $stmt->bindValue(':user_screen_name',$user_screen_name, PDO::PARAM_STR); 55 $stmt->bindValue(':user_password',$user_password, PDO::PARAM_STR); 56 $stmt->bindValue(':user_email',$user_email, PDO::PARAM_STR); 57 58 $flag = $stmt->execute(); 59 60 unset($pdo); 61 62 //処理4 63 //signup_complete.phpに移動する 64 65 header("Location: signup_complete.php"); 66 67 exit; 68 69 70} 71?>

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

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

投稿2017/02/22 00:30

tomoeine

総合スコア127

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

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

tatata-ta

2017/02/22 12:34

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

0

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

PHP

1<?php 2// POST送信が無かった特に何も無い様なので、POSTがあったらという条件にしました。 3if($_SERVER['REQUEST_METHOD'] === 'POST') { 4 // どちらが正解かはわかりませんが、私が好んで使っているfilter_inputを書いてみました。これは参考までです。 5 /*if(isset($_POST['user_screen_name'])){ 6 $user_screen_name = $_POST['user_screen_name']; 7 } 8 if(isset($_POST['user_password'])){ 9 $user_password = $_POST['user_password']; 10 } 11 if(isset($_POST['user_email'])){ 12 $user_email = $_POST['user_email']; 13 }*/ 14 15 $user_screen_name = filter_input(INPUT_POST, 'user_screen_name'); 16 $user_password = filter_input(INPUT_POST, 'user_password'); 17 $user_email = filter_input(INPUT_POST, 'user_email'); 18 19 // 当たり前ですが、この辺は書き換えてください 20 $host = "****"; //データベース サーバー 21 $user = "****"; //テーダベースユーザー名 22 $pass = "****"; //接続パスワード 23 $db = "***"; //データベース名 24 25 // ここでcharsetも入れちゃってます 26 $param = 'mysql:host='.$host.';dbname='.$db.';charset=utf8'; 27 28 // PDOなのでtry catchの書き方は簡単なので覚えたほうが良いと思います。 29 try { 30 $pdo = new PDO($param, $user, $pass); 31 // SQLを別で書いてますが、同じことですので、、、 32 $sql = " 33 INSERT INTO user 34 (user_screen_name, user_password, user_email, created_at) 35 VALUES 36 (:user_screen_name, :user_password, :user_email, now())"; // :now()ではnow()が動きません 37 $stmt = $pdo->prepare($sql); 38 // 上で変数に入れているのに何故かそれを使われてなかったのと 39 // バインドするところに$_POSTとかをいきなりやっちゃうのは癖とかつけないほうがいい気がします 40 $stmt->bindValue(':userName', $user_screen_name); 41 $stmt->bindValue(':userPass', $user_password); 42 $stmt->bindValue(':email', $user_email); 43 // 元々あった:created_atは存在してなかったので消してます。 44 $stmt->execute(); 45 } catch(PDOException $e) { 46 echo $e->getMessage(); 47 exit; 48 } 49} 50 51?>

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

投稿2017/02/22 02:23

Z-TALBO

総合スコア525

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

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

tatata-ta

2017/02/22 12:34

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

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 00:24

yambejp

総合スコア114769

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

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

tatata-ta

2017/02/22 12:34

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

0

php

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

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

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

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

php

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

SET NAMES utf8 を使いたければ

php

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

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

投稿2017/10/28 03:33

naohiro19_

総合スコア178

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問