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

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

解決済

1回答

1350閲覧

データベースにINSERTされない

moka_late

総合スコア1

MySQL

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

phpMyAdmin

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

PHP

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

0グッド

0クリップ

投稿2020/08/05 13:56

編集2020/08/06 08:09

phpでmysqlのデータベースに以下の内容を登録したいと考えています。
・テーブル名「user_data」にidを登録
・テーブル名「test_data」~「jumacle2」のsub_idに「user_data」のidを登録

しかし、データベースを確認したところ、user_dataにはidが登録されず、test_dataにのみデータが入っている状態です。

(ちなみに気づけばプロ並みPHPを見ながら書いています。)

元々user_dataにのみデータが入り、test_dataには入らない状態だったので色々と書き換えては戻しを繰り返した結果、いつの間にか逆転してしまいました。

```php <?php ini_set("display_errors", "On"); ?> <!doctype html> <html lang="ja"> <head> <meta charset="utf-8"> <title>心理学実験|登録完了</title> <style type="text/css"> body{ text-align:center; margin-top:100px; } input[type="submit"]{ width:100px; height:50px; font-size:18px; } input[name="id"]{ width:200px; height:30px; font-size:28px; margin-bottom:50px; } </style> </head> <body> <?php try { $sub_id = $_POST['id']; $sub_id = htmlspecialchars($sub_id); $dsn = 'mysql:dbname=root;host=localhost:3306'; $user = 'root'; $password = ''; $dbh = new PDO($dsn, $user, $password); $dbh->query('SET NAMES utf8'); $sql = 'INSERT INTO user_data(id) VALUES(?)'; $stmt = $dbh->prepare($sql); $data[] = $sub_id; $stmt->execute($data); $sql = 'INSERT INTO test_data(sub_id) VALUES(?)'; $stmt = $dbh->prepare($sql); $stmt->execute($data); $dbh = null; echo $sub_id; echo 'を登録しました。<br/>'; echo '間違いがなければもう一度IDを入力し、事前調査へ進んでください。'; echo '<br/>'; echo '<form method="post" action="sub_login_check.php">'; echo '<br/>'; echo '<input type="text" name="id">'; echo '<input type="submit" value="OK">'; echo '<input type="button" onclick="history.back()" value="戻る">'; echo '</form>'; echo '<a href="sub_login.html">ログイン画面へ</a>'; } catch(Exception $e) { echo 'ただ今障害により大変ご迷惑をおかけしています。'; echo exit(); } ?> </body> </html>

修正後
エラー文として
There is no active transaction
が表示されるようになりました。

<?php try { $sub_id = $_POST['id']; $dsn = 'mysql:dbname=tachibanastudy;host=localhost;port=3306;charset=utf8'; $user = 'tachibanastudy'; $password = 'Ovu21176'; $dbh = new PDO($dsn, $user, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, ]); $sql = 'INSERT INTO user_data(id) VALUES(?)'; $stmt = $dbh->prepare($sql); $data[] = $sub_id; $stmt->execute($data); $sql = 'INSERT INTO test_data(sub_id) VALUES(?)'; $stmt = $dbh->prepare($sql); $stmt->execute($data); $dbh->commit(); $dbh = null; echo $sub_id; echo 'を登録しました。<br/>'; echo '間違いがなければもう一度IDを入力し、事前調査へ進んでください。'; echo '<br/>'; echo '<form method="post" action="sub_login_check.php">'; echo '<br/>'; echo '<input type="text" name="id">'; echo '<input type="submit" value="OK">'; echo '<input type="button" onclick="history.back()" value="戻る">'; echo '</form>'; echo '<a href="sub_login.html">ログイン画面へ</a>'; } catch(Exception $e) { echo $e->getMessage(); }; ?>

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

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

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

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

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

Orlofsky

2020/08/05 15:33

>気づけばプロ並みPHP 貴殿がまっとうなプログラマーになりたいなら、即捨てましょう。
moka_late

2020/08/06 08:17

他の方からも同じようなご意見をいただいたのですが、 そんなにもこの本は参考にならないのでしょうか? (導入書として購入しましたが、確かに発行された年が古かったりと万能ではないとは感じております。)
guest

回答1

0

ベストアンサー

片っ端から気になったところを指摘させていただきます。

php

1$sub_id = $_POST['id']; 2 3$sub_id = htmlspecialchars($sub_id);

なぜhtmlspecialchars()で加工するかわかっていますか?
PHP: htmlspecialchars - Manual
「何故htmlspecialcharsを通すのか?」を一言でどうぞ - Qiita
この関数を使うのは、HTML出力するときに差し支えのある記号を適切に表示するためのものです。
なんでもかんでも、闇雲に加工すればいいというものではありません。
html出力直前に加工するべきで、変数に保持する間は生の値で保持するべきです。

php

1$dsn = 'mysql:dbname=root;host=localhost:3306';

ポート番号の指定の仕方が間違っています。
PHP: PDO_MYSQL DSN - Manual
ポート番号を指定するときは port:3306

php

1$dsn = 'mysql:dbname=root;host=localhost;port=3306;charset=utf8'; 2//$dsn = 'mysql:dbname=root;host=localhost;port=3306;charset=utf8mb4';

などとするべきかと。一緒にcharsetを指定することで

php

1$dbh->query('SET NAMES utf8');

をまるごと省くことができます。

それと、$driver_optionsも指定するとよりよいかと。

php

1$dbh = new PDO($dsn, $user, $password, [ 2 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 3 PDO::ATTR_EMULATE_PREPARES => false, 4]);

try~catchを使ってデータベース利用時の例外を捉えて、
エラー対策を強化できます。
詳しくは、こちらをしっかり目を通してください。
PHPでデータベースに接続するときのまとめ - Qiita

トランザクション処理が見受けられません。
オートコミットされる接続方式を取らない限り、
明示的にコミット処理を呼ばないとデータベースに反映されません。

PHP: PDO::commit - Manual

php

1 2$dbh->commit(); 3$dbh = null;

まぁ、「気づけばプロ並みPHP」って本から離れて、
より現代的な正しい事例を学んでいただきたいところです。
データベース利用に関しては、回答内に示したドキュメントが大事なことをまとめてあるので、
私も繰り返し読んでいます。

投稿2020/08/05 14:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

moka_late

2020/08/06 08:15

ご指摘ありがとうございました。 アドバイスをもとに修正し、エラーメッセージを表示させたところ There is no active transaction と表示されました。これはどこに問題があるのでしょうか?
退会済みユーザー

退会済みユーザー

2020/08/07 12:36 編集

INSERT文など一つも実行していない状況で、コミットするとそうなります。 ifブロックの分岐条件など点検してみてください。 それ以上は、修正後の全体のコードを見ないとなんとも言えません。 (このコメント欄に書かずに、質問文を修正して、元のを残して追記してください。)
moka_late

2020/08/09 09:41

commit();をとったところエラーが消え、なぜかデータが追加されるようになりました。 根本的なところは解決できていないのかもしれませんが、ポートの書き方やコミット等は非常に勉強になりました。ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/08/09 13:06

へんてこな書籍よりも、 回答内に示したデータベースに接続するときのまとめ、を 読んでもらった方がモダンで確実です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問