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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

1929閲覧

$stmt->execute();がうまくいきません。

tetejiro

総合スコア15

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/01/29 19:59

編集2021/02/01 05:00

前提・実現したいこと

PHP初学者です。
データベースに会員の追加(登録)がしたいです。

※参考書ベースで学習しているのですが、オブジェクト指向は理解しておらず、
参考書でのコードを参考にそのままコードを書いている状況です。※

発生している問題・エラーメッセージ

try ~ catch で、catchの中身が表示され、データベースに登録ができません。
※$stmt->execute($data);が問題だと思われます。

該当のソースコード

php

1 try 2 { 3 $post=$_POST; 4 5//配列の値は表示されました。 6 print_r ($post); 7 8 $name=$post['name']; 9 $year=$post['year']; 10 $pass=$post['pass']; 11 $mail=$post['mail']; 12 13 require_once '../db.php'; 14 $dbh=new PDO($dsn,$user,$password); 15 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 16 17 $sql='INSERT INTO member(name,year,pass,mail) VALUES (?,?,?,?)'; 18 $stmt=$dbh->prepare($sql); 19 $data[]=$name; 20 $data[]=$year; 21 $data[]=$pass; 22 $data[]=$mail; 23 24print '23'; 25//この23というのは表示されました。 26 27 $stmt->execute($data); 28 29print '26'; 30// 〇この26は表示されませんでした。 31 32 $dbh=null; 33 34 } 35 catch (\Exception $e) 36 { 37 print 'ただいま障害によりご迷惑をおかけしております。'; 38 print '<form action="registration.html" method="post">'; 39 print '<input type="submit" value="戻る">'; 40 print '</form>'; 41 exit(); 42 }

MySQL

1-- テーブルの構造 `member` 2-- 3 4CREATE TABLE `member` ( 5`code` int(11) NOT NULL, 6`name` varchar(50) NOT NULL, 7`year` varchar(11) NOT NULL, 8`pass` varchar(32) NOT NULL, 9`mail` varchar(50) NOT NULL 10) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 11 12-- 13-- テーブルのデータのダンプ `member` 14-- 15 16INSERT INTO `member` (`code`, `name`, `year`, `pass`, `mail`) VALUES 17(1, 'tetejiro', '1', '47bce5c74f589f4867dbd57e9ca9f808', 'aaa@gmail.com'),

試したこと

上記にある通り、配列の値があることは確認できています。
$stmt->execute($data);がうまくいっていないと思うのですが、どうすればいいでしょうか、、
どうぞよろしくお願いいたします。

他のページではデータベースでの操作はできています。(ログインなど)

XAMPPを利用しており、MySQL , Apache を利用しています。

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

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

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

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

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

m.ts10806

2021/01/29 21:15 編集

コードやエラーはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/questions/238564 >ただいま障害によりご迷惑をおかけしております。 これは出たのでしょうか? 出ているとして、しかしながら捕捉したExceptionを受け取るだけで何も出してなければ何も原因分からないのではと。 「握りつぶす」と表現されています。(学習中、開発中ではありえない)
tetejiro

2021/01/31 19:23

お返事遅くなりすみません。 投稿方法教えていただいてありがとうございました。 try~catchの部分はcatchの中身の文言を何のエラーかというのを細かく記載して、 どの箇所のエラーか分かるようにしておくということでしょうか?
m.ts10806

2021/01/31 20:13

$eをvar_dumpするだけで良いです。
m.ts10806

2021/01/31 22:23

あと >※参考書ベースで学習しているのですが、オブジェクト指向は理解しておらず、 参考書でのコードを参考にそのままコードを書いている状況です。※ なら理解してから書きましょう。 としか言いようがなくなります。 プログラミングにおいて、このオブジェクト指向を全く理解してないまま進もうとするのは 「身につける気がない」と解釈されても仕方ないです。
tetejiro

2021/01/31 22:27

知らなかったです。ありがとうございます。 やってみまして、エラーの内容は "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY'" ( "SQLSTATE [23000]:整合性制約違反:1062キー 'PRIMARY'" ["string"のエントリ '0'が重複しています:) この箇所かなと思ったのですが、codeカラムをPRIMARYに設定していて、これは自動で割り振られるものだろうと思っていたので、自分でどう設定すればいいのか、よく分からず困っているのですが、どう対処すればいいのでしょうか? 念のため全文載せておきます。 object(PDOException)#3 (8) { ["message":protected]=> string(91) "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY'" ["string":"Exception":private]=> string(0) "" ["code":protected]=> string(5) "23000" ["file":protected]=> string(51) "C:\xampp\htdocs\portfolio\registration\reg-done.php" ["line":protected]=> int(23) ["trace":"Exception":private]=> array(1) { [0]=> array(6) { ["file"]=> string(51) "C:\xampp\htdocs\portfolio\registration\reg-done.php" ["line"]=> int(23) ["function"]=> string(7) "execute" ["class"]=> string(12) "PDOStatement" ["type"]=> string(2) "->" ["args"]=> array(1) { [0]=> array(4) { [0]=> string(15) "'aaa'" [1]=> string(13) "'1'" [2]=> string(44) "'9df62e693988eb4e1e1444ece0578579'" [3]=> string(25) "'bbb@gmail.com'" } } } } ["previous":"Exception":private]=> NULL ["errorInfo"]=> array(3) { [0]=> string(5) "23000" [1]=> int(1062) [2]=> string(37) "Duplicate entry '0' for key 'PRIMARY'" } } ただいま障害によりご迷惑をおかけしております。
m.ts10806

2021/01/31 22:29

テーブル定義どうなってますか? CREATE TABLE文で提示してください。
guest

回答2

0

$dbh=new PDO($dsn,$user,$password);
$dbh
$stmt=$dbh->prepare($sql);
$stmtが正常かどうか確認するために

php

1$dbh=new PDO($dsn,$user,$password); 2var_dump($dbh); 3// ~略~ 4$stmt=$dbh->prepare($sql); 5var_dump($stmt);

などとしてください、falseだったりしないでしょうか。

PDO接続に関しては、ベテランでも何度も読み返すこちらの記事を参考にすると良いです。
PHPでデータベースに接続するときのまとめ - Qiita

投稿2021/01/30 00:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tetejiro

2021/01/31 19:28

お返事ありがとうございます。遅くなってしまってすみません。 falseにはなりませんでした。 object(PDO)#1 (0) { } object(PDOStatement)#2 (1) { ["queryString"]=> string(56) というふうに表示されました。 お教えいただいたサイトはただいま見ています。 ひとつひとつ解説があるようなので、とても参考になります。 ありがとうございます。
guest

0

ベストアンサー

この箇所かなと思ったのですが、codeカラムをPRIMARYに設定していて、

PRIMARY KEYはあくまで「主キー制約」です。
単なる制約。ルールでしかありません。
この設定をしたからと勝手に一意な値を設定してくれるわけではありません。
自分で重複しないように払い出して設定するか、数値型のカラムならAUTO INCREMENTを指定することができます。
(MySQLの場合。ほかのDBだとシーケンスなど別途設定してnextする必要がある)。

エラー内容["string"のエントリ '0'が重複しています:)からするに、文字列型なのでしょう。
設計を変更できないのなら自分で払い出して設定するしかなさそうです。

入力を受け付けるのなら、念のためINSERT前に重複チェックは必要です。

投稿2021/01/31 22:32

編集2021/01/31 22:35
m.ts10806

総合スコア80852

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

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

tetejiro

2021/01/31 22:49

すみません。codeをAUTO INCREMENTにしています。の間違いでした。 テーブル自体はCUIではなくてGUIで作成したので、CREATE TABLUはないです。 手書きでよろしいでしょうか?すみません。 テーブル名 member カラム データ型 code int(11)      AUTO INCREMENT 主キーに設定 name varchar(50) year varchar(11) pass varchar(32) mail varchar(50) としています。
m.ts10806

2021/01/31 23:24

テーブル定義を正確に提示してください。CREATE TABLEです。
tetejiro

2021/02/01 00:20

名前  データ型   照合順序      属性  NULL デフォルト値 コメント その他 操作 1 code 主 int(11)         いいえ なし 2 name  varchar(50) utf8mb4_general_ci いいえ なし 3 year  varchar(11) utf8mb4_general_ci いいえ なし 4 pass  varchar(32) utf8mb4_general_ci いいえ なし 5 mail  varchar(50) utf8mb4_general_ci いいえ なし データベースからそのままコピーしてきたのですが、これで足りますでしょうか? 何度も回答いただいて本当にありがとうございます。
m.ts10806

2021/02/01 00:34 編集

CREATE TABLE文で提示してください。phpMyAdminなどツールならエクスポート機能があるはずです。 SQLとして出力すればこちらでもコピペで環境構築と確認してください。ただ、どのにもオートインクリメントの設定がないような
tetejiro

2021/02/01 00:56

最初は確かにAUTO INCREMENTに設定していたのですが、 AUTO INCREMENTが消えてしまっていたようです。 言っていただいて気づきました。ありがとうございます。 調べてみると、そのようなことが他の人もあったようで、 その案内通り、0番目を削除することで、無事に登録ができるようになりました。 https://saba.omnioo.com/note/627/mysql%E3%81%A7%E3%82%AA%E3%83%BC%E3%83%88%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/ この記事を参考にしました。 ただ、今度は登録したものが文字化けするようになってしまったので、 まだ完成ではないのですが、今回の登録できないという問題は無事に解決させることができました。 最後までお付き合いいただきまして、本当にありがとうございました。 大きな前進になりました。ご指摘いただいたオブジェクト指向はこれから勉強します。
m.ts10806

2021/02/01 01:08

CREATE TABLE文によるテーブル定義の確認と提示の仕方を覚えないことにはDB関係する質問に回答は付きづらくなるかと思います。 今から、やってください。
tetejiro

2021/02/01 01:40

-- テーブルの構造 `member` -- CREATE TABLE `member` ( `code` int(11) NOT NULL, `name` varchar(50) NOT NULL, `year` varchar(11) NOT NULL, `pass` varchar(32) NOT NULL, `mail` varchar(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -- テーブルのデータのダンプ `member` -- INSERT INTO `member` (`code`, `name`, `year`, `pass`, `mail`) VALUES (1, 'tetejiro', '1', '47bce5c74f589f4867dbd57e9ca9f808', 'aaa@gmail.com'), やってみました。エクスポートのファイルから皆さん見ているんですね、、勉強になりました。 これから質問するときは利用したいと思います。 文字化けの方も今から調べます。 改めてありがとうございました。
m.ts10806

2021/02/01 01:45

その内容は質問本文に追記を。 ツールによってはそのままCREATE文を見れますが、XAMPP利用ならphpMyAdminのエクスポートを使ったほうが早いと判断したまでです。phpMyAdminはMySQL専用なので、私は他のDBも参照できるツールをすすめます。 あくまで「回答者への配慮」の範囲ですね。再現確認できないと的確なアドバイスには繋がりませんから。 なので、質問者にも状況を具体的に伝えるコミュニケーションスキルは一定以上求められています。
tetejiro

2021/02/01 05:09

まだまだ他にも方法があるのですね、、調べてみたいと思います。 追記完了しました。教えていただいたことを活かして今度からは分かりやすく質問をしていきます。 ありがとうございました。
m.ts10806

2021/02/01 05:13

確認しました。 今回の件は、出ているエラーとテーブル定義が提示されていれば、すぐ回答がついて次に行けていました。 teratail見てると分かりますが、解決まで長引く人、もしくは解決しない人は、自分だけが持ってる情報が多い人です。 回答者への配慮を手抜きする人と言い切ってもいいかもしれません。 何を提示していいかわからない時は、持ってる情報全部提示することです。 再現確認のために相手に余計な補完を強いないこと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問