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

Taku HIGASHI oolong @ cslab.co.jp
2008年 2月 14日 (木) 15:56:24 JST


MySQL 4.1.0以降限定ですが…
INSERT文のON DUPLICATE KEY UPDATE 節で幸せになれそう。

08/02/14 に 萩原<namioh @ sea.plala.or.jp> さんは書きました:
> 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 @ php.gr.jp
>  http://ml.php.gr.jp/mailman/listinfo/php-users
>  PHP初心者のためのページ - 質問する前にはこちらをお読みください
>  http://oldwww.php.gr.jp/php/novice.php3
>


PHP-users メーリングリストの案内