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

Toshiki Inoue hyphen777 @ gmail.com
2008年 2月 15日 (金) 17:21:17 JST


少しSQLの基礎を勉強されると良いと思います。

ミヤカ様のスクリプトに合わせてテーブルを作るとしたら
> dateとbidを組み合わせた一つのユニークキーを用意したという前提でSQL文を作っています。
ということですので、

datebid varchar(10)
UNIQUE KEY `datebid` (`datebid`)

といったようなカラムが必要になるのではないでしょうか。


> UNIQUE KEY `bid` (`bid`),
> UNIQUE KEY `date` (`date`)

の部分だけ見ても実現したい機能と矛盾していますね。
これでは同じ日付のレコードは1つしか持てないので、
複数サイトのレコードを持てなくなってしまいます。

--
T.Inoue


08/02/15 に 萩原 <namioh @ sea.plala.or.jp> さんは書きました:
> ミヤカ様
>
> ありがとうございます。
>
> ご指示いただいたスクリプトを試してみました。
> しかし、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">
>
> お忙しいところお手数お掛けいたします。
>
>
> 萩原
>


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