機能概要

30-ユーザー管理③(トランザクション)で実装したプログラムをベースに、ストアドプロシージャでの処理を学びます。

データベース準備

下記のSQL文を実行し、ユーザーマスタ(user_mst)を構築します。詳細は、14-ユーザー管理①(サインアップ)にて確認してください。

プログラミングコード

「pro_add_user_mst」SQL文(ストアドプロシージャ)

  • 行目:「pro_add_user_mst」がすでに存在する場合には、ストアドプロシージャを削除します。
  • 行目:「pro_add_user_mst」を作成します。引数として、「vch_user_kj」「vch_email」「vch_password」を取得します。
  • 5行目~21行目:ストアドプロシージャの実行範囲となります。
  • 6行目~20行目:SQL文(INSERT文)を実行します。
delimiter //

    drop procedure if exists pro_add_user_mst;
    create procedure pro_add_user_mst(in vch_user_kj varchar(255),in vch_email varchar(255),in vch_password varchar(255))
    begin
        insert into user_mst(
            user_kj
            ,email
            ,password
            ,delete_ku
            ,insert_at
            ,update_at
        ) values (
            vch_user_kj
            ,vch_email
            ,vch_password
            ,'0'
            ,now()
            ,now()
        );
    end;

//
delimiter ;

「user_signup_tran_procedure.php」ユーザー登録ページファイル

元となるプログラムは、30-ユーザー管理③(トランザクション)「user_signup_tran.php」となります。

  • 30行目:SQL文の部分をストアドプロシージャ「pro_add_user_mst」を実行します。
<?php

//データベース接続情報を格納
include("config.php");

$txt_user = "";
$txt_email = "";
$txt_pass = "";

if($_SERVER['REQUEST_METHOD'] === 'POST'){

    //POSTデータの取得
    $txt_user = $_POST['txt_user'];
    $txt_email = $_POST['txt_email'];
    $txt_pass = $_POST['txt_pass'];

    $err = "";

    if($txt_user == ""){
        $err .= "【ユーザー名】";
    }
    if($txt_email == ""){
        $err .= "【メールアドレス】";
    }
    if($txt_pass == ""){
        $err .= "【パスワード】";
    }

    if($err == ""){
        $sql = "call pro_add_user_mst(:user_kj,:email,:password);";
        $dbh = new PDO($dsn, $user, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        //トランザクション処理
        try{
            $dbh->beginTransaction();

            $stmt = $dbh->prepare($sql);
            $stmt->bindValue(':user_kj', $txt_user, PDO::PARAM_STR);
            $stmt->bindValue(':email', $txt_email, PDO::PARAM_STR);
            $stmt->bindValue(':password', password_hash($txt_pass, PASSWORD_DEFAULT), PDO::PARAM_STR);
            $stmt->execute();

            $dbh->commit();
            echo "登録完了しました";

        } catch(Exception $e){

            echo "データの書き込みに失敗しました。". $e->getMessage();
            $dbh->rollBack();

        }
    }else{
        echo $err."を修正してください。";
    }
}
?>

<html>
<head>
    <title>会員登録</title>
</head>
<body>
    <h1>会員登録</h1>
    <form action="" method="POST">
        <p>
            <label>ユーザー名:</label>
            <input type="text" name="txt_user">
        </p>
        <p>
            <label>メールアドレス:</label>
            <input type="text" name="txt_email">
        </p>
        <p>
            <label>パスワード:</label>
            <input type="password" name="txt_pass">
        </p>
        <input type="submit" name="submit" value="会員登録する">
    </form>
</body>
</html>

演習問題

  1. 上記のコードを使用して、ファイル作成し、動作するようにしてみよう。
  2. 異なる処理を行うストアドプロシージャを作成し、実行してみよう。