現在、PHPでユーザー登録を実装中なのですが、DBとの連携の部分で詰まっています。
DBはPhpmyadminを使用しています。
Phpmyadminで作成したデータベースはaaaでその中にusersテーブルを以下のように作成しました。
以下で不足している部分、や間違っている部分でユーザー登録を阻んでいる部分があれば教えていただきたいです。
Name Type Collation Null Default Extra 1 idPrimary bigint(20) No None AUTO_INCREMENT 2 name varchar(255) utf8mb4_unicode_ci Yes NULL 3 email varchar(255) utf8mb4_unicode_ci Yes NULL 4 password varchar(255) utf8mb4_unicode_ci Yes NULL 5 created_at datetime Yes CURRENT_TIMESTAMP 6 updated_at datetime Yes CURRENT_TIMESTAMP
以下がコードになります。
//users/register.php <?php require('../common/head_info.php'); ?> <?php require('../common/database.php'); //POST送信された場合 if(!empty($_POST)) { debug('POSTの中身:'.print_r($_POST, true)); //変数にユーザー情報を格納 $name = $_POST['name']; $email = $_POST['email']; $pass = $_POST['pass']; $pass_re = $_POST['pass_re']; //例外処理 try { //DBへ接続 $dbh = getDatabaseConnection(); //SQL文作成 $sql = $dbh->query('INSERT INTO users (name, email, password) VALUES (:name, :email, :password)'); $data = array(':name' => $name, ':email' => $email, ':password' => password_hash($pass, PASSWORD_DEFAULT), ':login_time' => date('Y-m-d H:i:s')); //クエリ実行 $stmt = queryPost($dbh, $sql, $data); // // //クエリ実行 // // $stmt = queryPost($dbh, $sql, $data); //クエリ成功の場合 if($stmt) { //ログイン有効期限(デフォルトを1時間とする) $sessionLimit = 60*60; //最終ログイン日時を現在日時に $_SESSION['login_date'] = time(); $_SESSION['login_limit'] = $sessionLimit; //ユーザーIDを格納 $_SESSION['user_id'] = $dbh->lastInsertId(); // $_SESSION['msg_success'] = SUC01; // // debug('セッションの中身:'.print_r($_SESSION, true)); header('Location:login.php'); //マイページへ // // } else { // // error_log('クエリに失敗しました。'); // // $err_msg['common'] = MSG08; } } catch(Exception $e) { error_log('エラー発生:' . $e -> getMessage()); $err_msg['common'] = MSG08; } } ?> <?php require('../common/header.php'); ?> <div class='main-top'> <div class='form-register'> <div class="form-register-list"> <h2><i class="fas fa-user-plus"></i>ユーザー登録</h2> <form action="" method='post' class='form'> <p> <label> <input type="text" name='name' placeholder="ニックネーム" value="<?php print(htmlspecialchars($_POST['name'],ENT_QUOTES));?>"> </label> </p> <p> <label> <input type="text" name='email' placeholder="メールアドレス" value="<?php print(htmlspecialchars($_POST['email'],ENT_QUOTES));?>"> </label> </p> <p> <label> <input type="password" name='pass' placeholder="パスワード" value="<?php print(htmlspecialchars($_POST['pass'],ENT_QUOTES));?>"></br> <span class='form-rule'>※英数字8文字以上</span> </label> </p> <p> <label> <input type="password" name='pass_re' placeholder="パスワード確認" value="<?php print(htmlspecialchars($_POST['pass_re'],ENT_QUOTES));?>"></br> <span class='form-rule'>※英数字8文字以上</span> </label> </p> <div class='button-container'> <input type="submit" value='登録する'> </div> </form> </div> </div> </div> <?php require('../common/footer.php'); ?>
//common/head_info.php <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet"> <link rel="stylesheet" href="../public/css/style.css"> </head> <body> <script src='https://code.jquery.com/jquery-3.4.1.min.js'></script> </body>
//common/database.php <?php /** * PDOを使ってデータベースに接続する * @return PDO */ function getDatabaseConnection() { //DBへの接続準備 $dsn = 'mysql:host=db;dbname=aaa;charset=utf8mb4'; $user = 'root'; $password = 'secret'; $options = array( //SQL実行失敗時にはエラーコードのみ設定 PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT, //デフォルトフェッチモードを連想配列形式に設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //バッファードクエリを使う(一度結果をセットを全て取得し、サーバー負荷を軽減) //SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ); try { $database_handler = new PDO($dsn, $user, $password, $options); } catch (PDOException $e) { echo "DB接続に失敗しました。<br />"; echo $e->getMessage(); exit; } return $database_handler; } function queryPost($dbh, $sql, $data) { //クエリー作成 $stmt = $dbh->prepare($sql); //プレースホルダーに値をセットし、SQL文を実行 if(!$stmt->execute($data)){ debug('クエリに失敗しました。'); debug('失敗したSQL:'.print_r($stmt, true)); // $err_msg['common'] = MSG08; return 0; } debug('クエリに成功しました。'); return $stmt; }
あなたの回答
tips
プレビュー