[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 メーリングリストの案内