PHPとMySQLを利用して、会員登録サービスを作成しております。構成としては、ログイン画面にユーザ名(従業員番号)とパスワードを入力します。ここで、未登録の方は新規登録画面に移動し、会員登録を行う。既に登録済みの方は、ログイン後ホーム画面へと遷移します。ここで、新規登録画面を設計中にエラーが生じました。
https://qiita.com/ryo-futebol/items/5fb635199acc2fcbd3ff を参照させていただきましたが、エラーが生じています。もちろん、コピペしたのではなく、所々変更している箇所がございます。27行目はソースコードのデータベースに同じ従業員番号が登録されている場合は戻るへのリンクへいく処理です。
解決方法を教えて下さい。
Notice: Undefined variable: user in /Applications/XAMPP/xamppfiles/htdocs/timecard1/newreg.php on line 27
Notice: Undefined index: user_no in /Applications/XAMPP/xamppfiles/htdocs/timecard1/newreg.php on line 27
<?php
if(!empty($_POST['user_no'])){
$pass = password_hash($_POST['password'], PASSWORD_DEFAULT);
$db_user = "kintai";
$db_pass = "password";
$db_host = "localhost";
$db_name = "mydb";
$dsn = "mysql:host=$db_host; dbname=$db_name; charset=utf8";
try {
$dbh = new PDO($dsn, $db_user, $db_pass);
} catch (PDOException $Exception) {
$msg = $Exception->getMessage();
}
//フォームに入力されたuer_noがすでに登録されていないかチェック
$sql = "SELECT * FROM users WHERE user_no = :user_no";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':user_no', $user_no);
$stmt->execute();
$user = $stmt->fetch();
};
if ($user['user_no'] === $_POST['user_no']) {
$msg = '同じ従業員番号が存在します。';
$link = '<a href="signin.php">戻る</a>';
} else {
//登録されていなければinsert
$sql = "INSERT INTO users(user_no, pass) VALUES (:user_no, :pass)";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':user_no', $user_no);
$stmt->bindValue(':pass', $password);
$stmt->execute();
$msg = '会員登録が完了しました';
$link = '<a href="login.php">ログインページへ</a>';
}
?>
### 自分で試したこと
参考資料では、$mail(ここでは$user_no)となっていましたが、$_POST['user_no']のように書き換えました。
<?php
if(!empty($_POST['user_no'])){
/* 省略 */
$user = $stmt->fetch();
};
if ($user['user_no'] === $_POST['user_no']) { // 27行目?
}
おそらく$_POST['user_no']
が存在しない時にエラーになるのだと思います。
Undefined variable: user
$user
は最初のifの中でしか初期化されていないので、27行の時点で未定義の変数になります。
Undefined index: user_no
これも$_POST
にuser_no
が存在しないことによるエラーです。
おそらく$_POST['user_no']
に値があることが前提だと思われるので、それを最初にチェックすれば良いと思います。
<?php
if (isset($_POST['user_no'])) {
echo 'user_noがありません。';
exit;
};
$pass = password_hash($_POST['password'], PASSWORD_DEFAULT);
変数$msg
と$link
に入れた結果をその後使わないのも意味がないので、おそらく41行目のPHP終了タグ?>
の後にも何らかの処理が続くのでしょう。
それを踏まえた上で
Undefined variable $user in ****.php on line 27
になることへの対応ですが、27~40行目の振り分けを行なっている処理ブロックを、25行目の$user = $stmt->fetch();
と26行目の};
間へ移動させればいいのではないでしょうか。
また、4行目で作られた変数$pass
が使用されていないのも気になります。
36行目の$password
は$pass
ではないでしょうか。
23行目と35行目で使われている変数$user_no
も未定義のようですので、どこか適切な位置で$_POST['user_no']
の内容を$user_no
に代入する処理も必要かと思います。