我想合并选择和更新查询,以避免重复选择行。
下面是我的示例代码:
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
,以避免同一代码用于不同的用户。我希望你能理解我的问题并知道解决办法。
问候语,
弗雷德里克
最佳答案
如果你换个方式做就容易多了。
关键是,在您执行UPDATE
和SELECT
之前,您的客户机可以生成一个唯一的值。
将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
关于php - 结合SELECT和UPDATE以避免重复选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10461514/