0

我绑定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计数时如何更新一条记录?

4

3 回答 3

1

如果我理解正确,您想使用给定的 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 是否处于“未预订”之类的状态。

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

于 2012-04-28T16:31:55.617 回答
1

你可以在你的代码中使用 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")

PS。我认为您的代码会存在 SQL 注入安全问题的风险。请也看一下。

于 2012-04-28T16:17:17.293 回答
0

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

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

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

然后像 update table set sold =no limit 10 这样的 SQL 语句应该这样做。(未经测试的伪代码)

于 2012-04-28T16:13:35.450 回答