PHPでユーザー新規登録をしたい。併せて入力エラーなどの機能も付けたい。

実現したいこと

ユーザーリストから新規ユーザー登録へ遷移してユーザー情報を登録(DBへ)したいです。

発生している問題・分からないこと

・登録完了すると画面に
『Warning: Trying to access array offset on value of type bool in /var/www/html/shinki_touroku.php on line 40
会員登録が完了しました』と出ます。
・また、フォーム未入力で登録を押すと、
『このメールアドレスは既に使われております。』と出てしまいます。
・HTMLのところで同じようなことを書いているのはわかっていますが
よくわかりません。
・いろんなサイトから引っ張ってきたのでぐちゃぐちゃになってしまいパンクしています。

該当のソースコード

<?php if (!empty($_POST) ){ if($_POST['l_name'] == "") { $error['l_name'] = 'blank'; } if ($_POST['mail'] == "") { $error['mail'] = 'blank'; } if ($_POST['pass'] == "") { $error['pass'] = 'blank'; } //フォームからの値をそれぞれ変数に代入 $l_name = $_POST['l_name']; $f_name = $_POST['f_name']; $mail = $_POST['mail']; $pass = password_hash($_POST['pass'], PASSWORD_DEFAULT); // パスワードはハッシュ化 define('HOSTNAME', 'db'); define('DATABASE', 'sample'); define('USERNAME', 'root'); define('PASSWORD', 'root'); try { $dbh = new PDO('mysql:host=' . HOSTNAME . ';dbname=' . DATABASE, USERNAME, PASSWORD); } catch (PDOException $e) { $msg = $e->getMessage(); } //フォームに入力されたmailがすでに登録されていないかチェック $sql = "SELECT * FROM users WHERE email = :mail"; $stmt = $dbh->prepare($sql); $stmt->bindValue(':mail', $mail); $stmt->execute(); $user = $stmt->fetch(); if ($user['email'] === $mail){ echo 'このメールアドレスは既に使われております。'; } else { $sql = "INSERT INTO users(last_name, first_name, email, password) VALUES (:l_name, :f_name, :mail, :pass)"; $stmt = $dbh->prepare($sql); $stmt->bindValue(':l_name', $l_name); $stmt->bindValue(':f_name', $f_name); $stmt->bindValue(':mail', $mail); $stmt->bindValue(':pass', $pass); $stmt->execute(); echo '会員登録が完了しました'; $link = '<a href="login_page.php">ログインページ</a>'; } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF=8"> <link rel="stylesheet" href="shinki_touroku.css"> <title>~新規登録画面~</title> <style> .error { color: red;font-size:0.8em; } </style> </head> <header> ログイン中【株式会社xxx】/ <a href="login_page.php">ログアウト</a> </header> <body> <h3>☆ユーザー新規登録☆</h3> <form action=" " method="post" > <input type="hidden" name= "action" value= "submit"> <a href="user_list.php">ユーザー管理へ戻る</a> <table style="width: 950px; margin: auto;" valign="middle"> <tr> <th bgcolor="#d0d0d0" height="45" width="280">ID</th> <td> </td> </tr> <tr> <th bgcolor="#d0d0d0" height="45" width="280"> 苗字 </th> <td> <input type="text" class="txt" name="l_name" > <?php if (isset($error['l_name']) && ($error['l_name'] == "blank")): ?> <p class="error">苗字は入力必須です</p> <?php endif; ?> </td> </tr> <tr> <th bgcolor="#d0d0d0" height="45" width="280"> 名前 </th> <td> <input type="text" class="txt" name="f_name"> </td> </tr> <tr> <th bgcolor="#d0d0d0" height="45" width="280"> メールアドレス </th> <td> <input type="text" class="txt" name="mail" > <?php if (isset($error['mail']) && ($error['mail'] == "blank")): ?> <p class="error">メールアドレスは入力必須です</p> <?php endif; ?> <?php if (isset($error['mail']) && ($error['mail'] == "duplicate")): ?> <p class="error">すでにそのemailは既に登録されています。</p> <?php endif; ?> </td> </tr> <tr> <th bgcolor="#d0d0d0" height="45" width="280"> パスワード </th> <td> <input type="password" class="txt" name="pass"> <?php if (isset($error['pass']) && ($error['pass'] == "blank")): ?> <p class="error">パスワードは入力必須です</p> <?php endif; ?> </td> </tr> <tr> <th bgcolor="#d0d0d0" height="45" width="280">会社</th> <td> <select class="kaisha"> <option>Google</option> <option>Apple</option> <option>Amazon</option> </select> </td> </tr> <tr> <th bgcolor="#d0d0d0" height="45" width="280">プロフィール画像</th> <td><input type="file" class="gazou"></td> </tr> <tr> <th bgcolor="#d0d0d0" height="85" width="280" name="bikou">備考</th> <td><textarea class="bikou"></textarea></td> </tr> <tr> <td colspan="2" height="45"><input type="submit" style="width:150px" value="登録" class="touroku" name="touroku"> </td> </tr> </table> </form> </body> </html>

試したこと・調べたこと

上記の詳細・結果

組み合わせているので文脈自体がおかしいかもしれません。。

補足

特になし

コメントを投稿

0 コメント