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

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

ただいまの
回答率

90.32%

Notice: Undefined index:が出る

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 2,324

yuus2733

score 109

下記のようなコードを、他の方のサイトを参考に打ち込んでいました。
register_submit.phpで、
$user = $_POST["user"];31行目
この部分にNotice: Undefined index:が出ます。
前二つのファイルでPOSTをしているのにエラーが出るのはなぜなのでしょうか・・・。
一度コメントアウトしてみたところエラーは出なくなりましたが、
これで正常動作といえるのかがわかりません。
他にもおかしなところがありましたらご指摘お願いします。

register.php

<?php
session_start();
header("Content-type: text/html; charset=utf-8");

//パラメーター取得
// $id = $_POST['id'];
// $password = $POST['password'];
?>

<!DOCTYPE html>
<html lang="ja">
<head>
     <meta charset="UTF-8">
     <script src="passwordchecker.js" type="text/javascript"></script>
     <script src="common.js" type="text/javascript"></script>

     <script type="text/javascript">

     /* 登録前チェック */
     function conrimMessage(){
     var username = document.getElementById('user').value;
     var mail = document.getElementById('mail').value;
     var pass = document.getElementById('password').value;
     var conf = document.getElementById('confirm_password').value;

//必須チェック
     if((use == "")||(mail == "")||(pass == "")||(conf == "")){
       alert("必須項目は入力して下さい");
       return false;
     }

//パスワードチェック
     if(pass != conf){
       alert("パスワードが一致しません");
       return false;
     }
     if(passwordLevel < 3){
       return confirm("パスワード強度が低いです。このまま登録しますか?");
     }
     return true;
}
     </script>
</head>
<body>
<h1>登録画面</h1>
<?php

if($_SESSION['error_status'] == "1"){
     echo "<h2 style='color:red';>入力内容に誤りがあります</h2>";
}
if($_SESSION['error_status'] == "2"){
     echo "<h2 style='color:red';>そのIDは既に使われています</h2>";
}
if($_SESSION['error_status'] == "3"){
     echo "<h2 style='color:red';>タイムアウトか不正なURLです</h2>";
}
if($_SESSION['error_status'] == "4"){
     echo "<h2 style='color:red';>登録に失敗しました</h2>";
}

?>
<style>
input{
vertical-align:middle;
position:relative;
}
</style>
<form action="register_check.php" method="post" onsubmit="return conrimMessage();">


メールアドレス<input type="text" name="mail" id="mail"><br />

ID
<input type="text" name="user" id="username"><br />


パスワード<br />
<input type="password" name="password" id="password" onkeyup="setMessage(this.value);">
<div id="pass_message"></div>

パスワード(確認)<br />
<input type="password" name="confirm_password" id="confirm_password"
  onkeyup="setConfirmMessage(this.value);"><br />



<input type="submit" value="登録">
<input type="reset" value="リセット">
<input type="button" value="戻る" onclick="history.back();">
</form>
</body>
</html>


register_check.php

<?php

require_once("function.php");
session_start();
header("Content-type: text/html; charset=utf-8");

$_SESSION["token"] = get_csrf_token();

$user = $_POST['user'];
$mail = $_POST["mail"];
$password = $_POST["password"];
$confirm_password = $_POST["confirm_password"];

if($password != $confirm_password){
     //pass不一致
     $_SESSION["error_status"] = 1;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}
//IDcheck

//DB接続 ※
$dsn = 'mysql:host=localhost;dbname=portfolio;charset=utf8';
$user = 'root';
$password = '';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//プレースホルダでSQL作成 ※
$sql = "SELECT COUNT(*) AS CNT FROM USERS WHERE ID = ?;";

//パラメータの型指定 ※
$stmt = $dbh->prepare($sql, array('text'));

//パラメータを渡してSQL実行
$rs = $stmt->execute(array($user));

// try{
//      $pdo = new PDO(
//        'mysql:host=localhost;dbname=portfolio;charset=utf8',
//        'root',
//        '';
//        [
//          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
//          PDO::ATTR_DEFAULT_FETCH_MODE => PDO:: FETCH_ASSOC,
//        ]
//      );
// }catch(PDOException $e){
//     header('Content-Type: text/plain; charset=UTF-8', true , 500);
//     exit($e->getMessage());
// }

while ($row = $stmt->fetch()){
  $count = $row['CNT'];
}

$dbh = null;

//IDがすでに登録されていた場合

if($count != 0){
     $_SESSION['error_status'] = 2;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}

//エラー情報リセット
$_SESSION['error_status'] = 0;

?>

<!DOCTYPE html>
<html lang="ja">
<head>
     <meta charset="UTF-8">
   </head>
   <form action="register_submit.php" method="post" >
     <table border="0">
   <tr>
   <td>ID</td>
   <td><?php echo htmlspecialchars($user , ENT_QUOTES , "UTF-8"); ?></td>

   <td>メールアドレス</td>
   <td><?php echo htmlspecialchars($mail , ENT_QUOTES , "UTF-8"); ?></td>
   </table>

   <input type="hidden" name="id" value="<?php echo htmlspecialchars($user , ENT_QUOTES , "UTF-8") ?>" >
   <input type="hidden" name="mail" value="<?php echo htmlspecialchars($mail , ENT_QUOTES , "UTF-8") ?>" >
   <input type="hidden" name="password" value="<?php echo htmlspecialchars($password , ENT_QUOTES , "UTF-8") ?>" >
   <input type="hidden" name="token" value="<?php echo htmlspecialchars($_SESSION['token'] , ENT_QUOTES , "UTF-8") ?>" >

   <input type="submit" value="登録">
   <input type="reset" value="リセット">
   <input type="button" value="戻る" onclick="history.back();">
   </form>
   </body>
   </html>


