在mysql PDO

时间:2018-07-23 07:43:55

标签: php mysql select pdo sql-update

如何在一次使用PDOPHP的查询中更新后选择一行?

像这样:

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;
}

1 个答案:

答案 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更新之前获得相同的凭单。