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

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

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

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

Q&A

解決済

2回答

1900閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

1クリップ

投稿2017/05/18 11:13

編集2017/05/18 12:12

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:]のエラーが出ます。
参考書の通りに入力しているのですが、何かおかしいのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

PHP

1<?php 2if (isset($_POST["name"]) && 3 isset($_POST["pass"]) && 4 isset($_POST["pass2"]) 5) { 6 $staff_name = $_POST['name']; 7 $staff_pass = $_POST['pass']; 8 $staff_pass2 = $_POST['pass2']; 9}

#追記
上のコードをそのまま使うと$_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

1<?php 2if (isset($_POST["name"]) && 3 isset($_POST["pass"]) && 4 isset($_POST["pass2"]) 5) { 6 $staff_name = $_POST['name']; 7 $staff_pass = $_POST['pass']; 8 $staff_pass2 = $_POST['pass2']; 9 $staff_name = htmlspecialchars($staff_name, ENT_QUOTES, 'UTF-8'); 10 $staff_pass = htmlspecialchars($staff_pass, ENT_QUOTES, 'UTF-8'); 11 $staff_pass2 = htmlspecialchars($staff_pass2, ENT_QUOTES, 'UTF-8'); 12 13 if ($staff_name == ' ') { 14 15 print 'スタッフ名が入力されていません<br />'; 16 17 } else { 18 19 print 'スタッフ名:'; 20 print $staff_name; 21 print '<br />'; 22 } 23 24 if ($staff_pass == ' ') { 25 26 print 'パスワードが入力されていません<br />'; 27 28 } 29 30 if ($staff_pass != $staff_pass2) { 31 32 print 'パスワードが一致しません<br />'; 33 34 } 35 36 if ($staff_name == '' || $staff_pass == '' || $staff_pass != $staff_pass2) { 37 38 print '<form>'; 39 print '<input type="button" oneclick="history.back()" value="戻る">'; 40 print '</form>'; 41 42 } else { 43 $staff_pass = md5($staff_pass); 44 print '<form method="post" action="staff_add_done.php">'; 45 print '<input type="hidden" name="name" value="' . $staff_name . '">'; 46 print '<input type="hidden" name="pass" value="' . $staff_pass . '">'; 47 print '<br />'; 48 print '<input type="button" oneclick="history.back()" value="戻る">'; 49 print '<input type="submit" value="OK">'; 50 print '</form>'; 51 52 } 53} 54?>

#追記2
aciton属性ではなくて、action属性です。

HTML

1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <title>ろくまる農園</title> 6</head> 7<body> 8 9スタッフ追加<br/> 10<br/> 11<form method="post" action="staff_add_check.php"><!-- action="staff_add_check.php"に修正 --> 12 スタッフ名を入力してください<br/> 13 <input type="text" name="name" style="width:200px"><br/> 14 パスワードを入力して下さい<br/> 15 <input type="password" name="pass" style="width:100px"><br/> 16 パスワードをもう一度入力してください<br/> 17 <input type="password" name="pass2" style="width:100px"><br/> 18 <br/> 19 <input type="button" onclick="history.back()" value="戻る"> 20 <input type="submit" value="OK"> 21</body> 22</html>

PHP

1<?php 2if (isset($_POST["name"]) && 3 isset($_POST["pass"]) && 4 isset($_POST["pass2"]) 5) { 6 $staff_name = $_POST['name']; 7 $staff_pass = $_POST['pass']; 8 $staff_pass2 = $_POST['pass2']; 9 $staff_name = htmlspecialchars($staff_name, ENT_QUOTES, 'UTF-8'); 10 $staff_pass = htmlspecialchars($staff_pass, ENT_QUOTES, 'UTF-8'); 11 $staff_pass2 = htmlspecialchars($staff_pass2, ENT_QUOTES, 'UTF-8'); 12 13 if ($staff_name == ' ') { 14 15 print 'スタッフ名が入力されていません<br />'; 16 17 } else { 18 19 print 'スタッフ名:'; 20 print $staff_name; 21 print '<br />'; 22 } 23 24 if ($staff_pass == ' ') { 25 26 print 'パスワードが入力されていません<br />'; 27 28 } 29 30 if ($staff_pass != $staff_pass2) { 31 32 print 'パスワードが一致しません<br />'; 33 34 } 35 36 if ($staff_name == '' || $staff_pass == '' || $staff_pass != $staff_pass2) { 37 print '<form>'; 38 print '<input type="button" onclick="history.back()" value="戻る">'; 39 print '</form>'; 40 41 } else { 42 $staff_pass = md5($staff_pass); 43 print '<form method="post" action="staff_add_done.php">'; 44 print '<input type="hidden" name="name" value="' . $staff_name . '">'; 45 print '<input type="hidden" name="pass" value="' . $staff_pass . '">'; 46 print '<br />'; 47 print '<input type="button" onclick="history.back()" value="戻る">'; 48 print '<input type="submit" value="OK">'; 49 print '</form>'; 50 } 51} 52?>

