在mysql PDO中选择更新后的行



如何使用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按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;
}

我会更改表礼物并添加一个列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个或多个用户可以同时启动选择,在使用=1 更新之前收到相同的凭证

最新更新