2008年2月15日

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

ミヤカ様

ありがとうございます。

ご指示いただいたスクリプトを試してみました。
しかし、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@xxxxx>
To: "'PHP-users ML'" <php-users@xxxxx>
Sent: Thursday, February 14, 2008 5:11 PM
Subject: [PHP-users 33278] Re:MySql で二重書き込みを防ぐには?


> ミカヤです。
>
> REPLACEはインクリメントに手間が掛かるんですよね。
> DUPLICATE KEYが複数のユニークキーに使えない理由は分かりますが、
> 「複数」ではなく「複合」のユニークキーだった場合もORで判定され
> てしまうのかどうか気になりました。
>
> ちょっと実験した限りでは複合キーであれば期待通りの動きはしてい
> ましたが・・・。
>
>
>> -----Original Message-----
>> From: php-users-bounces@xxxxx
>> [mailto:php-users-bounces@xxxxx] On Behalf Of SAWAI-Shooskay
>> Sent: Thursday, February 14, 2008 4:23 PM
>> To: php-users@xxxxx
>> 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@xxxxx
>> http://ml.php.gr.jp/mailman/listinfo/php-users
>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>> http://oldwww.php.gr.jp/php/novice.php3
>>
>
> _______________________________________________
> 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
>

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




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