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

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

ただいまの
回答率

87.59%

PHP データベース(xamppのmysqlです)にデータが保存できないようでプログラミングの目的と意図しない遷移画面になります。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 470

score 1

ここに質問の内容を詳しく書いてください。
現在、気づけばプロ並みPHP 改訂版をしております。

名前やパスワードを入力した情報をデータベースに追加保存して完了するという段階のテキストなのですが、
try{
}
catch{
}
の処理により本来ならデータベースに登録されるはずなのですが、強制的に
「ただいま障害により大変ご迷惑をお掛けしております。」という文言が出てしまいます。

現在、ファイルを3つ作成してそれぞれかなりの時間を費やして確認したのですが、誤りなどはないように思います。

もしもデータベースになんらかの原因があるならばどのように対処をすれば良いか、またソースコードに何か修正するような箇所がありましたら教えていただきたいのですがよろしくお願いいたします。

名前とパスワードが入力されていたらその情報をデータベースに追加、もしデータベースに障害などあれば予め用意していた文言が出ます。

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

ボールドテキスト
編集の追記です。
エラーは、issetが無ければ、
Notice: Undefined index: name in C:\xampp\htdocs\staff\staff_add_done.php on line 15

Notice: Undefined index: pass in C:\xampp\htdocs\staff\staff_add_done.php on line 16
と、出ます。
もう一つは下記です。

SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)と表示されています。

### ヘディングのテキスト

該当のソースコード

PHP
一番最初のファイルです。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>中村農園</title>
</head>
<body>
  スタッフ追加<br/>
  <br/>
  <form method="post" action="staff_add_check.php">
    スタッフ名を入力してください。<br/>
    <input type="text" name="name" style="width:200px"><br/>
    パスワードを入力してください。<br/>
    <input type="password" name="pass" style="width:100px"><br/>
    パスをもう一度入力してください。<br/>
    <input type="password" name="pass2" style="width:100px"><br/>
    <br/>
    <input type="button" onclick="history.back()" value="戻る">
    <input type="submit" value="OK">
</form>

