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

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

解決済

3回答

2191閲覧

PHPからMySQLにデータが一部登録されない

snustya

総合スコア13

MySQL

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

phpMyAdmin

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

PHP

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

0グッド

0クリップ

投稿2019/02/19 02:31

編集2019/02/19 06:24

前提・実現したいこと

PHPからMySQL(InnoDB)にデータを登録したいです。

Windowsで、
XAMPP 7.3.2(PHP 7.3.2)を使用しています。

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

下記PHP文でデータを登録したいのですが、
pro_add_done.php$pro_nameの値が反映されない
pro_add_check.php内で"hidden"で渡しているはずのnameの値が、
テーブルmst_productのフィールドnameに登録されない
という状況に陥っており、これを解決したいです。

phpMyadmin上から直接SQL文を打ち込むと登録はされます。

問題カ所が見つけることが出来ず、ご意見伺えれば幸いです。
※超初心者で「気付けばプロ並みPHP改訂版」を見ながらやっております。

pro_add.html

html

1<!DOCKTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>ろくまる農園</title> 6</head> 7 8<body> 9 商品追加<br> 10 <br> 11 <form method="post" action="pro_add_check.php"> 12 商品名を入力してください。<br> 13 <input type="text" name="name" style="width:200px"><br> 14 価格を入力してください。<br> 15 <input type="text" name="price" style="width:50px"><br> 16 <br> 17 <br> 18 <input type="button" onclick="history.back()" value="戻る"> 19 <input type="submit" value="登録"> 20 </form> 21</body> 22</html>

pro_add_check.php

php

1<!DOCKTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>ろくまる農園</title> 6</head> 7 8<body> 9<?php 10$pro_name = $_POST['name']; 11$pro_price = $_POST['price']; 12$pro_name = htmlspecialchars($pro_name,ENT_QUOTES,'UTF-8'); 13$pro_price = htmlspecialchars($pro_price,ENT_QUOTES,'UTF-8'); 14 15if($pro_name == '') { 16 echo '商品名が入力されていません。<br>'; 17} else { 18 echo '商品名:'; 19 echo $pro_name; 20 echo '<br><br>'; 21} 22if(preg_match('/\A[0-9]+\z/', $pro_price) == 0) { 23 echo '価格をキチンと入力してください。<br>'; 24} else { 25 echo '価格:'; 26 echo $pro_price; 27 echo '円<br><br>'; 28} 29 30if($pro_name = '' || preg_match('/\A[0-9]+\z/', $pro_price) == 0) { 31 echo '<form><br>'; 32 echo '<input type="button" onclick="history.back()" value="戻る">'; 33 echo '</form>'; 34} else { 35 echo '上記の商品を追加します。<br><br>'; 36 echo '<form method="post" action="pro_add_done.php">'; 37 echo '<input type="hidden" name="name" value="'. $pro_name .'">'; 38 echo '<input type="hidden" name="price" value="'. $pro_price .'">'; 39 echo '<input type="button" onclick="history.back()" value="戻る">'; 40 echo ' <input type="submit" value="登録">'; 41 echo '</form>'; 42} 43?> 44 45</body> 46</html> 47

pro_add_done.php

php

1<!DOCKTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>ろくまる農園</title> 6</head> 7 8<body> 9<?php 10try { 11 $pro_name = $_POST['name']; 12 $pro_price = $_POST['price']; 13 $pro_name = htmlspecialchars($pro_name,ENT_QUOTES,'UTF-8'); 14 $pro_price = htmlspecialchars($pro_price,ENT_QUOTES,'UTF-8'); 15 16 $dsn = 'mysql:dbname=shop;host=localhost;charset=utf8'; 17 $user = 'root'; 18 $password = '1234567890'; 19 $dbh = new PDO($dsn,$user,$password); 20 $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 21 22 $sql = 'INSERT INTO mst_product (name,price) VALUES (?,?)'; 23 $stmt = $dbh->prepare($sql); 24 $data[] = $pro_name; 25 $data[] = $pro_price; 26 $stmt->execute($data); 27 28 $dbh = null; 29 30 echo $pro_name; 31 echo 'を追加しました。<br>'; 32} 33catch(Exception $e) { 34 echo 'ただいま障害によりご迷惑をおかけしております。'; 35 exit(); 36} 37 38?> 39 40<a href="pro_list.php">戻る</a> 41</body> 42</html> 43

