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

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

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

phpPgAdminは、PHPで作成された複数のPostgreSQLデータベースをブラウザから簡単に管理・操作できるツール。テーブルの作成や参照を始め、データのバックアップやリストアといった操作が可能になります。

MySQL

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

PHP

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

Q&A

解決済

1回答

473閲覧

うまくphpが動作しない

syuuuuuu

総合スコア2

phpPgAdmin

phpPgAdminは、PHPで作成された複数のPostgreSQLデータベースをブラウザから簡単に管理・操作できるツール。テーブルの作成や参照を始め、データのバックアップやリストアといった操作が可能になります。

MySQL

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

PHP

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

0グッド

0クリップ

投稿2022/08/27 12:35

前提

ここに質問の内容を詳しく書いてください。
「気づけばプロ並みphp 改訂版」という教材を進めており、上手くプログラミングが動作しません。ただいま障害により大変ご迷惑をお掛けしております。というメッセージがしか出ず困っています。テンプレ自体もあるのでプログラム自体は間違っていないと思います。開発環境はmampです。マックです。

実現したいこと

・エラーが出ないようにする

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

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

該当のソースコード

php

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

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

syuuuuuu

2022/08/27 12:36

リンクに飛ぶ前のコードです。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ろくまる農園</title> </head> <body> <?php $staff_name=$_POST['name']; $staff_pass=$_POST['pass']; $staff_pass2=$_POST['pass2']; $staff_name=htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8'); $staff_pass=htmlspecialchars($staff_pass,ENT_QUOTES,'UTF-8'); $staff_pass2=htmlspecialchars($staff_pass2,ENT_QUOTES,'UTF-8'); if($staff_name=='') { print 'スタッフ名が入力されていません。<br />'; } else { print 'スタッフ名:'; print $staff_name; print '<br />'; } if($staff_pass=='') { print 'パスワードが入力されていません。<br />'; } if($staff_pass!=$staff_pass2) { print 'パスワードが一致しません。<br />'; } if($staff_name=='' || $staff_pass=='' || $staff_pass!=$staff_pass2) { print '<form>'; print '<input type="button" onclick="history.back()" value="戻る">'; print '</form>'; } else { $staff_pass=md5($staff_pass); print '<form method="post" action="staff_add_done.php">'; print '<input type="hidden" name="name" value="'.$staff_name.'">'; print '<input type="hidden" name="pass" value="'.$staff_pass.'">'; print '<br />'; print '<input type="button" onclick="history.back()" value="戻る">'; print '<input type="submit" value="OK">'; print '</form>'; } ?> </body> </html>
guest

回答1

0

ベストアンサー

shopデータベースにmst_staffテーブルは作られていますか?
見た感じ、ソースコードに不具合はなさそうな気がするので、もしかしたらデータベースやテーブルが作られていないのでは?と思いました。
あとmst_staffテーブルに「name」「password」カラムがない場合もエラーになります。

 
try-catchをしているのであれば、今回のようにエラーが起きた時は、

PHP

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

と言うように、catch内で var_dump($e); を入れてみてください。そうするとなぜエラーになっているのか?が分かります。

その他気になった点としては、「リンクに飛ぶ前のコード」をみると、<input type="hidden"> はありましたが、<input type="text">は見当たらなかったのです。
氏名やパスワードを入力するフォームがないと思うのですが、「リンクに飛ぶ前のコード」で氏名やパスワードを入力する構成であれば、入力値がないまま staff_add_done.php に遷移してしまうのも、原因の一つかもしれません。

投稿2022/08/27 21:32

編集2022/08/27 21:40
meex

総合スコア55

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

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

syuuuuuu

2022/08/29 12:06

ご回答ありがとうございます。返信遅れて大変申し訳ありません。var_dump($e);を入力してみ所、 object(PDOException)#2 (8) { ["message":protected]=> string(85) "SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)" ["string":"Exception":private]=> string(0) "" ["code":protected]=> int(1045) ["file":protected]=> string(50) "/Applications/MAMP/htdocs/staff/staff_add_done.php" ["line":protected]=> int(23) ["trace":"Exception":private]=> array(1) { [0]=> array(6) { ["file"]=> string(50) "/Applications/MAMP/htdocs/staff/staff_add_done.php" ["line"]=> int(23) ["function"]=> string(11) "__construct" ["class"]=> string(3) "PDO" ["type"]=> string(2) "->" ["args"]=> array(3) { [0]=> string(45) "mysql:dbname=shop;host=localhost;charset=utf8" [1]=> string(4) "root" [2]=> string(0) "" } } } ["previous":"Exception":private]=> NULL ["errorInfo"]=> array(3) { [0]=> string(5) "HY000" [1]=> int(1045) [2]=> string(62) "Access denied for user 'root'@'localhost' (using password: NO)" } } ただいま障害により大変ご迷惑をお掛けしております。 というメッセージが出ました。
syuuuuuu

2022/08/29 12:17

catch (Exception $e) { var_dump($e); print 'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } の部分を打たないと白紙のページが出力されます。参考書に書いてある通りの文章なのでコードは間違っていないです。なにか環境がおかしいのでしょうか。
syuuuuuu

2022/08/29 12:18

<input type="text">に関してはもう一つ前の画面で入力しています。
meex

2022/08/29 13:06

実行していただいたのですね、ありがとうございます。 プログラミングを勉強中とのことなので、  ①エラーの発生源を調べられるようになる  ②エラーの解決法を調べられるようになる という点を中心に話していきます。 まず、①のエラーの発生源を調べる方法についてですが、これは上記でお話しした通りtry{}catch (Exception $e){var_dump($e);}を書くことで調べることができましたね。 次に、②のエラーの解決法を調べる方法についてです。 var_dumpで出力したエラーの中で「SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)」の部分があるかと思います。この部分が解決への糸口になります。 英語なのでなかなか直感的ではなく、分かり辛いかもしれませんが、この文章をコピーして、Google検索してみてください。 そうすると、解決法を書いているブログや質問サイトを見つけることができます。 私が検索したところ、同様のエラーで投稿してる質問が見つかりました。 【SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)を解決できない / https://teratail.com/questions/269048 】 この記事を見る限りだと、パスワードが間違っていることが原因=環境の設定ミスが原因とのことらしいですね。 なので、一度、ご自身のデータベースの構成を見直してみてください。 ---補足1--- catch (Exception $e) { var_dump($e); print 'ただいま障害により大変ご迷惑をお掛けしております。'; exit(); } を打たないと白紙になるのは正常です。catch(){}はtry{}内で何か異常があった時に実行されるものです。そのため、catch自体がなければ白紙の画面になります。 学習している最初の内は、どこでエラーになっているのかイメージが付きにくいと思うので、catch (Exception $e){var_dump($e);}を書く癖を付けておくことを、私はオススメします。 ---補足2--- 念のため記載しますが、var_dump()は引数に渡された変数の中身を出力するという機能があるだけで、エラー内容を見る専門ではないです。 $aaa = 10; var_dump($aaa); とすればInt型の「10」が出力されますし、 $bbb = "あいう"; var_dump($bbb); とすればString型の「あいう」が出力されます。 今回で言うと、Throwable型の変数$eを引数に設定しているため、$eの中身であるエラー内容を出力した。という流れです。
syuuuuuu

2022/08/29 16:40

ご丁寧にありがとうございます。おっしゃる通り、hostとpasswordを変更することによって出来ました。 様々なアドバイスまでありがとうございます。一人で勉強するのに挫折しそうだったのですがmeexさんのおかげでまた頑張ろうと思えました!本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問