gpt4 book ai didi

php - 无法使用嵌套的 while 循环执行准备好的语句

转载 作者:行者123 更新时间:2023-11-29 00:35:53 24 4
gpt4 key购买 nike

我在将一些代码从旧式 mysql 查询更改为准备中时遇到了麻烦。我认为问题是由于我使用了多个 while,每个 while 都有自己的查询,导致问题导致一次只有一个准备好的语句处于事件状态。

编辑:如果有人关心,我已经让它只使用 2 个循环,就像这样 -

function createDeskMenu()
{
global $bookingTimes, $dbconn;
$day0 = mktime(0, 0, 0, date("m") , date("d"), date("Y"));

$query = "SELECT location FROM location";
$result = mysqli_query($dbconn,$query);
mysqli_num_rows($result);
while ($row = mysqli_fetch_array($result))
{
$location = $row['location'];
echo "<h3>$location</h3><div>";
$query = $dbconn -> prepare("SELECT COALESCE( CountDesk, 0 ) total, name, d.desk_id, phone, fax, dock, pc FROM desk d LEFT JOIN (SELECT COUNT(booked.desk_id) CountDesk, desk_id FROM booked WHERE booking_id >=?)b ON d.desk_id = b.desk_id WHERE location=?");
$query->bind_param("is",$day0, $location);
$query->execute();
$query->bind_result($totalCount,$name,$desk_id,$phone,$fax,$dock,$pc);
while($query->fetch()) {
$total = count($bookingTimes) * 14 - $totalCount;
echo '<a href="?page=desk&desk='.$desk_id.'"><div class="desk"><b>'.$name.'
('.$total.' Available Bookings)</b><li>Facilities:';
if($phone){echo " Phone,";}if($fax){echo " Fax Machine,";}if($dock){echo " Laptop Dock.";}if($pc){echo " Desktop Workstation.";}
echo '</li></div></a><hr />';
}
$query->close();
echo '</div>';
}
}

最佳答案

你不能prepare()一个语句,而连接有行等待从另一个语句中获取。您必须首先关闭先前的结果集或从中获取所有行。

然而...

我看不到需要检索 location 的外部查询完全,因为它没有 WHERE条款。您正在选择所有 位置,因此可以完全忽略该部分。您使用外循环的全部目的是创建一个 <h3>对于每个位置,这是非常浪费的(除了最初导致代码中断)

相反,执行一个查询并在获取循环中检查位置是否已更改。当它改变时,输出你的标题

echo "<h3>$location</h3><div>";

因此完全删除外部查询和循环,并使用类似下面的模式来检测 location 中的变化.确保 ORDER BY location所以它们是为你分类的。

不需要绑定(bind)参数。您可以通过调用 query() 来执行此操作,因为位置不再可变并且 $day0已知是来自 mktime() 的时间戳.

// Substitute a query() call and $day0 can be inserted directly.
// This one query fetches all locations sorted...
$query = $dbconn->query("
SELECT
COALESCE( CountDesk, 0 ) total,
name,
d.desk_id,
phone,
fax,
dock,
pc
FROM
desk d
LEFT JOIN (
SELECT COUNT(booked.desk_id) CountDesk, desk_id FROM booked WHERE booking_id >= $day0
)b ON d.desk_id = b.desk_id
ORDER BY location");

// Store the last location in a variable which starts empty...
$location = "";

while($row = $query->fetch_assoc()) {
// on change of $location, update the variable.
if ($location !== $row['location']) {
$location = $row['location'];
// And output the new location value
echo "<h3>$location</h3><div>";
}

// Do the rest of your loop.
$total = count($bookingTimes) * 14 - $row['total'];
echo '<a href="?page=desk&desk='.$row['desk_id'].'"><div class="desk"><b>'.$row['name'].'
('.$total.' Available Bookings)</b><li>Facilities:';
if($row['phone']){
echo " Phone,";
}
if($row['fax']){
echo " Fax Machine,";
}
if($row['dock']){
echo " Laptop Dock.";
}
if($row['pc']){
echo " Desktop Workstation.";
}
echo '</li></div></a><hr />';
}
$row->close();
echo '</div>';

现在谈谈它失败的原因......你不能prepare()一个新的语句,同时还有剩余的行要从以前的语句或查询中获取。您必须首先获取所有行,或者使用 $stmt->close() 关闭语句.如此有效,您无法嵌套获取循环。

更好的方法是先将所有行提取到一个数组中,然后循环遍历该数组:

while ($row = $first_query->fetch()) {
// Append all onto an array
$first_query_rows[] = $row;
}
// Then loop over that
foreach ($first_query_rows as $row) {
// Do a new query with $row
}

不过,通常情况下,这可以通过适当的 JOIN 来解决。 .

关于php - 无法使用嵌套的 while 循环执行准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14318731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com