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

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

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

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

Q&A

解決済

3回答

5445閲覧

データベースに登録した情報が反映されないです

bainary

総合スコア58

PHP

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

0グッド

0クリップ

投稿2019/04/12 07:57

php

1<?php 2 //DB名、ユーザー名、パスワード 3 session_start(); 4 try { 5 $db = new PDO('mysql:host=localhost; dbname=csv_db; charset=utf8', 'root', ''); 6 7 } catch (PDOException $e) { 8 echo 'データベースに接続エラー' . $e->getMessage(); 9 exit(); 10 } 11 12 $errorMessage = ""; 13 $signUpMessage = ""; 14 15 16 17 if (!empty($_POST["last_name"]) && !empty($_POST["first_name"]) && !empty($_POST["password"]) && !empty($_POST["password2"]) && $_POST["password"] === $_POST["password2"]) { 18 19 $id = $_POST['id']; 20 $last_name = $_POST['last_name']; 21 $first_name = $_POST['first_name']; 22 $last_name_kana = $_POST['last_name_kana']; 23 $first_name_kana = $_POST['first_name_kana']; 24 $password = $_POST['password']; 25 $email = $_POST['email']; 26 $company_name = $_POST['company_name']; 27 $department = $_POST['department']; 28 $postal_code_1 = $_POST['postal_code_1']; 29 $postal_code_2 = $_POST['postal_code_1']; 30 $pref = $_POST['pref']; 31 $address_1 = $_POST['address_1']; 32 $address_2 = $_POST['address_2']; 33 $tel_1 = $_POST['tel_1']; 34 $tel_2 = $_POST['tel_2']; 35 $tel_3 = $_POST['tel_3']; 36 $created_at = $_POST['created_at']; 37 $updated_at = $_POST['updated_at']; 38 39 $stmt = $db->prepare("INSERT INTO userData(name, password,value) VALUES (?, ?)"); 40 $stmt->execute(array($first_name,$last_name, password_hash($password, PASSWORD_DEFAULT))); 41 42 $id = $db->lastinsertid(); 43 $signUpMessage = '登録が完了しました。あなたの登録IDは '. $id. ' です。パスワードは '. $password. ' です。'; 44} 45?>

上記のように、カラムがたくさんあるのですが上手くデータベースに情報が登録されません
データベースには上手く接続出来ているのですが、なぜなのでしょうか?
この下にhtmlでデータ入力欄があり、1つ1つにvalueで値は与えていますが上手くいきません。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/04/12 08:45

実行環境についても説明がほしい。パソコンでテスト中なのであればwebサーバーやphpやmysqlをどうやってインストールしたり設定したりしたのか。レンタルサーバーなのであれば業者名やプラン名など。
bainary

2019/04/12 08:49

現在の実行環境はxamppです。
tabuu

2019/04/12 08:54

>データベースには上手く接続出来ているのですが、 これはどのように確認されているのでしょう?
bainary

2019/04/12 08:57

try catch でデータベースに接続出来ているか、そうでないかと分岐させていてエラーを吐かずに表記されています。 仮になのですが、カラム名がデータベースと一つでも結びついていないとデータは格納されないのでしょうか?
tabuu

2019/04/12 09:24

PHPではなくコンソールから「id:root pw:(なし)」ログインできますか? ログイン出来たら use csv_db; desc userData; とコマンドを入力して結果を教えて。
bainary

2019/04/12 13:21

そもそものPHP記述の仕方が間違えていたみたいでした。 1からファイルを作り直してます。
bainary

2019/04/12 13:21

そもそものPHP記述の仕方が間違えていたみたいでした。 1からファイルを作り直してます。
guest

回答3

0

name, password, valueを指定しているのに、
?によって2つしか提供していないんだけど。

mysqlなら識別子にはバッククオートを足すと安全性が高まるかも。

$stmt = $db->prepare("INSERT INTO userData(`name`, `password`, `value`) VALUES (?, ?, ?)");

で、execute()の場面で、「$first_name, $last_name, password_hash($password, PASSWORD_DEFAULT)」って、
passwordに$last_nameでいいのかと。


DB接続の場面で例外を捕まえられていない可能性が高いです。

php

1 try { 2 $db = new PDO('mysql:host=localhost;dbname=csv_db;charset=utf8mb4', 'root', '', [ 3 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 4 PDO::ATTR_EMULATE_PREPARES => false, 5 ]); 6 var_dump($db) 7 } catch (PDOException $e) { 8 echo 'データベースに接続エラー' . $e->getMessage(); 9 exit(); 10 }

