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

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

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

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

Q&A

解決済

1回答

1885閲覧

phpでフォーム作成

shaobao

総合スコア33

PHP

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

0グッド

0クリップ

投稿2017/09/19 06:39

こんにちは、

現在、まだPHP初級者ですが、勉強を兼ねてスタッフ登録フォームを作成使用としています。
スタッフ修正画面から、データベースに登録するという段階で下記のようなエラーが出ちゃって、修正画面から、定義済み変数$_POST[]で送られるはずなのですが、なぜ変数が定義されていませんというエラーが出るのが悩まして原因が見つからない。
ここでどなた方にご教示お願いしたくてご連絡致します。
ご存知の方がお手数をおかけいたしますが、教えてお願いいたします。
補足:セッションで変数に代入して見るときちゃんと登録ができるですが、セッション使わない場合、原因が知りたかったです。

エラー内容:
Notice: Undefined index: name in /home/ubuntu/workspace/staff_edit_done.php on line 25 Call Stack: 0.0011 239976 1. {main}() /home/ubuntu/workspace/staff_edit_done.php:0 Notice: Undefined index: pass in /home/ubuntu/workspace/staff_edit_done.php on line 26 Call Stack: 0.0011 239976 1. {main}() /home/ubuntu/workspace/staff_edit_done.php:0 /home/ubuntu/workspace/staff_edit_done.php:27: string(0) "" 修正しました。

ソースコードは下記の通りです。
まず、staff_edit_check.php

<?php ini_set("display_errors", On); error_reporting(E_ALL); require 'lib/functions.php'; session_start(); //変数初期化 $name = ""; $pass = ""; $pass2 = ""; $token = ""; if($_SERVER["REQUEST_METHOD"] == "POST"){ //トークンをcheck if(isset($_POST['token']) && isset($_SESSION['token'])){ $token = $_POST['token']; if($token != $_SESSION['token']){ die('不正アクセスですが発生!'); } }else{ die('操作が間違っています。最初からやり直してください。'); } //変数にpostされたデータを代入 $staffcode = isset($_POST['staffcode']) ? $_POST['staffcode'] : ''; $name = isset($_POST['name']) ? $_POST['name'] : ''; $pass = isset($_POST['pass']) ? $_POST['pass'] : ''; $pass2 = isset($_POST['pass2']) ? $_POST['pass2'] : ''; $error = []; //nameチェック if(trim($name) == ''){ $error[] = 'スタッフ名を入力してください'; }elseif(mb_strlen($name) > 100){ $error[] = 'スタッフ名を100文字以内にご入力ください。'; } //passチェック if(trim($pass) == ''){ $error[] = 'パスワードを入力してください。'; }elseif($pass != $pass2){ $error[] = 'パスワードが一致しません。'; } //postされたデータ&エラーメッセージをセッションに保存 $_SESSION['error'] = $error; //error数の確認 if(count($error) > 0){ header('HTTP/1.1 303 See Other'); header('Location: ./staff_edit.php'); //確認画面を表示 }else{ require 'header.php'; ?> <div class="staff_add"> <p>スタッフ追加</p> <form action="staff_edit_done.php" method="post"> <p>スタッフ名</p> <p><?php echo h($name); ?></p> <p>パスワード</p> <p><?php echo md5(h($pass)); ?></p> <p>パスワード確認</p> <p><?php echo md5(h($pass2)); ?></p> <div> <input type="button" onclick="history.back()" value="戻る"> <input type="hidden" name="staffcode" value="<?php echo h($staffcode); ?>"> <input type="hidden" name="token" value="<?php echo h($token); ?>"> <input type="submit" value="確認"> </div> </form> </div> <?php } } require 'footer.php';

次、staff_edit_done.php

<?php ini_set("display_errors", On); error_reporting(E_ALL); require 'lib/functions.php'; session_start(); require 'header.php'; //トークンをcheck if(isset($_POST['token']) && isset($_SESSION['token'])){ $token = $_POST['token']; if($token != $_SESSION['token']){ die('不正アクセスですが発生!'); } }else{ die('操作が間違っています。最初からやり直してください。'); } //DBへ接続 try{ //変数にsession変数を代入します if($_SERVER["REQUEST_METHOD"] == "POST"){ $staffcode = $_POST['staffcode']; $name = $_POST['name']; $pass = $_POST['pass']; var_dump($staffcode); } $pdo = new PDO('mysql:host=localhost;dbname=shop;charset=utf8', 'root', ''); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); $sql = 'update mst_staff set name=?,password=? where code=?'; $staff = $pdo->prepare($sql); // $staff->bindValue(1, $name); // $staff->bindValue(2, $pass); // $staff->bindValue(3, $staffcode); $data[] = $name; $data[] = $pass; $data[] = $staffcode; $staff->execute($data); $pdo = null; echo $name . '修正しました。'; }catch(Exception $e){ die('接続エラー:' . $e->getMessage()); } require 'footer.php';

何卒、よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2017/09/19 07:18

エラー内容もソースコードと同様にコードブロックで囲んでいただけると助かります。
guest

回答1

0

ベストアンサー

staff_edit_check.phpにname="name"name="pass"の入力コントロールが設置されていません。
POSTはaction先にしか情報を送信しないので、staff_edit_check.phpからstaff_edit_done.phpに情報を渡したければ、
staff_edit_check.phpに渡したい情報の入力コントロール(hiddenも含む)を置かなければなりません。

staffcodeと同様に渡したい情報全てを置いてください。

追記:
pdo->executeの返り値にtrue/falseがあるのでfalseの場合はエラーとするようにした方が良いですね。
今のままだと失敗しても「修正しました」と出力されるように見えます。
また、if($_SERVER["REQUEST_METHOD"] == "POST"){にてPOST送信であることを確認しているのはいいのですが、
今のifの閉じ位置だと直接「staff_edit_done.php」をURL直で実行してもDB接続の処理が走ります。
session_start();をひとまずファイル冒頭に記述した上で、POSTではない場合に不正アクセスとする処理を入れて、残り全てをelseとしてはどうでしょうか?

php

1<?php 2session_start(); 3if($_SERVER["REQUEST_METHOD"] !== "POST"){ 4 die("不正アクセス"); 5} 6//~~~処理

※die()で処理が強制的に終了するのでELSEは不要でした。コード修正しました。

投稿2017/09/19 07:24

編集2017/09/19 07:53
m.ts10806

総合スコア80850

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

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

shaobao

2017/09/19 11:33

ご丁寧に詳しくご回答いただき誠にありがとうございます。 大変参考になりました。独学の私にとって、大変助かりました。 ちなみに、セッションやクッキーなどにデータを渡しなければ、hiddenでデータを渡す必要があるですね。今までhiddenについてしっかり理解できていなかったみたいでした。こうなると、もしフォーム項目がたくさんある場合でも、セッションでデータ渡しなかった場合、必ずhiddenで渡す必要があると理解すれば良いでしょうね。 あと、他にご指摘いただきました点に関しては、参考させていただきます。 ありがとうございました。
m.ts10806

2017/09/19 11:48

ただ、hiddenだとHTMLに出力されるので、改ざんが可能となります。 大事なのは不正な値が渡された想定で、その値をはじいて受け入れないようにチェック処理を入れることです。 hiddenも入れたくなければセッションで受け渡してDB登録時に破棄するとかいうのもありです。 (それでも必ずチェックはすること)
shaobao

2017/09/19 12:00

ご教示いただき誠にありがとうございます。 ご指摘の点について、大変参考になります。 勉強になりました。 まだ分からない点がございましたら、引き続き何卒よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問