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

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

ただいまの
回答率

90.50%

  • PHP

    20357questions

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

phpでフォーム作成

解決済

回答 1

投稿

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

shaobao

score 25

こんにちは、

現在、まだ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';

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2017/09/19 16:18

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

    キャンセル

回答 1

checkベストアンサー

+1

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
session_start();
if($_SERVER["REQUEST_METHOD"] !== "POST"){
 die("不正アクセス");
}
//~~~処理


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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/19 20:33

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

    あと、他にご指摘いただきました点に関しては、参考させていただきます。
    ありがとうございました。

    キャンセル

  • 2017/09/19 20:48

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

    キャンセル

  • 2017/09/19 21:00

    ご教示いただき誠にありがとうございます。
    ご指摘の点について、大変参考になります。
    勉強になりました。

    まだ分からない点がございましたら、引き続き何卒よろしくお願いいたします。

    キャンセル

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

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

関連した質問

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

  • PHP

    20357questions

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