その他設定

host:localhost
user:root
password:1234567890

phpMyadmin管理画面では、
「サーバ: 127.0.0.1」←ここがlocalhostになっていないことが気になってもいます。
「データベース:shop」
「テーブル:mst_product」
となっています。

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

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

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

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

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

FKM

2019/02/19 02:37

hiddenはhtmlを見ないとなんともいえませんので、formタグで囲ったフォーム部品を見せてください
m.ts10806

2019/02/19 02:54

pro_add_done.php とされるコードが2回提示されています。 正しいファイル名に修正願います。
m.ts10806

2019/02/19 02:55

あとphpMyadminよりエクスポート機能を使うか何かして shopテーブルのCRETE TABLE文をご提示願います。テーブル構造が分からないことには再現確認も難しいです。
guest

回答3

0

ベストアンサー

php

1if($pro_name = '' || preg_match('/\A[0-9]+\z/', $pro_price) == 0) {

ここで
$pro_name = ''
$pro_nameのデータが書き変わっています

php

1if($pro_name == '' || preg_match('/\A[0-9]+\z/', $pro_price) == 0) {

投稿2019/02/19 02:56

date

総合スコア1820

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

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

snustya

2019/02/19 06:42

ご指摘いただき有難う御座います。 完全に見逃しておりました…。 修正したところ、無事にデータベースに登録されるようになりました。
guest

0

直接の回答ではないですがm6uさんとは他で気になった箇所があります

php

1} 2catch(Exception $e) { 3 echo 'ただいま障害によりご迷惑をおかけしております。'; 4 exit(); 5}

せっかくExceptionを拾ったのにその中身を確認せずに独自のメッセージを出していては、何か起きたときに原因究明できません。
またPDOを使われているのでしたらPDOExceptionを捕捉するのが通例かと思います。

画面に出したくないのであればログファイルに出力するなどで
必ずどこかで確認できるようにコーディングしてください。

上記に近いです。

投稿2019/02/19 04:18

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2019/02/19 04:55

catch PDOException の後 catch Exception っていうサンプルコードをどこかで見かけた気がする
m.ts10806

2019/02/19 04:59

きっと何か意図があるんでしょう・・。たぶん、、
退会済みユーザー

退会済みユーザー

2019/02/19 05:02

PDOException で拾うとDBアクセス絡みの情報を拾いやすいけど、 PDOException から見て上位クラスである Exception だとDBに関係ないものまで含むから、エラーの切り分けがしやすくなるのだろうか?
m.ts10806

2019/02/19 05:03

中に書いてある処理次第かもしれませんね。 PDOException を捕捉するようなtry-catchでPDO関係以外を含むってあんまりなさそうですけど。 それだったらもうちょっと上位の処理で包括して拾ってあげたほうがいい気がします。
snustya

2019/02/19 06:44

ご回答ありがとうございます。 PDOExceptionに関して、参考書通りに進めていたただけでしたので、全く気に留めておりませんでした。 教えて頂いた情報を参考に、今後対処するようにしたいと思います。
m.ts10806

2019/02/19 06:47

参考書も結構ですが、必ずPHPマニュアルを並行して機能確認するようにしてください。それだけで理解が何倍も深まります。
guest

0

まず最初に、htmlspecialchars()の使い方が適切ではないです。
html出力するときにエスケープさせるための関数なので、
データベース格納用変数にhtmlspecialchars()でエンコードしたデータをもたせてはいけません。
echoする直前に使うために、例えば
PHPのhtmlspecialcharsでのHTMLエンティティ化と、一文字に簡略化方法
みたいな工夫をします。

投稿2019/02/19 02:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

snustya

2019/02/19 06:40

貴重な情報ありがとうございます。 大変勉強になりました。 「データベース格納用変数にhtmlspecialchars()でエンコードしたデータをもたせてはいけない」 という点については、参考書通りに進めていたため特に疑いもしていませんでした…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問