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

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

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

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

PHP

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

Q&A

解決済

1回答

1716閲覧

データベースへのデータの追加がうまくできません

newyee

総合スコア213

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/03/02 07:36

編集2019/03/02 09:28

PHPの学習としまして、会員制のサイトなどである、ユーザー新規登録画面及びその処理を作成してみたのですが、うまくデータベースにユーザー情報を追加することができません。

php

1<?php 2error_reporting(E_ALL); 3ini_set("display_errors",1); 4 5if(isset($_POST['name']) && isset($_POST['pass'])){ 6 7 //pwハッシュ化 8 $hash_pass = password_hash($_POST['pass'], PASSWORD_DEFAULT); 9 $name = $_POST['name']; 10 $dsn = 'mysql:host=localhost;dbname=online_bbs;charset=utf8'; 11 $user = 'root'; 12 $password = ''; 13 14 try{ 15 $db = new PDO($dsn,$user,$password); 16 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 17 $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 18 $stmt = $db->prepare(" 19 INSERT INTO users(name,password) 20 VALUES(:name,:pass) 21 "); 22 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 23 $stmt->bindValue(':pass',$hash_pass,PDO::PARAM_STR); 24 $stmt->execute(); 25  $stmt = $db->prepare(" 26 SELECT * FROM users WHERE name = :name AND password=:pass 27 "); 28 $stmt->bindValue(':name',$_POST['name'],PDO::PARAM_STR); 29 $stmt->bindValue(':pass',$hash_pass,PDO::PARAM_STR); 30 $stmt->execute(); 31 //正しく追加されていた場合セッション追加 32 $row = $stmt->fetch(); 33 var_dump($row); 34 if($row = $stmt->fetch()){ 35 36 $_SESSION['id'] = $row['id']; 37 38 session_regenerate_id(true); 39 header('Location: index.php'); 40 exit(); 41 42 }else{ 43 echo '登録に失敗しました'; 44 45 } 46 47 }catch(PDOExcption $e){ 48 die('エラー:' . $e->getMessage()); 49 } 50 51} 52 53?> 54 55 56<!DOCTYPE html> 57<html> 58<head> 59 <meta charset="utf-8"> 60 <title>user_create</title> 61</head> 62<body> 63 <form action="create_user.php" method="post"> 64 <p>名前:<input type="text" name="name"></p> 65 <p>パスワード:<input type="password" name="pass"></p> 66 <input type="submit" value="登録"> 67 </form> 68</body> 69</html>

上記コードは新規登録処理を行っているコードなのですが、「$row = $stmt->fetch();
var_dump($row);」ここの部分で、「bool(false)」となってしまい、データベースにユーザー名およびパスワードを追加できません。
下記画像は、ユーザー情報を追加するテーブル(users)です
イメージ説明
DBへの追加ができない原因が分からないため、ご助言頂けましたら幸いです。
よろしくお願いします。

追記です。
mysqlにて、コマンド「SELECT * FROM users」としましたら、以下のように表示されました。
イメージ説明
「DESC users」とすれば、全ての情報が表示されると思っていたのですが、勘違いでした...
取り敢えず、データベースへはデータの追加ができたので良かったです。

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

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

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

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

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

m.ts10806

2019/03/02 07:56

select文をセットされてないfetchが失敗するのは当然として、3rowと帰ってきていて「追加に失敗する」というのがよくわかりません。 デバッグをもっと密にされては。 というかfetchはなぜ入れたのでしょうか?
newyee

2019/03/02 08:40 編集

ご指摘ありがとうございます。 selectしていないと、fetchは失敗するのですね...恥ずかしながら知らなかったです... 「if($row = $stmt->fetch()){}」このように記述しました理由は、新しいユーザーの追加に成功したということは、ログインした状態であるということですので、セッションIDに、ユーザーIDを追加する必要があると思った為です。 その前の、fetchの文は、データベースへの追加が出来ていなかったため 、var_dumpにて確認する為でした。
newyee

2019/03/02 08:53

select文を追記してみまして、var_dumpにて値を確認しましたら、配列として、結果が出力されました。 質問文にて、select文の追記など、修正させていただきます。
m.ts10806

2019/03/02 08:58

回答しました。再度selectする必要はないです。
m.ts10806

2019/03/02 08:59

もし失敗していたらPDOException拾うはずですがそこはどうなんでしょうか。 何か出力されてませんか?var_dump( $e);のほうがいいかもしれません。
newyee

2019/03/02 09:39

追記しました。あ、今ご回答見させていただいたのですが、「lastinsertid」書き換えてみようと思います。 実は、データベースへの追加には成功したのですが、セッションの部分でエラーが出てしまっており、セッションの保存がうまくいっていない状況なですよね... 調べてみたのですが、そちらの方も実は解決できない状況な為、ご質問したいのですが、別途質問を立てた方がよろしいでしょうか..?
guest

回答1

0

ベストアンサー

fetchPDOStatementオブジェクトに関連付けられた結果セットから1行取得します
INSERT文自体は「何行インサートに成功したか」という結果セットを持っている(はず)
なので、今回の場合はもし取得できたとしても「1」とかでしょうね。

要件からすると「今インサートしたデータの自動採番のIDをとりたい」ようですので、
lastinsertid()が有用です。

が、

注意:

このメソッドは、異なる PDO ドライバ間で意味のあるもしくは 一貫性のある結果を返さないかも知れません。 構成しているデータベースが自動インクリメントフィールド、 もしくはシーケンスの概念をサポートしていないかも知れないためです。

とある通り、100%同じ結果を返すとは限らないので、
そこを確実に担保したければオートインクリメントではなくシステム側で払い出すのが良いです。

投稿2019/03/02 08:58

m.ts10806

総合スコア80765

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

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

newyee

2019/03/02 09:33

ご回答ありがとうございます。 結果セットというのは、そういう意味だったのですね。おかげで理解することができました。 セレクト文の方を追記しまして、fetchにて、取り出しましたら、配列の中に、データが入っていました。 教えて下さった、「lastinsertid」の方が良いでしょうか...?わざわざセレクト文を追記するのも、若干コードも見にくくなる気もしますね...
m.ts10806

2019/03/03 22:20

いえ、このケースはlastinsertidしかないです。 どうしても今追加したidをとりたければ回答の最後に書いたようにオートインクリメントやめてシステム側で指定したidを払い出す仕組みにするしかないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問