2012-05-05 48 views
3

我想一個SELECT和UPDATE查詢相結合,避免duplicat選擇行。聯合SELECT和UPDATE,以避免重複選擇

這裏是我的示例代碼:

private function getNewRCode() { 

    $getrcodesql = "SELECT * FROM `{$this->mysqlprefix}codes` WHERE `used` = 0 LIMIT 1;"; 
    $getrcodequery = $this->mysqlconn->query($getrcodesql); 

    if(@$getrcodequery->num_rows > 0){ 

     $rcode = $getrcodequery->fetch_array(); 

     $updatercodesql = "UPDATE `{$this->mysqlprefix}codes` SET `used` = '1' WHERE `id` = {$rcode['id']};"; 
     $this->mysqlconn->query($updatercodesql); 

     $updateusersql = "UPDATE `{$this->mysqlprefix}users` SET `used_codes` = `used_codes`+1, `last_code` = '{$rcode['code']}', `last_code_date` = NOW() WHERE `uid` = {$this->uid};"; 
     $this->mysqlconn->query($updateusersql); 

     $output = array('code' => $rcode['code'], 
         'time' => time() + 60*60*$this->houroffset, 
         'now' => time() 
         ); 

     return $output; 

    } 

} 

我想執行$getrcodesql$updatercodesql一次,以避免相同的代碼被用於不同的用戶。

我希望你明白我的問題,知道了一個解決方案。

問候, 弗雷德裏克

回答

2

,如果你做輪用另一種方式是更加容易。
的一點是,您的客戶端可以之前生成一個唯一的值你做的UPDATESELECT

更改您的used列別的東西的類型,這樣就可以存儲一個GUID或它的時間戳,而不僅僅是0和1
(我不是一個PHP/MySQL的專家,所以你可能知道比我究竟使用)更好

然後,你可以這樣做(在僞代碼):

// create unique GUID (I don't know how to do this in PHP, but you probably do) 
$guid = Create_Guid_In_PHP(); 

// update one row and set the GUID that you just created 
update codes 
set used = '$guid' 
where id in 
(
    select id 
    from codes 
    where used = '' 
    limit 1 
); 

// now you can be sure that no one else selected the row with "your" GUID 
select * 
from codes 
where used = '$guid' 

// do your stuff with the selected row 
+0

非常感謝你爲這個偉大的想法,我會這樣實現它。 –