投稿2017/05/18 11:19

編集2017/05/18 12:22
s8_chu

総合スコア14731

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

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

退会済みユーザー

退会済みユーザー

2017/05/18 11:39

書いていただいたコードをコピペして動作確認したところ、 下に続けて書いてある $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'); この部分にエラーが出てしまいました。 一度追記で見本になってるコード全体をはり付けてみます。
s8_chu

2017/05/18 12:04

回答文に追記させていただきました。
退会済みユーザー

退会済みユーザー

2017/05/18 12:05

onclickの記述違いなどを直し再び動作確認をしたのですがだめでした。 フォームのHTMLだけ書いたphpファイルとリンクしてるようなのですがそちらもあったほうがいいでしょうか?
s8_chu

2017/05/18 12:09

> onclickの記述違いなどを直し再び動作確認をしたのですがだめでした。 再び同じ箇所でエラーが発生したということでしょうか? > フォームのHTMLだけ書いたphpファイルとリンクしてるようなのですがそちらもあったほうがいいでしょうか? 可能ならば質問文に追記していただけると嬉しいです。
退会済みユーザー

退会済みユーザー

2017/05/18 12:18

エラーが出てる行の場所は違うのですが、同じエラーが返ってきます。 使っている「気づけばプロ並PHP」に、エラーを吐き出す部分の行が下の方に流れてくような記述があるのですが、それとは違うのでしょうか?
s8_chu

2017/05/18 12:24

その書籍を持っていないので「エラーを吐き出す部分の行が下の方に流れてくような記述」というものがよく理解できませんが、追記したようにするとどうでしょうか?
退会済みユーザー

退会済みユーザー

2017/05/18 12:33

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

2017/05/18 12:34 編集

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

退会済みユーザー

2017/05/18 12:40

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

0

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

ちなみにですが、このコードを見る限り、あまり良い参考書ではありません。
少し古いんですかね?
・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 11:55

編集2017/05/18 12:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/05/18 11:59

気づけばプロ並PHP という書籍を使っています。 現在進行形で動向を知っている人には物足りないところもあるだろうといわれてます。(初心者向けの物である事も謳っています)
退会済みユーザー

退会済みユーザー

2017/05/18 12:04

このコードだけで判断すると、物足りないとかではなく、プログラミングを分かっていない人が書いています。。。 とても初心者に薦められるものではないです。 このコードの延長上に、正しいコードは見えてきません。
退会済みユーザー

退会済みユーザー

2017/05/18 12:13

別ファイルを使っての作成あるので、そのファイルを追記しました。 これでもだめでしょうか。
退会済みユーザー

退会済みユーザー

2017/05/18 12:24

このコードを修正していくのであれば、staff_add_done.php を見るべきでしょうけど、staff_add_check.php がひどいので、見たくないです。 ログインシステムだけを切り取って学習するのであれば、以下の記事がオススメです。必要な事が、適当な粒度で説明してあります。 http://qiita.com/ShibuyaKosuke/items/f114ffccf441edb2b745 ただし、初心者にはちょっと難しいです。 post に関してであれば、以下の記事もオススメです。 http://qiita.com/mpyw/items/b2a2b0e8e60ed4680f06 ・外部入力の利用 こちらも少し難しいです。 上記の記事が理解できれば、このコードの問題点も大体わかってくると思います。
退会済みユーザー

退会済みユーザー

2017/05/18 12:27

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

退会済みユーザー

2017/05/18 12:55

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

退会済みユーザー

2017/05/21 02: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によるパスワードの暗号化 ===
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問