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

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

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

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

PHP

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

Q&A

解決済

2回答

3538閲覧

PHP データベースへのログインについて

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

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

0グッド

2クリップ

投稿2019/05/20 12:56

現在、「気づけばプロ並み PHP改訂版」(著 谷藤賢一)を使い、
ショッピングサイトの模擬サイトを作成中です。
現在、チャプター3章において、
商品をデータベースに追加しようとしていますが、
try部分を抜け、catch部分にいってしまい、
データベースにデータが蓄積されません。

ちなみに、チャプター2でも同様に名前等をデータベースに蓄積することができましたので、
mysqlへのアクセスはできていて、
sqlに間違いがあるのかと考えています。

サンプルソースをコピペして使ってみても、うまくいかない状況です。

質問に対して、不足している情報がありましたら、
ご指摘いただけましたら幸いです。

よろしくお願いします。

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

ただいま障害により大変ご迷惑をお掛けしております。

該当のソースコード

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ろくまる農園</title> </head> <body> <?php try { $pro_name=$_POST['name']; $pro_price=$_POST['price']; $pro_name=htmlspecialchars($pro_name); $pro_price=htmlspecialchars($pro_price); $dsn='mysql:dbname=shop;host=localhost;charset=utf8'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql='INSERT INTO mst_product(name,price) VALUES (?,?)'; $stmt=$dbh->prepare($sql); $data[]=$pro_name; $data[]=$pro_price; $stmt->execute($data); $dbh=null; print $pro_name; print 'を追加しました。<br />'; } catch(Exception$e) { print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } ?>

<a href="pro_list.php">戻る</a>

</body> </html>

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

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

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

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

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

m.ts10806

2019/05/20 13:05

コードはマークダウンのcode機能を利用してご提示ください
guest

回答2

0

ボリューミーですみません。

catch(Exception$e) { print'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); }

の箇所を一旦

catch(Exception $e) { echo $e->getMessage(); exit(); }

などとすれば、例外で捕まえた状況をhtml出力に込められるはず。

それと、パソコンの中で動作確認をしていて、
webサーバーがXAMPPのApacheであれば
C:\xampp\apache\logs
にあるであろう、error_logに手がかりがありそう。

それと、本に書いてないかもしれないけど、
webサーバーがXAMPPのApacheであれば
C:\xampp\php
にあるphp.iniにて、

display_errors = On

error_reporting = E_ALL

を書き加えるとエラー発生時にwebブラウザ上にエラーメッセージが表示されるようになるので
おすすめ。
PHPのエラー表示設定について - Qiita
にはphpコード内でini_set()にて指定する方法も紹介されているけど、
phpコードの文法エラーがあるとき困るので、なるべくphp.iniや.htaccessに記述する方法をお試しください。

テーブルmst_productは存在するか、
カラム名name,priceは存在するか、
カラム名nameは文字列型だと察すると格納可能なサイズを超えていないか、
カラム名priceは数値型だと察するに数値として扱えない記号を含んでいないか、
省略しているカラム名があるならそれらにはautoincrement指定やdefault指定があるか、
などの確認もどうぞ。

で、老婆心ながら。
写経したコードがベストプラクティスだとは言い切れない。

$pro_name=htmlspecialchars($pro_name); $pro_price=htmlspecialchars($pro_price);

htmlspecialcharsって、
html出力用に加工するものであって、
データベースに格納するデータに使うべきではないのです。
例えば&→&amp;とか”→&quot;とか(正確にはすべて半角記号です)に置き換えてしまうので、
データベースでSELECT文を実行するときに「&」を含むつもりで検索すると「"」も引っかかってきます。
「何故htmlspecialcharsを通すのか?」を一言でどうぞ - Qiita
を読んで理解していただけたなら、
PHP で h() を書くなら一緒に echo しよう。 - こせきの技術日記
を読んでこちらのやり方で使ったほうが良いかと提案します。

投稿2019/05/20 13:02

編集2019/05/20 13:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/05/20 13:43

ご丁寧なご返信ありがとうございます!! 現在はMAMPを使っていましたが、 今後の為にも、エラー表示されるように、 自分なりに調べてみます。 そして、htmlspecialcharsについてもお教えいただき、 ありがとうございます!! データベースに格納するときは、 また、別の手法を使うべきなのですね。 理解できるよう、いただいた記事をじっくり読んでみます!
退会済みユーザー

退会済みユーザー

2019/05/20 13:56

PDO経由でデータベースに格納するのであれば、データベース向けのエスケープ処理はPDOに任せるものです。そのためにbindValue https://www.php.net/manual/ja/pdostatement.bindvalue.php を駆使してプレースホルダーに最適なエスケープがかかるようにします。
guest

0

ベストアンサー

tryしないでコードをかけば何行目でどんなエラーかが表示されますよ

//try //{ $pro_name=$_POST['name']; $pro_price=$_POST['price']; ~中略~ $stmt->execute($data); $dbh=null; print $pro_name; print 'を追加しました。<br />'; //} //catch(Exception$e) //{ //print'ただいま障害により大変ご迷惑をお掛けしております。'; //exit(); //}

投稿2019/05/20 13:08

hentaiman

総合スコア6419

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

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

退会済みユーザー

退会済みユーザー

2019/05/20 13:38

ご返信ありがとうございます!! こちらを試させていただき、エラーメッセージより、 本には記載がなかったのですが、 name、priceカラム以外のカラムでdefault設定したところ、 無事にデータベースに追加することができました!! 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問