我正试图在查询中执行查询。第一个循环显示所有客户数据,第二个循环显示该客户的订单。到目前为止我拥有的代码:
$stmt = $conn->prepare("SELECT * FROM Customers
WHERE travel_Date >= ?
AND travel_Date <= ?
".$searchOption."
LIMIT ?
OFFSET ?");
$todayDateFrom = $todayDate." 00:00:00";
$todayDateTo = $todayDate." 23:59:59";
$stmt->bind_param("ssii", $todayDateFrom, $todayDateTo, $limit, $offset);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($customer_ID, $name, $etc);
while ($stmt->fetch()) {
$stmt_Order = $conn->prepare("SELECT * FROM Orders
WHERE customer_ID= ?");
$stmt_Order->bind_param("i", $customer_ID);
$stmt_Order->execute();
$stmt_Order->bind_result($order_ID, $order_Name);
}
第一个循环对我来说很好,当我添加第二个查询时,我得到了以下错误:
在中进行新语句准备之前,必须提取所有数据
与这条线有关:
$stmt_Order = $conn->prepare("SELECT * FROM Orders
WHERE customer_ID= ?");
对中的非对象调用成员函数bind_param()
与这条线相关的:
$stmt_Order->bind_param("i", $cust_Customer_ID);
我不明白发生了什么。如有任何帮助,我们将不胜感激。
EDIT我的答案是错误的,我认为这些是基于PDO的语句,但使用了mysqli。但fetch_all
仍然有帮助:
http://php.net/manual/en/mysqli-result.fetch-all.php
无法尝试,但这应该有效:
$stmt = $conn->prepare("SELECT * FROM Customers
WHERE travel_Date >= ?
AND travel_Date <= ?
".$searchOption."
LIMIT ?
OFFSET ?");
$todayDateFrom = $todayDate." 00:00:00";
$todayDateTo = $todayDate." 23:59:59";
$stmt->bind_param("ssii", $todayDateFrom, $todayDateTo, $limit, $offset);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($customer_ID, $name, $etc);
foreach ($stmt->fetch_all() as $customer) {
$stmt_Order = $conn->prepare("SELECT * FROM Orders
WHERE customer_ID= ?");
$stmt_Order->bind_param("i", $customer_ID);
$stmt_Order->execute();
$stmt_Order->bind_result($order_ID, $order_Name);
}
->fetch_all()
获取所有结果,因此查询已"完成"。这允许您开始另一个语句。希望它能起作用。
如果您使用MySQL,一次只能提出一个问题(查询)。你必须等待完整的回复,然后才能询问下一个。在您的情况下,第一个查询返回多个响应,第二个查询在收集所有行之前运行。
在PHP中,您有用于缓冲和非缓冲SQL请求的函数(在您的情况下为$stmt->store_result()
)。缓冲意味着:整个响应从MySQL中收集,并由PHP进行缓冲。查看PHP手册了解有关缓冲查询和无缓冲查询的详细信息
因此,每当您需要查询中的查询时,都必须缓冲外部查询。使用mysqli_stmt
时,请检查mysqli_stmt::store_result()
。此外,还可以选择首先将所有行收集到一个数组中,然后遍历该数组以执行辅助查询(请参阅来自theiNaD的答案)。
注意:在处理大型数据集时,缓冲结果可能需要大量内存。完美的SQL解决方案是LEFT JOIN
。这也将使您免于运行大量的查询,这是非常缓慢的。
$stmt = $conn->prepare("SELECT * FROM Customers c
LEFT JOIN Orders o ON (o.customer_ID = c.id)
WHERE travel_Date >= ?
AND travel_Date <= ?
".$searchOption."
LIMIT ?
OFFSET ?");
BurninLeo
我认为你可以替换这个代码
while ($stmt->fetch()) {
相反,你可以写
while ($row = $stmt->fetch()) {