register_submit.php

<?php

// Notice: Undefined index: username in C:\xampp\htdocs\portfolio\register_submit.php on line 22
//
// Warning: str_replace() expects at least 3 parameters, 1 given in C:\xampp\htdocs\portfolio\register_submit.php on line 73
//
// Warning: mb_send_mail(): Failed to connect to mailserver at "localhost" port 25, verify your
// "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\xampp\htdocs\portfolio\register_submit.php on line 82



require_once("function.php");
session_start();
header("Content-type: text/html; charset=utf-8");

//CSRFチェック
if($_SESSION['token'] != $_POST['token']){
     $_SESSION = array();
     session_destroy();
     session_start();

     $_SESSION["error_status"] = 2;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}

//エラー情報のリセット
$_SESSION["error_status"] = 0;

$user = $_POST["user"];
$mail = $_POST["mail"];
$password = $_POST["password"];

//ソルト作成
$salt = get_salt();

//一時URLパスワード作成
$url_pass = get_url_password();

//ユーザー仮登録

//ストレッチングパスワード
$hash = stretchedPassword($salt,$password);

//データベース接続
$dsn = 'mysql:dbname=portfolio;host=localhost;charset=utf8mb4';
$user = 'root';
$password = '';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//プレースホルダでSQL作成
$sql = "INSERT INTO USERS (ID,SALT,PASSWORD,MAILADDRESS,
          TEMP_PASS,LAST_CHANGE_PASS_TIME,RESISTER_TIME)";
          $sql .= "VALUES(?,?,?,?,?,?,?);";

//パラメータの型を指定
$stmt = $dbh->prepare($sql,array('text','text','text','text','text','timestamp','timestamp'));

//パラメータを渡してSQL実行
$res = $stmt->execute(array($user,$salt,$hash,$mail,$url_pass,date('Y-m-d H:i:s'),date('Y-m-d H:i:s')));

//ID重複チェック ※

try{

}catch(PDOException $e){
     die("接続失敗です{$e->getMessage()}");

     $dbh = null;

     $_SESSION['error_status'] = 4;
     header("HTTP/1.1 301 Moved Permanently");
     header("Location: register.php");
     exit();
}

$dbh = null;

//ユーザーに確認メール送信
$mail = str_replace(["/r" , "/n"] , "" , $mail);

$url = "http://" . SERVER . "/register_confirm.php?" . $url_pass;

$msg = "以下のアドレスからアカウントを有効にしてください。" . PHP_EOL;
$msg .= "アドレスの有効期限は10分間です。" . PHP_EOL;
$msg .= "有効時間が過ぎたらパスワードのリセットをしてください" . PHP_EOL . PHP_EOL;
$msg .= $url;

mb_send_mail($mail,"ユーザー登録",$msg,"From:" . SENDER_EMAIL);

?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <h1>仮登録完了</h1>
  仮登録が完了しました。<br />
  登録を完了するには送信されたメールで手続きを行ってください。<br />
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

+5

$_POSTの値は直接参照するのはやめたほうがいいでしょう

$user = filter_input(INPUT_POST,'user');


この書式であればバリデートや未設定の際のデフォ値設定などいろいろ対応可能です

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/10 19:46

    以前その書き方を教えてくださった方がいました。
    理由を調べる余裕もなくそのままにしてました・・・教えてくださってありがとうございます。

    キャンセル

checkベストアンサー

+2

$userがmysqlのユーザー情報とかぶるのと、フォームのname属性が間違っているので、
register_check.phpの

$id = $_POST['user'];
$rs = $stmt->execute(array($id));
<input type="hidden" name="user" value="<?php echo htmlspecialchars($id , ENT_QUOTES , "UTF-8") ?>" >

として、register_submit.phpも

//$user 被るからダメ
$id = $_POST["user"];

$res = $stmt->execute(array($id,$salt,$hash,$mail,$url_pass,date('Y-m-d H:i:s'),date('Y-m-d H:i:s')));

にすればいいのではないでしょうか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/10 19:51

    ありがとうございます!
    まったくソースの内容理解できてなかったようです・・・。
    改めて、変数に被りがないかなど見直すようにします。

    キャンセル

+2

register_check.php に user は無いように見えます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

$user = 'root'; をしているので、もし$_POST['user']が入っていたとしてもずっとrootになるのでは。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

resistar_check.phpで
$user = $_POST['user'];
DB接続で
$user = 'root'; ← rootで上書き?
<form action="register_submit.php" method="post" >で
<input type="hidden" name="id" value="<?php echo htmlspecialchars($user , ENT_QUOTES , "UTF-8") ?>" > ← nameはidじゃなくてuserでは?

resistar_check.phpで
$userに文字列'root'で上書きしてます。
register_submit.phpに$userを送っていないように見えます(name="id"に対して$user入れている)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/10 19:44

    あ、申し訳ないです。。投稿した後も推敲していてそれを見つけて修正しました・・・。

    キャンセル

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

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

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