14-ユーザー管理①(サインアップ)で実装したプログラムをベースに、トランザクション処理を学びます。
機能概要
データベース準備
下記のSQL文を実行し、ユーザーマスタ(user_mst)を構築します。詳細は、14-ユーザー管理①(サインアップ)にて確認してください。
プログラミングコード
「user_signup_tran.php」ユーザー登録ページファイル
元となるプログラムは、14-ユーザー管理①(サインアップ)「user_signup.php」となります。
- 4行目:「config.php」を読み込み、その中の変数情報を使用することができるようになります。
- 48行目~66行目:トランザクション処理の範囲となります。
- 50行目:beginTransaction()を利用して、トランザクション処理を開始します。
- 56行目:execute()でSQL文を実行します。
- 58行目:エラーが無い場合は、commit()で処理を確定します。
- 63行目:エラーが有る場合は、rollback()でSQL処理をすべてもとに戻します。
<?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 = "insert into user_mst("
."user_kj"
.",email"
.",password"
.",delete_ku"
.",insert_at"
.",update_at"
.") values ("
.":user_kj"
.",:email"
.",:password"
.",'0'"
.",now()"
.",now()"
.");";
$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>
演習問題
- 上記のコードを使用して、ファイル作成し、動作するようにしてみよう。
- 他のプログラムでSQL文を実行する際に、トランザクション処理を取り入れてみよう。