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

萩原 namioh @ sea.plala.or.jp
2008年 2月 15日 (金) 16:49:36 JST


ミヤカ様

ありがとうございます。

ご指示いただいたスクリプトを試してみました。
しかし、INSERTとUPDATEともにうまく処理されませんでした。

自分でもON DUPLICATE KEY について調べてみましたが、
原因が特定できません。

何か基本的な事が間違っているのでしょうか?

今までのスクリプトをストップできないので、
counter2というテスト用テーブルを作成して試しています。



//カウント
if(!$res[0]){ //なかったらインサート

$sql = "insert into counter set bid = '$_GET[bid]',date = '$m',$_GET[type] = 
'1',ac = '1'";
mysql_query($sql);
echo $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);
echo $sql;

}

ここまでは正常に処理されています

//カウント(ここからご指示いただいたスクリプトテストです)
$type = $_GET[type];
$bid = $_GET[bid];

$sql = <<< EOSQL
  INSERT INTO counter2
    (datebid,date,bid,$type)
  VALUES
    ($m$bid,$m,$bid,1)
  ON DUPLICATE KEY UPDATE
    {$type}={$type}+1;
EOSQL;
mysql_query($sql);


-- 
-- テーブルの構造 `counter2`
-- 

CREATE TABLE `counter2` (
  `bid` int(10) NOT NULL,
  `ac` int(11) NOT NULL DEFAULT '0',
  `pc` int(11) NOT NULL DEFAULT '0',
  `mb` int(11) NOT NULL DEFAULT '0',
  `date` int(11) NOT NULL,
  UNIQUE KEY `bid` (`bid`),
  UNIQUE KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=ujis;


※以下のタグでカウンターを読み込んでいます

<img src='http://******.***/count.php?bid=1&type=pc' width="1" height="1">

お忙しいところお手数お掛けいたします。


萩原


----- Original Message ----- 
From: "池谷 美歌也" <mikaya_ikeya @ pakureserve.jp>
To: "'PHP-users ML'" <php-users @ php.gr.jp>
Sent: Thursday, February 14, 2008 5:11 PM
Subject: [PHP-users 33278] Re:MySql で二重書き込みを防ぐには?


> ミカヤです。
>
> REPLACEはインクリメントに手間が掛かるんですよね。
> DUPLICATE KEYが複数のユニークキーに使えない理由は分かりますが、
> 「複数」ではなく「複合」のユニークキーだった場合もORで判定され
> てしまうのかどうか気になりました。
>
> ちょっと実験した限りでは複合キーであれば期待通りの動きはしてい
> ましたが・・・。
>
>
>> -----Original Message-----
>> From: php-users-bounces @ php.gr.jp
>> [mailto:php-users-bounces @ php.gr.jp] On Behalf Of SAWAI-Shooskay
>> Sent: Thursday, February 14, 2008 4:23 PM
>> To: php-users @ php.gr.jp
>> Subject: [PHP-users 33277] Re: MySql で二重書き込みを防ぐには?
>>
>> さわいです。
>>
>> PHPネタじゃないんだけど・・ついつい 続けてしまいます。
>>
>>
>> > 確認してないので動くかどうか分かりませんが、dateとbidをユニークキーにして 
>> > 
>> > ON DUPLICATE KEYを使うと一回のクエリで全部済むと思います。
>> >
>> > マニュアルに「通常、複数の UNIQUE キーを持つテーブルに対しては ON 
>> > DUPLICATE KEY 節を使用しないようにする。」と
>> いう記述があるため、下
>> > のコードではdateとbidを組み合わせた一つのユニークキーを用意したという前提でSQL文を作っています。
>>
>> http://blog.flatz.jp/node/123
>>
>> には
>>
>> REPLACE で 複合ユニークキーで いけます って かいてありました。
>> _______________________________________________
>> 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 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 メーリングリストの案内