SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

プログラミング未経験から始めるPHP入門

プログラムをブラッシュアップするテクニックを学ぼう!
プログラミング未経験から始めるPHP入門~応用編(9)

第16回

  • X ポスト
  • このエントリーをはてなブックマークに追加

プログラムのブラッシュアップ(トランザクションの実装)

 トランザクションを管理するためには、これまで実装したプログラムをいくつか変更する必要があります。

 まずは、データベーステーブルを作り直す必要があるので、サンプルソースのsqlフォルダの中のcreate_table.sqlというファイルをメモ帳などで開いてください。開いたら、ブラウザからphpMyAdminにアクセスをします。次に左メニューから[ec]をクリック、更に上のツールバーで[SQL]タブをクリックし、create_table.sqlの内容をすべてコピーペーストし[実行する]ボタンをクリックしてください。この時、これまでの注文履歴はいったんすべて削除されるので、注意してください。

[SQL]タブをクリックし、create_table.sqlの内容をコピーペーストしたら[実行する]ボタンをクリック
[SQL]タブをクリックし、create_table.sqlの内容をコピーペーストしたら[実行する]ボタンをクリック

 「SQLは正常に実行されました」と画面に表示されることを確認してください。

 この作業はMySQLの「ストレージエンジン」を変更するために行った作業です。ストレージエンジンとは、MySQLが内部的に用いるエンジンのことで、このエンジンによってMySQLが内部に持つデータの格納の仕方が変わってきます。エンジンはテーブルごとに指定できます。エンジンは何種類も存在しますが、「MyISAM(マイアイサム)」か「InnoDB(インノディービー)」のいずれかを用いることが大半です。現在のテーブルはCREATE TABLE文で特にエンジンの指定をしていなかったため、MyISAMで動作しています。しかし、MyISAMは高速に動作する代わりにトランザクション機能が使えません。従って、先ほどのSQLでトランザクションをサポートするInnoDBに変更しました。

 InnoDBをエンジンとしたテーブルを作成するには、CREATE TABLE文の末尾に次の一文を付け加えます。

ENGINE=InnoDB

 MyISAMInnoDBの違いに関する詳細は、MySQL、MyISAMとInnoDBを選ぶ方法(マイコミジャーナル)などを参考にしてください。

 次に、includeフォルダにあるdatabase.phpを変更します。これまでdatabase.phpにおいては、

PEAR::setErrorHandling( PEAR_ERROR_CALLBACK, "handleError" );
function handleError( $error )
{
    die("エラーが発生しました。管理者までお問い合わせ下さい。");
}

 と記述しており、エラーが発生した場合は「エラーが発生しました。管理者までお問い合わせください。」のメッセージを表示し、処理を中断するようにしていましたが、ここにrollbackする処理を追加することができないので、次のように「/**/」形式でコメントアウトしてください。

/*
// エラー発生時の処理
PEAR::setErrorHandling( PEAR_ERROR_CALLBACK, "handleError" );
function handleError( $error )
{
    die("エラーが発生しました。管理者までお問い合わせ下さい。");
}
*/

 次に、cart.phpにトランザクション処理を行うPHPプログラムを埋め込みます。116行目付近の「カート内の合計金額を計算する」のコメント文の1行前に、以下のプログラムを追記してください。

// トランザクション開始
$mdb2->beginTransaction();

 次に、140行目付近の「$is_order_done = 1」の1行後に、以下を追記してください。

// トランザクションのコミット
$mdb2->commit();

 これで、処理が正常に終了した場合は、コミットされデータベースに反映されます。

 次にエラー処理を記述します。create_purchase関数内の、「$mdb2->prepare( )」命令の次の行に、以下を追記してください。

// エラー処理
if ( PEAR::isError( $stmt ) )
{
	$mdb2->rollback();
	die("エラーが発生しました。管理者までお問い合わせ下さい。");
}

 同じく、「$stmt->execute( )」命令の次の行に、以下を追記してください。

// エラー処理
if ( PEAR::isError( $res ) )
{
	$mdb2->rollback();
	die("エラーが発生しました。管理者までお問い合わせ下さい。");
}

 同じ要領で、create_purchase_detail関数にもエラー処理を追記してください。これらの追記の仕方が分からない場合は、サンプルソースの「STEP2_Trans」フォルダにcart.phpおよびdatabase.phpincludeフォルダ内)の完成版があるので参考にしてください。

 それでは、動作確認をしてみましょう。まず、正しく注文完了した際に、これまでどおりデータベースに注文情報が書き込まれていることを確認しましょう。コミット処理が正しく動作していることが分かるはずです。

 次に、正しく動作しなかった場合のロールバックの動作確認です。今回は、create_purchase_detail関数で実行するSQLを故意に間違えることで動作確認してみます。

 create_purchase_detail関数内の、

$res = $stmt->execute(
	array(
		$order_id,
		$item_code,
		$price,
		$num
	)
);

の部分を書き換え、

$res = $stmt->execute(
	array(
		$order_id,
		$item_code,
		$price,
		//$num
	)
);

のように、$numの部分をコメントアウトし、画面から注文確定してみます。d_purchaseテーブルのみに、中途半端にデータが登録されていないことを確認してください。

※注意

 ここでは、簡易な動作確認のためプログラムを直接書き換えましたが、実際にはプログラムを書き換えて動作確認することはあまり好ましくありません。そのため実務では、動作確認(テスト)専用のツールを用いたり、動作確認専用のプログラムを記述したりすることもあります。

次のページ
より読みやすいプログラムとするために

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
プログラミング未経験から始めるPHP入門連載記事一覧

もっと読む

この記事の著者

大家 正登(オオイエ マサト)

デジタルハリウッド『PHP 講座』講師。学生時代、スペイン語を専攻していたものの何故かプログラム言語に心が傾き、近所のフリープログラマーに弟子入り修行。その後中堅 SIer に 3 年間所属し、現在はフリーエンジニア。仕事の傍らジャズを演奏し、コントラバス 2 台と同居中。(ITエンジニア・大家正登のWeb...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4792 2010/01/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング