30-ユーザー管理③(トランザクション)で実装したプログラムをベースに、ストアドプロシージャでの処理を学びます。
機能概要
データベース準備
下記のSQL文を実行し、ユーザーマスタ(user_mst)を構築します。詳細は、14-ユーザー管理①(サインアップ)にて確認してください。
プログラミングコード
「pro_add_user_mst」SQL文(ストアドプロシージャ)
- 3行目:「pro_add_user_mst」がすでに存在する場合には、ストアドプロシージャを削除します。
- 4行目:「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>
演習問題
- 上記のコードを使用して、ファイル作成し、動作するようにしてみよう。
- 異なる処理を行うストアドプロシージャを作成し、実行してみよう。