などとしてみては。$dbにどんな値が入るかを確認するのも忘れずに。


XAMPPって話が出てきたので補足します。
XAMPP Control Panelってのを立ち上げると、
Apacheの他にMySQLってのがModuleとしてあるはずです。
MySQLが稼働していればPort(s)の欄に番号が書いてあって、
それがDB接続できるポート番号です。
標準ではTCP:3306番のはずですが、
インストール時に違う番号になっていることもあるので、
もしも違っていた(仮に13306だったとして)場合には

php

1 try { 2 $db = new PDO('mysql:host=localhost;port=13306;dbname=csv_db;charset=utf8mb4', 'root', '', [ 3 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 4 PDO::ATTR_EMULATE_PREPARES => false, 5 ]); 6 var_dump($db) 7 } catch (PDOException $e) { 8 echo 'データベースに接続エラー' . $e->getMessage(); 9 exit(); 10 } 11

などとしてポート番号を与える必要があります。

投稿2019/04/12 07:59

編集2019/04/12 08:55
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bainary

2019/04/12 08:03

今確認して、追加しましたが上手くいきません。 そもそもPHPでデータベースに追加していく方法の記述が間違えているのでしょうか?
退会済みユーザー

退会済みユーザー

2019/04/12 08:22

new PDOするときの4つ目の引数、ドライバーズオプションを書くことで、接続時の例外を捉えてくれるはずです。
bainary

2019/04/12 08:25

var_dumpするとobject(PDO)#1 (0) { } と表記されました
退会済みユーザー

退会済みユーザー

2019/04/12 08:36

接続できてないですね。mysql接続周りを今一度点検してほしい。そして、普段mysqlを使わないので、どう点検すればいいかズバリはわからないけど、接続時のポート番号とか、ユーザー名やパスワードなどでしょうか。パソコンでテスト中なのであれば、ファイアウォールソフトやウイルス対策ソフトが遮断していないかも確認を。
bainary

2019/04/12 08:37

分かりました、ありがとうございます。 接続出来ていると、どのように表記されていくのでしょうか? カラムが表記されるのでしょうか?
退会済みユーザー

退会済みユーザー

2019/04/12 08:48

簡単に表記できないくらい様々なよくわからない文字列が表示されるはず。(かなり説明を省きました)
退会済みユーザー

退会済みユーザー

2019/04/12 08:49

どんな環境でも、DB接続でrootユーザーがパスワード空文字列で接続できたりはしないはず。
bainary

2019/04/12 08:51

xamppでは初期設定がrootユーザー、パスワードは空文字らしいです。 こちらにrootと指定すると、データベース接続エラーと表記されてしまいます。
退会済みユーザー

退会済みユーザー

2019/04/12 08:56

すると、あと、csv_dbなるデータベースは作成済みですね?
bainary

2019/04/12 08:57

csv_dbというデータベースはすでに作成済みです! テーブルにcsv_dataというものを指定してあります。。
退会済みユーザー

退会済みユーザー

2019/04/12 09:51

とにかく、「object(PDO)#1 (0) { }」と表示されるようではDB接続ができていません。apacheのerror_log(例えばC:\xampp\apache\logs)をアクセス時刻で絞り込んでエラー内容を確認してみてください。
guest

0

PHPでDBに関するエラーがでるときは接続時よりもSQL実行時のほうが多い。
ので、catchは最後まで引っ張ること。エラーはgetMessageだけじゃなく最初のうちは$eそのままvar_dump()してください。

php