</body>
</html>```html  

これが2番目のファイルです。  

コード  

PHP <?php

$staff_name=$_POST['name']; $staff_pass=$_POST['pass']; $staff_pass2=$_POST['pass2'];

$staff_name=htmlspecialchars($staff_name); $staff_pass=htmlspecialchars($staff_pass); $staff_pass2=htmlspecialchars($staff_pass2);

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>

こちらが3つめのファイルです。  

ここで本来ならばデータベースに登録されてstaff_list.phpというファイルに行くために戻るのボタンとリンクの表示が出るはずなのですが、エラートラップによりうまくいきません。  

<!DOCTYPE html>  
<html lang="ja">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>中村農園</title>  
</head>  
<body>  

PHP コード

<?php  


try  
{  

$staff_name=isset($_POST['name']);  
$staff_pass=isset($_POST['pass']);  

$staff_name=htmlspecialchars($staff_name);  
$staff_pass=htmlspecialchars($staff_pass);  

$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_staff (name,password) VALUES (?,?)';  
$stmt=$dbh->prepare($sql);  
$data[]=$staff_name;  
$data[]=$staff_pass;  
$stmt->execute($data);  

$dbh=null;  

print $staff_name;  
print 'さんを追加しました。<br />';  

}  
catch (Exception $e)  
{  
print $e->getmessage();  
exit();  
}  

?>  

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

?>  
</body>  
</html>  

PHP

試したこと

$staff_name=isset($_POST['name'])
$staff_pass=isset($_POST['pass'])

issetを付けました。これが無ければ、”未定義のインデックス”とエラーが出ていました。

それて下記です。

catch (Exception $e){

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

$e->getMessage();
exit();
にしてみたのですが、PHPからデータベース接続の

$dsn='mysql:dbname=shop;
host=localhost;charset=utf8';
$user='root';
$password='';←ここに問題があるというようなエラー回答が出ました。
$dbh=new PDO($dsn,$user,$password)
;

教材では特にデータベースへのuser登録やパスワードの登録の指示はありませんでした。

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

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

ググって同じような問題で行き詰っている方の質問も見たのですがなかなか解決の糸口が見つかりません。

myadminからは教材の指示で1度レコードの追加はしておりましてそれは確認して入っております。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tanat

    2020/10/22 19:10

    ←ここに問題があるというようなエラー回答が出ました。
    について正確なエラーを質問文に追記して下さい。

    キャンセル

  • tanat

    2020/10/22 19:15

    ソースコードは```PHP ```で囲ってください。
    こんな感じ
    ```PHP
    echo "test";
    ```

    また、
    $staff_name=isset($_POST['name'])
    $staff_pass=isset($_POST['pass'])
    については文末のセミコロンが実際のコードにはついているのではありませんか?
    今動かしているコードをそのままコピーしてください。

    キャンセル

  • m.ts10806

    2020/10/22 20:13

    コードやエラーはマークダウンのcode機能を利用してご提示ください。
    https://teratail.com/questions/238564

    キャンセル

  • m.ts10806

    2020/10/22 20:31

    あと「xzmpp」とは何でしょうか。

    キャンセル

回答 1

+2

前置き

気づけばプロ並みPHP 改訂版は残念ながら初学者向きとは言えない記述が多いので別の書籍やweb教材に変更されることを強くお勧めします。
teratail内で書籍名で検索
staff_add_check.php
上記質問の多くの場合でそもそもデバッグが出来ない残念なコードが原因になっています。

また、改訂版に関してはサンプルコードのダウンロードも出来ないような・・・
少なくとも誤りのないコードと比較できないような教材はキツいですね。

回答

編集の追記です。
エラーは、issetが無ければ、
Notice: Undefined index: name in C:\xampp\htdocs\staff\staff_add_done.php on line 15

Notice: Undefined index: pass in C:\xampp\htdocs\staff\staff_add_done.php on line 16

は恐らく

$staff_name=isset($_POST['name']);  
$staff_pass=isset($_POST['pass']);  

$staff_name=htmlspecialchars($staff_name);  
$staff_pass=htmlspecialchars($staff_pass);  

$staff_name=htmlspecialchars($_POST['pass']);  
$staff_pass=htmlspecialchars($_POST['name']);  


となっているはずで、noticeが出るのはフォームからPOSTせずに直接アクセスしたようなケースだと思います。

SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)

に関しては、

$dsn='mysql:dbname=shop;host=127.0.0.1;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password)


としてみて駄目なら

  • xampp mariadb パスワード変更あたりで検索してパスワードを設定して、設定したパスワードを$passwordに代入する

もしくは、xamppをインストールしなおす

あたりかなと思います。
色々試行錯誤しているうちにrootのパスワードを設定しちゃったとかないでしょうか?

ただ、繰り返しになりますが、最新のサンプルコードが取得出来ないような教材を使っても苦労するだけなので、別の教材を探すことをお勧めします。

以下、質問修正前の回答

ただ、今回のケースだと少なくとも

$staff_name=isset($_POST['name'])
$staff_pass=isset($_POST['pass'])


$staff_name=isset($_POST['name']);
$staff_pass=isset($_POST['pass']);


としないと文法エラーでそれより先に進めないですし(あったらあったで別の問題が出るコードなので前後と合わせて元のコードに戻す必要がありますが)

$dsn='mysql:dbname=shop;
host=localhost;charset=utf8';
$user='root';
$password='';←ここに問題があるというようなエラー回答が出ました。
$dbh=new PDO($dsn,$user,$password)
;


$dsn='mysql:dbname=shop';
$host='localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password)
;


としないとDB情報が誤ったことになります。(実際に動かしているコードと違うのであれば知りませんが)

この辺は人力で何とかするというよりは開発環境でチェックする方が確実で速いので
PHP IDEとかPHP VSCodeあたりで検索してみて、書いている途中にエラーをわかりやすくエラーを表示してくれる開発環境を整えることをお勧めします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/23 11:09

    詳しくご説明とご回答ありがとうございました。

    教材自体が問題ありそうなのは分かりました。一度、出来るとこまでしてみてあまりの時間の浪費になるような次第でしたら考えてみます。
    アドバイスありがとうございます。

    ソースコードの編集と実装も教えていただいた手順でやってみます。

    この教材で同じような箇所でストップしている方も散見したので、参考にもしようかなと思います。

    また解決しましたらご報告したいと思いますのでよろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • PHP データベース(xamppのmysqlです)にデータが保存できないようでプログラミングの目的と意図しない遷移画面になります。