【PHPでwebアプリを作る】登録フォームでユーザーの新規登録をする

regist Webエンジニア

前回の記事は「PHPでwebアプリを作る時に何から作り始めればいいか【最初の手順】」です。

ユーザー登録の実装

ここから具体的にメールアドレスとパスワードを入力したユーザー登録を実装していきましょう。

実務ではフレームワークを使うことがほとんどなので、今回のように素のPHPで実装することはまずありません。あまり深く考えずお勉強程度に参考にしてもらえればOKです。

フォームの修正

前回のsignup.phpの中身を以下のように修正します。

<?php include('header.php'); ?>
        <p>こちらは新規登録ページです</p>
        <form action="signup_exe.php" method="post">
        <div>メールアドレス:<input type="text" name="email"></div>
        <div>パスワード:<input type="password" name="password"></div>
        <div>ニックネーム:<input type="text" name="nickname"></div>
        <div><input type="submit" value="登録する"></div>
        <form>
<?php include('footer.php'); ?>

続いてsignup_exe.phpを新規作成します。先頭と最後のheader.phpとfooter.phpの読み込みは省略しますが全ページに付けておいてください。

<?php
    echo $_POST['email'];
    echo $_POST['password'];
    echo $_POST['nickname'];
?>

これでメールアドレスとパスワードを入力して送信し、次のページで表示されていればフォームの送信はOKです。

続いて送られてきた値を元にデータベースに登録する処理に書き換えていきます。データベース回りは以下の記事を参考にしてください。

db

データベースを利用したwebアプリを作る【PHPからMySQLを使う方法】

2019年9月29日

シングルクォーテーションの自動エスケープ

バージョンによってはPHPのデフォルトで送信される値の中に含まれるシングルクォーテーションが勝手にエスケープされることがあります。

その場合php.iniのmagic_quotes_gpcをonからoffに買い替えて再起動する必要があります。

なぜそんなことをいうかというとシングルクォーテーションはそのままSQLに組み込むとSQLインジェクションという攻撃を受ける脆弱性になるからです。

送信先の処理

signup_exe.phpを以下のように書き換えます。

<?php include('header.php'); ?>
<?php
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASSWORD', '');
    define('DB_NAME', 'whateat');
    
    $db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    if ($db->connect_error){
        echo '接続失敗';
    } else {
        echo '接続成功';
    }
    $db->set_charset('utf8');

    $email = $_POST['email'];
    $password = $_POST['password'];
    $nickname = $_POST['nickname'];
    
    $stmt = $db->prepare("INSERT INTO users (user_id, mail, password, nickname, created_at) VALUES (NULL, ?, ?, ?, now())");
    $stmt->bind_param('sss', $email, $password, $nickname);
    $res = $stmt->execute();
    $stmt->close();
    
    if (!$res){
        echo '登録失敗';
    } else {
        echo '登録成功';
    }
?>
<?php include('footer.php'); ?>

ステートメントを使う部分が引っかかるかもしれません。bind_paramでは先ほど書いたSQLインジェクションを回避するエスケープ処理が行われるのでこの形式で書くのが無難です。

最初の’sss’はstring(文字列型)の変数が3つという宣言になります。数字型であればintegerのiとなります。

バリデーション

さて、上記で登録処理は作れたのですが、全部空白で進めた場合、空のデータが登録されてしまうようになります。

これらを防ぐために入力された値のチェックを行うことをバリデーションといいます。例えば入力必須の項目が入力されているか等です。

signup_exe.phpにて以下のように書き換えるとチェックできます。

if (!$email) {
    echo 'メールアドレスが入力されていません';
    exit;
}

本来は前の入力画面に戻ってエラー表示するという制御が理想ですが、ひとまずは大丈夫です。

実務で使うフレームワークではこのあたりの作法がそれぞれなので、結局はそれに合わせて書く必要が出てきます。今は勉強なので動きがわかればOKです。

パスワードの暗号化

今はまだそこまでやりませんが、入力されたパスワードをそのままデータベースに保存するのはご法度です。

必ず暗号化して格納する必要があります。詳しくは以下の記事をご参照ください。

password

パスワードをデータベースに保存する際の暗号化の話【PHPでwebアプリ編】

2019年10月5日

まとめ

ユーザー登録の処理を見てきました。まだまだ補足しなければいけないことがあるので、追って記事にしていきます。

今後ともよろしくお願い致します。