如何在一次使用PDO
和PHP
的查询中更新后选择一行?
像这样:
function giftUpdate($username,$id,$date,$conn){
$update = $conn->prepare("UPDATE gifts SET used = 1 , user = :user , date = :date WHERE id = :id");
$update->bindParam("id" , $id );
$update->bindParam("date" , $date );
$update->bindParam("user" , $username );
$update->execute();
return $update ? true : false;
}
function giftGet($username,$currnetTime,$conn) {
$statment = $conn->prepare("SELECT * FROM gifts WHERE used = 0 ORDER BY `id` ASC");
$statment->execute();
$gift = $statment->fetch(PDO::FETCH_OBJ);
if($gift){
$voucher = $gift->code;
$voucherid = $gift->id;
$vouchertype = $gift->type;
$voucherkey = $gift->keys;
if($voucher){
$giftUpdate = giftUpdate($username,$voucherid,$currnetTime,$conn);
if($giftUpdate){
useUpdate($username , $conn);
}
}
}
usleep(50000);
return $gift ? $gift : false;
}
更新后,我需要选择同一行以将其发送给用户。
(我是一张有1000列凭证列表的表,默认情况下列“已使用”为0,并且根据用户请求,我需要在一个查询中将此行更新为1,然后选择该行。)
我在此功能中遇到的问题是某些用户将收到重复的凭证,并且代码已分配给多个用户。
在此情况下,您...可以使用事务处理方法吗?还是您建议根本不使用交易?
已编辑:
我最终更改了下面的代码,但仍然符合要求:
从使用过的礼物中选择ID = 0 ORDER BY id
ASC限制1进行更新)“);
但是当我从数据库中输入一个ID代替此代码时,它就可以了!
function giftGet($username, $currnetTime, $conn)
{
$uniqid = uniqid('vouchers_');
$update = $conn->prepare("UPDATE gifts SET used = 1, uniqueid =:uniqueid , user = :user , date = :date WHERE id = (
SELECT id FROM gifts WHERE used = 0 ORDER BY `id` ASC limit 1 FOR UPDATE)");
$update->bindParam("date", $currnetTime);
$update->bindParam("uniqueid", $uniqid);
$update->bindParam("user", $username);
$update->execute();
$updaterowCount = $update->rowCount();
if ($updaterowCount)
{
$statment = $conn->prepare("SELECT * FROM gifts WHERE uniqueid = :uniqueid ORDER BY `id` ASC");
$statment->bindParam("uniqueid", $uniqid);
$statment->execute();
$gift = $statment->fetch(PDO::FETCH_OBJ);
$voucherid = $gift->id;
if ($gift)
{
useUpdate($username, $voucherid, $conn);
}
}
return $gift ? $gift : false;
}
答案 0 :(得分:0)
我会更改餐桌礼物并添加一列uniqueid(varchar)。
然后使用
$uniqid = uniqid('vouchers_');
并重写您的更新
"UPDATE gifts SET used = 1, uniqueid =:UNIQUEID , user = :user , date = :date WHERE id = (
SELECT id FROM gifts WHERE used = 0 ORDER BY `id` ASC limit 1 FOR UPDATE)";
现在您可以通过uniqueid标识更新的记录。 在您的代码中,选择和更新之间存在时间间隔。 2个或更多用户可以同时开始选择,并在使用used = 1更新之前获得相同的凭单。