2008年2月14日

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

あまり考えていませんが.....

UPDATE XXX SET カウント=カウント+1 WHERE BID=1234 AND 日付=今日
if( UPDATEされた行数==0 )
{
INSERT INTO XXX(BID,日付,カウント) VALUES(1234,今日,1)
}

みたいな感じにするとか、
{BID,日付}の組でユニーク制約を仕掛けておいて、

UPDATE XXX SET カウント=カウント+1 WHERE BID=1234 AND 日付=今日
INSERT INTO XXX(BID,日付,カウント) VALUES(1234,今日,1)

INSERTでのユニーク制約によるエラーのみ無視。
みたいな感じにすればよいのではないでしょうか。

On Thu, 14 Feb 2008 15:24:30 +0900
萩原 <namioh@xxxxx> wrote:

> 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);
>
> }
>
> ?>

----------------------------------------------
前川 賢徳(Masanori maekawa)
mailto: maekawa@xxxxx

_______________________________________________
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日 16:02
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/69747
トラックバック
コメント
コメントする




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