我有一个写入MySQL表的页面。该表有一定数量的行(24)。
我有一个由rand()函数设置的$ id变量。我基本上想要在$ id处拉行,所以如果$ id为3,我想拉第三行。然后,我想检查该行是否设置了价格(表示该行正在使用)。如果没有价格,我想将$ id保持在已设置的值并继续查询。如果有价格,我想重新随机化$ id变量,并再次检查该行是否已用完。当它找到一个空行时,继续查询。
我的解决方案半工作,但由于某种原因,似乎有超过10%的机会覆盖已用过的行。我希望它永远不会覆盖用过的行。
这是我的代码:
mysql_select_db("delives0_booklet", $con);
$query = "SELECT * FROM booklet WHERE id = '$id'";
$res = mysql_query($query,$con);
$newId = $id;
while($row = mysql_fetch_array($res))
{
if($row['price'] != 0)
{
do{
$newId = rand(1, 24);
}while($newId == $id);
}
}
$id = $newId;
mysql_query("UPDATE booklet SET price = '$price', advertiser = '$advertiser', image = '$image', monthsRemaining = '$monthsRemaining', availability = 1 WHERE id = '$id'");
修改 我有这个想法。我遍历表格,然后将每个未填充点的“id”放入数组中。然后我从那个数组中随机挑选。但是,似乎有一个我找不到的错误,因为即使在循环运行之后,数组仍然显示其中没有任何内容,并且$ i是正确的数字。
mysql_select_db("delives0_booklet", $con);
$query = "SELECT * FROM booklet";
$res = mysql_query($query,$con);
$i = 0;
$isEmpty = array();
while($row = mysql_fetch_array($res))
{
if($row['price'] == 0)
{
$isEmpty[i] = $row['id'];
$i = $i + 1;
}
}
echo $i . " unfilled spots.";
$n = 0;
while($n<$i)
{
echo $isEmpty[$n];
$n = $n + 1;
}
if($i > 0)
{
$id = $isEmpty[rand(0, $i)];
}
if($i == 0)
{
echo 'All spots have been filled.';
}
答案 0 :(得分:1)
我认为这是一个顶级逻辑问题。因为您使用随机ID填充,所以可以获得重复的ID,因此当您更新“WHERE id ='$ id'”时,您可能会选择已填充的行。
我不知道你的目标,但也许使用自动增量ID,并删除你想要摆脱的行,是要走的路。一组滚动的行(一次24个)但是不断增加的id会阻止一个人误认为另一个。
答案 1 :(得分:1)
如果我理解问题是正确的,这应该有效:
SELECT *
FROM booklet
WHERE price = 0 OR price IS NULL
ORDER BY RAND()