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

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

ただいまの
回答率

89.52%

XAMMP環境でショッピングのログインシステム

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 815

yuus2733

score 109

XAMMP環境でショッピングのログインシステムのプログラミング練習を
しています。

staff_add.phpという名前のファイル部分です。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ろくまる農園</title>
</head>
<body>

スタッフ追加<br />
<br />
<form method="post" aciton="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">

</body>
</html>

以下staff_add_check.phpです
http://localhost/staff/staff_add_check.php
にアクセスして動作するかを確認すると、

<?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" oneclick="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" oneclick="history.back()" value="戻る">';
print  '<input type="submit" value="OK">';
print '</form>';

}

?>

[$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');]

の部分に[Notice: Undefined index:]のエラーが出ます。
参考書の通りに入力しているのですが、何かおかしいのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+4

Undefined indexは定義していない配列を使用したときに発生するエラーです。issetを使用して使おうとしている配列が定義されているか確認することで解決できると思います。

<?php
if (isset($_POST["name"]) &&
    isset($_POST["pass"]) &&
    isset($_POST["pass2"])
) {
    $staff_name = $_POST['name'];
    $staff_pass = $_POST['pass'];
    $staff_pass2 = $_POST['pass2'];
}

追記

上のコードをそのまま使うと$_POST["name"]$_POST["pass"]$_POST["pass2"]が定義されていないときには$staff_name$staff_pass$staff_pass2という変数が定義されないことになりますから、それが原因でUndefined variableというエラーが発生します。$_POST["name"]$_POST["pass"]$_POST["pass2"]が定義されていないときにはしなくて良い処理をif文の中に入れることで解決できると思います。
質問の趣旨とは関係ありませんが、oneclick="history.back()"ではなく、onclick="history.back()"ではないかと思いますがいかがでしょう。

<?php
if (isset($_POST["name"]) &&
    isset($_POST["pass"]) &&
    isset($_POST["pass2"])
) {
    $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" oneclick="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" oneclick="history.back()" value="戻る">';
        print  '<input type="submit" value="OK">';
        print '</form>';

    }
}
?>

追記2

aciton属性ではなくて、action属性です。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>ろくまる農園</title>
</head>
<body>

スタッフ追加<br/>
<br/>
<form method="post" action="staff_add_check.php"><!-- 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">
</body>
</html>
<?php
if (isset($_POST["name"]) &&
    isset($_POST["pass"]) &&
    isset($_POST["pass2"])
) {
    $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>';
    }
}
?>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/18 21:33

    すみません、先に作ってあったファイルのスペルミスみたいですね・・・。
    htmlだけのほうはスペルミスを指摘してくれないので(Atom使ってます)、
    全然気づいてませんでした・・・。
    actionのスペルミスを直して、本に書いてあったほうのソースコードだけで動くようにはなったのですが、パスワード入力がされていない時、printが動作していません。何かおかしいところがありますでしょうか?

    キャンセル

  • 2017/05/18 21:34 編集

    if ($staff_pass == ' ') {の半角スペースが余計なのではないでしょうか?以下のようにするとどうでしょう。
    if ($staff_pass == '') {

    キャンセル

  • 2017/05/18 21:40

    まさにその通りでした!いくつもミスを見つけていただいてありがとうございました。
    本当に細かいミス、余計な事をするとすぐに想定通りに動かなくなっちゃうんですね・・・。

    キャンセル

+1

エラーが出ているのであれば、まずエラーの意味を確認するのが良いです。
大体、間違った箇所の答えが書いてあります。

ちなみにですが、このコードを見る限り、あまり良い参考書ではありません。
少し古いんですかね?
・post データの取扱が適切ではない
・ハッシュ化が現在の推奨方法と違う
・htmlspecialchars の使用箇所が適切ではない
辺りが気になります。

post の取扱は php でアプリ作る時の基本なので、もう少し良い教材を選んだほうがイイです。

 追記 
このままでは、このコードを活かしそうなので、補足します。

・post データの取扱が適切ではない
そもそも post 受け取り時にE_NOTICE が出るようなコードを参考にするのは間違っています。
すでに s8_chu さんが修正案を出してくれていますが、個人的には以下の書き方が好きです。
$staff_name= filter_input(INPUT_POST, 'name');

・ハッシュ化が現在の推奨方法と違う
PHP でパスワードを扱うときにはpassword_hash()の使用が推奨されています。
md5()が不適切な理由も以下に記述があります。 
安全なパスワードハッシュ
また、staff_add_check.phpでハッシュ化してますが、一般的にはstaff_add_done.phpでハッシュ化します。

・htmlspecialchars の使用箇所が適切ではない
htmlspecialchars は出力時に使用します。入力値を変換して比較するとか、あり得ない暴挙です。

さらに追記すると、比較演算子に==も推奨されません。
特別な理由がない限り(特に初心者のうちは)、===!==の型まで含めた比較を行うことをオススメします。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/18 21:27

    わかりました、ありがとうございます。
    ぼく自身初心者の中の初心者(苦笑)なので、もう少しスペルチェックに余裕になって、スラスラ打ち込めるようになったら参考にさせていただきます!

    キャンセル

  • 2017/05/18 21:55

    すでに書きましたが、このコードの延長上に正しいコードはありません。
    このコードは捨てたほうがイイですよ。
    理由は回答に追記しました。

    キャンセル

  • 2017/05/21 11:19

    少し気になったので、本に関して検索してみました。
    徳丸さんが副読本(?)を出しているようです。
    http://blog.tokumaru.org/2014/10/php-book.html

    副読本はダウンロードサイトから入手できるようです。
    私の指摘以外の箇所もあるようなので、早めに入手されることをオススメします。
    *それにしても、こんな形で書籍をフォローするケースもあるんですね。書籍を買っただけでは、完結しないとか、面白いけどやっかいですね。。。

    ===
    2-1 本アップには欠かせない——本書プログラムの脆弱性対策
     ◆P088 スタッフの削除機能にCSRF脆弱性
     ◆P100 商品追加機能に2種の脆弱性
     ◆P113ほか HTMLエスケープ処理の漏れ
     ◆P233 自動返信メールにメールヘッダインジェクション脆弱性
     コラム(1)「サニタイジング」という用語について

    2-2 中級以上を目指す方へ——プログラム品質を高める改善案
     ◆P061・P113・P232 HTMLエスケープを行う場所について
     ◆P061 htmlspecialcharsの引数
     ◆P061他 データベース接続に例外処理の設定を
     ◆P065 データベース接続の文字エンコーディング指定方法
     ◆P100 正規表現による全体一致チェック
     ◆ 商品を購入したらカートは空になっているべき
     ◆ 商品画像のファイル名にルールがほしい
     ◆P268 注文データ漏えいの恐れあり
     ◆ 許可されていない文字がDBに登録されてしまう
     コラム(2) MD5によるパスワードの暗号化
    ===

    キャンセル

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

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

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