每次在 php 中计数 for 循环时更新一条 mysql 记录


Updating one mysql record each time the for loop counts in php

我正在update绑定一定数量的记录,在我的代码中这里$tickets = 10,这意味着我只需要根据mysql标准更新数据库中的10条记录,我在这里for loop更新所有记录(一次更新100条记录!

for ($counter = 1; $counter <= $tickets; $counter++) {
    $bookTicket = mysql_query("UPDATE units SET 
    ticketSold = 'No',
    userIdFK = '$chooseUser' 
    WHERE BusinessreservationIdFk = '$eventId' 
          AND classIDfk ='$chooseClass' ")
    or die(mysql_error());
    if ($bookTicket) 
    {
         echo "<br/>ticket " . $counter . "  done !";
    } 
    else 
    {
         echo "no<br/>";
    }                                                            
}

如何实现每次for计数时更新一条记录?

您可以在代码中使用 LIMIT,以便您的代码

for ($counter = 1; $counter <= $tickets; $counter++) {
    $bookTicket = mysql_query("UPDATE units SET 
    ticketSold = 'No',
    userIdFK = '$chooseUser' 
    WHERE BusinessreservationIdFk = '$eventId' 
          AND classIDfk ='$chooseClass' LIMIT 1") //ADD LIMIT TO THIS LINE
    or die(mysql_error());
    if ($bookTicket) 
    {
         echo "<br/>ticket " . $counter . "  done !";
    } 
    else 
    {
         echo "no<br/>";
    }                                                            
}

但我认为您应该改用它,以便一次只使用 1 个查询。

$bookTicket = mysql_query("UPDATE units SET 
ticketSold = 'No',
userIdFK = '$chooseUser' 
WHERE BusinessreservationIdFk = '$eventId' 
      AND classIDfk ='$chooseClass' LIMIT 10")

附言。我认为您的代码可能会给SQL注入安全问题带来风险。也请看一下。

如果我理解正确,您希望使用给定的 businessreservationIdFk 和 classIDfk 更新 10 个条目,并且这样做是为了如果没有足够的空闲条目,您最终不会得到 0 个保留,而是可用的保留(例如请求的 10 个中的 6 个)。

您可以通过以下方式执行此操作:

$bookTicket = mysql_query("UPDATE units SET 
    ticketSold = 'No',
    userIdFK = '" . $chooseUser . "' 
WHERE BusinessreservationIdFk = '" . $eventId . "' AND
    classIDfk ='" . $chooseClass . "'
LIMIT 
    10
") or die(mysql_error());
if ($bookTicket){
     $num = mysql_query("SELECT COUNT(1) FROM units WHERE userIdFK = '".$chooseUser."'");
     $num = mysql_fetch_array($num)[0];
     echo $num . " tickets booked.";
}else{
     echo "Not a single ticket available!";
}

这假设您的检查参数(WHERE 之后的参数)标识所有未预订的票证,但我认为您在这里有另一个错误,并且只检查票证是否来自预期的类型和预期的业务,而不是它们是否已经预订。也许你还应该检查一下 f ticketSold 是否处于"未预订"之类的状态。

编辑:请注意,不需要循环

如果没有看到 PHP 代码和数据库内容的更多上下文,看起来这段代码基本上会运行相同的 SQL 10 次。每次循环执行时,我没有看到$eventId或$chooseClass在哪里变化。而且,如果您的数据集中有超过 1 条(看起来是 100 条)匹配记录(用于 $eventId 和 $chooseClass 的组合),则上述代码将在每个循环中更新多个记录。

你需要首先从SQL的角度来看待它,问你想更新什么,看看SQL会做什么,然后讨论一个一次更新一条记录的循环。

或者,您是否试图将可能的门票中的 10 张标记为已售出?

然后一个像更新表集出售=没有限制10这样的SQL语句应该可以做到这一点。(未经测试的 psudo 代码)