2008年2月14日

[PHP-users 33271]MySqlで二重書き込みを防ぐには?

MySqlを利用したアクセスカウンターを作成しています。
アクセス数の多いサイト用なので1アクセス1レコードではなく、
日付け毎に1日の合計数がレコードにカウントされていく仕組みです。

流れとしては、

アクセスがあった時点で本日のレコードがあるかチェック

レコードが無かったら本日(20080214)を新規でインサート or すでに本日のレコードがあったら本日に1カウントupdate

という簡単な流れです。

今回問題なのは、レコードが無かった場合(本日最初のアクセス)が、数件同時アクセスだった場合に
同じレコードが複数追加されています。

このような仕組みを作る場合、MySqlでのlockはどのように行うのでしょうか?

詳しい方ご教授お願いします。


■実際のカウント用スクリプトです

<?

//DB接続

$host = "******";
//ユーザー
$us = "******";
//パスワード
$pas = "******";
//データベース
$db = "*******";

$con = mysql_connect($host,$us,$pas);
if(!$con){echo "接続失敗";}
mysql_select_db($db);

//今日を取得
$m = date("Ymd");

//DBから今日のレコード有無をチェック
$sql = "SELECT count(*) FROM counter ";
$sql .= "where date = '$m' && bid = '$_GET[bid]'";
// ※複数のサイト連動のカウンターなのでサイトの識別を bid で分けています。

$reslut = mysql_query($sql);
$res = mysql_fetch_array($reslut);

//カウント
if(!$res[0]){ //なかったら新規レコード追加

$sql = "insert into counter set bid = '$_GET[bid]',date = '$m',$_GET[type] =
'1',ac = '1'";
mysql_query($sql);

}else if($res[0]){ //あったらカウント追加

$sql = "update counter set $_GET[type] = $_GET[type]+1,ac = ac+1 where date
= '$m' && bid = '$_GET[bid]'";

mysql_query($sql);

}

?>

_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3

投稿者 xml-rpc : 2008年2月14日 15:24
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/69742
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。