1<?php 2 //DB名、ユーザー名、パスワード 3session_start(); 4try { 5 $db = new PDO('mysql:host=localhost;dbname=csv_db;charset=utf8mb4', 'root', '', [ 6 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 7 PDO::ATTR_EMULATE_PREPARES => false, 8 ]); 9 10// } catch (PDOException $e) { 11// echo 'データベースに接続エラー' . $e->getMessage(); 12// exit(); 13// } 14 15 $errorMessage = ""; 16 $signUpMessage = ""; 17 18 19 20 if (!empty($_POST["last_name"]) && !empty($_POST["first_name"]) && !empty($_POST["password"]) && !empty($_POST["password2"]) && $_POST["password"] === $_POST["password2"]) { 21 22 $id = $_POST['id']; 23 $last_name = $_POST['last_name']; 24 $first_name = $_POST['first_name']; 25 $last_name_kana = $_POST['last_name_kana']; 26 $first_name_kana = $_POST['first_name_kana']; 27 $password = $_POST['password']; 28 $email = $_POST['email']; 29 $company_name = $_POST['company_name']; 30 $department = $_POST['department']; 31 $postal_code_1 = $_POST['postal_code_1']; 32 $postal_code_2 = $_POST['postal_code_1']; 33 $pref = $_POST['pref']; 34 $address_1 = $_POST['address_1']; 35 $address_2 = $_POST['address_2']; 36 $tel_1 = $_POST['tel_1']; 37 $tel_2 = $_POST['tel_2']; 38 $tel_3 = $_POST['tel_3']; 39 $created_at = $_POST['created_at']; 40 $updated_at = $_POST['updated_at']; 41 42 $stmt = $db->prepare("INSERT INTO userData(name, password,value) VALUES (?, ?)"); 43 $stmt->execute(array($first_name,$last_name, password_hash($password, PASSWORD_DEFAULT))); 44 45 $id = $db->lastinsertid(); 46 $signUpMessage = '登録が完了しました。あなたの登録IDは '. $id. ' です。パスワードは '. $password. ' です。'; 47 } 48} catch (PDOException $e) { //←ここに移動 49 var_dump($e); 50 exit(); 51} 52

これでSQLの実行時エラーを拾うはず。

あと、PHPなどプログラムからではなくDBに対して直接ログイン、SQL実行して動作確認してからプログラムで使うこと。
PHPからしたらDBは外部の仕組みなので直接実行して動かないものはプログラムからも動きません。

パット見明らかなのは項目数が違う。

name, password,valueと3つカラムを用意しておきながら?, ?と2つしか用意していない。
2つしか用意していないのにarray($first_name,$last_name, password_hash($password, PASSWORD_DEFAULT)) 3つ値をセットしようとしている。
パラメータは過不足なく必ず一致させること。

あと、userDataテーブルの項目でnot nullで設定されているカラムがあったらそのカラムにきちんと値を入れないとエラーになるので、そこは用意したDB情報と実際にINSERTしようとしている情報を見比べること。
PHPから実行してPDOException 拾ったらその内容をきちんと確認すること。

投稿2019/04/12 08:19

編集2019/04/12 08:27
m.ts10806

総合スコア80765

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

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

bainary

2019/04/12 08:30 編集

Notice: Undefined index: id in C:\xampp\htdocs\entry.php on line 31 Notice: Undefined index: created_at in C:\xampp\htdocs\entry.php on line 48 Notice: Undefined index: updated_at in C:\xampp\htdocs\entry.php on line 49 これはデータが定義されてないよ、というエラーですよね? データベースには既存のデータをインポートしてあって、追加した順番でデータを格納していきたいのですがこれが上手くいかないです。。 調べているのですが、中々答えが見つかりません。
m.ts10806

2019/04/12 08:30

エラーを吐く設定にする必要があります。m6uさんが書かれている回答の一部を拝借して回答のコード部分修正しています。 回答に書いているようにDBは外部の仕組みです。エラーを「とる」ように設定が必要です。 何もしなければ何も吐きません。executeの結果がboolなのでvar_dump()すればfalseと返ってくるのでは? -------- $result = $stmt->execute(array($first_name,$last_name, password_hash($password, PASSWORD_DEFAULT))); if(!$result ){ echo "登録失敗"; } 念のためエラー表示ONにしておいてください。 https://qiita.com/shotets/items/3c95aef631b2c5eadae5
m.ts10806

2019/04/12 12:16 編集

あれ?コメント全く別の内容に変わってる。 それ単なるphpのエラーですよ。配列に存在しないキーを参照してるだけです。元を辿ればDBから情報を正しく取得できてないか存在しないかラムを指定してるか
guest

0

自己解決

そもそものPHPの記述がおかしかったので、一からファイルの作成を行った。

投稿2019/04/12 13:22

bainary

総合スコア58

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

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

m.ts10806

2019/04/12 13:35

この回答ではあとから同様の問題を抱えた人のなんの参考にもなりません。 自己解決としたいのでしたら具体的に記載してください。 https://teratail.com/help#resolve-myself
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問