hj01
@hj01

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ログイン情報を保持したままメイン画面に戻る

Q&A

Closed

解決したいこと

ログイン画面→メイン画面→question1→正答数ページ→メイン画面
となるように作成したのですが正答数ページ→メイン画面と移動すると
エラーが発生しました。
わかりやすく解決方法を教えて下さい。

発生している問題・エラー

Warning: Undefined array key "year" in C:\xampp\htdocs\課題7\View\main.php on line 8

login.php

該当するソースコード




<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン</title>
<link rel="stylesheet" href="css/login.css">
<link rel="stylesheet" href="style.css">
</head>
<body>

<form action="main.php" method="POST" autocomplete="off">
<input type="number" name="year" ><br>
<input type="number" name="class"><br>
出席番号<input type="number" name="number_id" ><br>
名前<input type="text" name="name"><br>
パスワード<input type="password" name="password" ><br>
  

<input type="submit" value="ログイン">
</form>
</body>
</html>

main.php

該当するソースコード

<?php
session_start();


?>

<?php

$_SESSION['year']=$_POST['year'];
$_SESSION['class']=$_POST['class'];
$_SESSION['number_id']=$_POST['number_id'];
$_SESSION['name']=$_POST['name'];
$_SESSION['password']=$_POST['password'];


$pdo=new PDO('mysql:host=localhost;dbname=english word;charset=utf8',
'staff','password');
$sql=$pdo->prepare('select * from user_table where year=? and class=? and
number_id=? and name=? and password=?');

$sql->execute([$_POST['year'],$_POST['class'],$_POST['number_id'],$_POST['name'],$_POST['password']]
);
foreach ($sql as $row) {
	$_SESSION['user_table']=[
		'year'=>$row['year'], 'class'=>$row['class'],
		'number_id'=>$row['number_id'], 'name'=>$row['name'],
		'password'=>$row['password']];
}




?>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>メイン画面</title>
<link rel="stylesheet" href="css/main.css">
<link rel="stylesheet" href="style.css">
</head>
<body>

<?php require '../header.php';?>

<?php


if(isset($_SESSION['user_table'])){
  if($_POST['year']==0){

     echo'英単語データベース';
     print_r('<br>');


    echo'<div class="box2">';
     echo'<a href="seach-input.php">英単語検索</a>';
     echo'</div>';
     print_r('<br>');

    echo' <div class="box3">';
     echo' <a href="question1-input.php">問題1</a>';
     echo'<a href="question2-input.php">問題2</a>';
    echo'</div>';

    echo' <div class="box4">';
     echo' <a href="question3-input.php">問題3</a>';
     echo'<a href="question4-input.php">問題4</a>';
    echo'</div>';

    echo' <div class="box5">';
     echo' <a href="question5-input.php">問題5</a>';
     echo'<a href="question6-input.php">問題6</a>';
    echo'</div>';

   print_r('<br>');
   print_r('<br>');

    echo'<div class="box6">';
      echo'<a href="edit.php">英単語データベース編集</a>';
      echo'<a href="student.php">生徒編集</a>';
    echo'</div>';


    echo'<div class="box7">';
     echo' <a href="password.php">パスワード編集</a>';
    echo'</div>';

    echo'<div class="box8">';
     echo'<a href="logout.php">ログアウト</a>';
    echo'</div>';


}else{
echo'英単語データベース';
     print_r('<br>');


    echo'<div class="box2">';
     echo'<a href="seach-input.php">英単語検索</a>';
     echo'</div>';
     print_r('<br>');

    echo' <div class="box3">';
     echo' <a href="question1-input.php">問題1</a>';
     echo'<a href="question2-input.php">問題2</a>';
    echo'</div>';

    echo' <div class="box4">';
     echo' <a href="question3-input.php">問題3</a>';
     echo'<a href="question4-input.php">問題4</a>';
    echo'</div>';

    echo' <div class="box5">';
     echo' <a href="question5-input.php">問題5</a>';
     echo'<a href="question6-input.php">問題6</a>';
    echo'</div>';

   print_r('<br>');
   print_r('<br>');


    echo'<div class="box7">';
     echo' <a href="password.php">パスワード編集</a>';
    echo'</div>';

    echo'<div class="box8">';
     echo'<a href="logout.php">ログアウト</a>';
    echo'</div>';

}
}else{
echo "エラー";
}
?>
</body>
</html>

question1-input.php

該当するソースコード

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>question1</title>
<link rel="stylesheet" href="css/question.css">
</head>
<body>


?に入る英単語を選んでください
<form action="question1-output.php" method="post">
Water is ?.
<p><input type="radio" name="1" value="水" checked>liquid</p>
<p><input type="radio" name="1" value="気体">air</p>
<p><input type="radio" name="1" value="固体">solid</p>
<p><input type="radio" name="1" value="氷">ice</p>
<p><input type="submit" value="確定"></p>
</form>
</body>
</html>

question1-output.php

該当するソースコード

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン</title>
<link rel="stylesheet" href="css/question.css">
<link rel="stylesheet" href="style.css">
</head>
<body>


<?php


$count=0;
switch ($_REQUEST['1']) {
case '水':
	$count++;
	break;
case '気体':
	break;
case '固体':
	break;
case '氷':
	break;

}
echo '5問中'.$count.'問正解';
print_r('<br>');
if($count>=3){
echo '合格です';
}else {
echo '不合格です';
}
print_r('<br>');


echo'<div class="box">';
     echo'<a href="main.php">メイン画面に戻る</a>';
echo'</div>';
?>
</body>
</html>
0

1Answer

多分ですが

login.phpはPOSTでmain.phpに遷移しているのに対し、
question1-output.phpは

echo'<a href="main.php">メイン画面に戻る</a>';

でGETでmain.phpに遷移しているからではないでしょうか?

$_POSTの変数に'year'(それ以降のキー全て)がないため

Warning: Undefined array key "year"

配列($_POST)に'year'というキーが存在しません。的なエラーになっているんだと思います。

解決方法はGETリクエストの場合の処理を追加すれば解決すると思います。

0Like

Comments

  1. @hj01

    Questioner

    echo'<a href="main.php?year=$_POST['year']&class=$_POST['class']&number_id=$_POST['number_id']
    &name=$_POST['name']&password=$_POST['password']">
    メイン画面に戻る</a>';
    でソースコードを追加したら、
    Parse error: syntax error, unexpected identifier "year", expecting "," or ";" in C:\xampp\htdocs\課題7\View\question1-output.php on line 41と
    というエラーが出ました。どのように修正すればいいでしょうか?
  2. おー力技にでましたね!

    このエラーは
    echo'<a href="main.php?year=$_POST['year']
    シングルコーテーション(')の中にシングルコーテーションが入っているから、構文エラーとなってますね。
    あと、question1-output.phpにはpostで遷移してますが、$_POSTには'1'の値しかないんではないでしょうか?

    ひとまず、難しく考えず、(マークダウン使えないので見にくいですがご容赦ください)
    main.phpの

    -----------------------------
    $_SESSION['year']=$_POST['year'];
    $_SESSION['class']=$_POST['class'];
    $_SESSION['number_id']=$_POST['number_id'];
    $_SESSION['name']=$_POST['name'];
    $_SESSION['password']=$_POST['password'];
    -----------------------------

    ここでまず$_SESSIONにlogin.phpからpostでリクエストされた値をセットしているので、これ以降

    -----------------------
    $sql->execute([$_POST['year']
    -----------------------

    など$_POSTで参照している箇所を
    $_SESSION['year']などに修正してください。$_POSTは
    post通信された時しかその値を保持していません。

    で、question1-output.phpからmain.phpに遷移するときは、今まで通り
    --------------------
    echo'<a href="main.php">メイン画面に戻る</a>';
    --------------------

    で遷移します。

    で、main.phpは、あくまで例ですが、

    -----------------------------
    if ($_SERVER["REQUEST_METHOD"] === 'POST') {
    $_SESSION['year'] = $_POST['year'];
    $_SESSION['class'] = $_POST['class'];
    $_SESSION['number_id'] = $_POST['number_id'];
    $_SESSION['name'] = $_POST['name'];
    $_SESSION['password'] = $_POST['password'];
    } elseif (
    $_SERVER["REQUEST_METHOD"] === 'GET' &&
    !isset(
    $_SESSION['year'],
    $_SESSION['class'],
    $_SESSION['number_id'],
    $_SESSION['name'],
    $_SESSION['password']
    )
    ) {
    throw new Exception();
    }
    -----------------------------

    こんな感じでpostリクエストの時だけ$_SESSIONに値を保存するようにして、getリクエストのときはyearやclassが$_SESSIONにあることが前提のはずですから、もし$_SESSIONにログインに必要なパラメータがなかった場合(!isset)、エラーをスローするという感じです。

    get,postについては
    「php get post」でネットで検索してみると結構情報出てきますので調べてみるといいと思います。

    また、ご自身の環境に以下を作成して

    index.php
    --------------------------
    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="utf-8">
    <title>index.php</title>
    </head>

    <body>

    <form action="post.php" method="post">
    <input type="text" name="post_name">
    <input type="submit">
    </form>

    <form action="post.php" method="get">
    <input type="text" name="get_name">
    <input type="submit">
    </form>

    <a href="post.php?a_test=test">post.phpへ</a>

    </body>
    </html>
    --------------------------

    post.php
    -----------------------------
    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="utf-8">
    <title>post.php</title>
    </head>

    <body>

    <?php
    echo '<pre>';
    var_dump($_SERVER["REQUEST_METHOD"]);
    echo '$_POSTの中身';
    var_dump($_POST);

    echo '$_GETの中身';
    var_dump($_GET);
    echo '</pre>';

    ?>

    <a href="index.php">index.phpへ</a>

    </body>
    </html>
    -----------------------------

    getのリクエスト、postのリクエストで$_GET,$_POSTにどんな値が入ってくるのか確認してみるといいと思います!
  3. @hj01

    Questioner

    すいません。ありがとうございます。
    またわからないことがあれば質問します。
    もしよろしければ、おすすめのphpの書籍を教えてもらえますか?
  4. throw new Exception()
    は、例外を投げる(errorを強制的に発生させる)書き方なので今の挙動で正しいです。

    要するに、main.phpはloginユーザーしかアクセスできないと私は解釈してますので、$_SESSIONにログイン情報がない場合、getでアクセスした場合、$_SESSIONにログイン情報がない場合、main.phpの処理を強制的に中断させる意味合いで書きました。

    throw new Exceptionのところを

    ```
    throw new Exception('不正なアクセスです。');
    ```

    もしくは

    ```
    try {
    throw new Exception('不正なアクセスです。');
    } catch (Exception $e) {
    echo $e->getMessage();
    die();
    }
    ```
    または


    ```
    try {
    throw new Exception('不正なアクセスです。');
    } catch (Exception $e) {
    header('Location: login.php');
    }
    ```

    としてみるとわかりやすいかも
  5. あ、回答が被ってしまいましたね。
    おすすめの書籍は。。すいませんありません!
    というのも、私もプログラミングを始めて勉強したときなどは本屋にならんでいる入門書とか買って勉強してましたが、この世界進化が早いので、極端にいうと、今php8系を勉強しているのであれば、いつの間にかphp9がリリースされて一部仕様が変わってたりなんて結構当たり前なんですね。

    じゃあどうすんのって話ですが、まず、

    ・自分が何をしたいか(何を解決したいか)を明確にして、
    ・その目的を達成しそうな記事をネットで探す

    というのが一番理解できるんじゃないかなと思います。

    なので、今回の場合はget,postのhttpリクエスト(正確にいうとhttpリクエストのget,postメソッド)に対する疑問なので、ネットでその疑問を解決してくれそうな(自分がわかりやすいと感じる)記事を探すのがいいかなと。

    で、その記事に書かれていることを実践して、うまくいけばオッケーだし、うまくいかなかったら別の記事探して。。と

    このサイクルをしていくと、自然とネットから情報を収集する力がつきますので、今回のエラーなんかも自力で解決できる様になるんじゃないかと。あくまで私個人の考えですが。

    なので、今まさに日本のエンジニアたちが記事を投稿しているqiitaを利用しているので、qiitaの記事を読んだり、もちろんそのプログラミング言語のdocumentと読んだりするのがいいのかなーと感じます。
    トライアンドエラーです!
  6. @hj01

    Questioner

    ご教授ありがとうございます。
  7. あと、フォローありがとうございます!
    ついでに私のプロフィールに私が作ったブログサイトのurl貼ってますので、本当によろしければなんですが、そちらの方に勉強した内容なんかを投稿してくれるとうれしいなーと
    運営者自分なので自由に使ってくれると嬉しいです!

Your answer might help someone💌