2014-09-25 13 views
0

我正在嘗試執行查詢並執行查詢。第一個循環顯示所有客戶數據,第二個循環顯示該客戶的訂單。該代碼我到目前爲止有:PHP準備語句 - 獲取在while循環中有查詢的錯誤

$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); 

我不明白髮生了什麼。任何幫助,將不勝感激。

回答

1

編輯我的答案是錯的,我想這些都是基於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()提取所有結果,這樣的條件是 「完成」 。這可以讓你開始另一種說法。 希望它有效。

+0

我喜歡這樣,我給它一個鏡頭,並得到這個錯誤:「調用未定義的方法mysqli_stmt :: fetchAll()」 – 2014-09-25 11:56:05

+0

糟糕,這是因爲你正在使用MySQLi的東西,我想到了PDO。 也許這會幫助你: http://php.net/manual/en/mysqli-result.fetch-all.php – theiNaD 2014-09-25 11:58:16

1

如果您與MySQL交談,您一次只能提出一個問題(查詢)。你必須等待完整的迴應,然後才能問下一個問題。在你的情況下,第一個查詢返回多個響應 - 並且在收集完所有行之前運行第二個查詢。

在PHP中,您有用於緩衝和無緩衝SQL請求的函數(在您的情況下爲$stmt->store_result())。緩衝意味着:整個響應從MySQL收集並由PHP緩衝。查看PHP手冊以獲取有關詳細信息Buffered and Unbuffered queries

因此,無論何時在查詢中需要查詢時,都必須緩衝外部查詢。當使用mysqli_stmt時,請檢查mysqli_stmt::store_result()。還可以選擇將所有行收集到數組中,首先,通過該數組執行輔助查詢(請參閱iNaD的答案)。

注意:處理大型數據集時,緩衝結果可能需要大量內存。完美的SQL解決方案是LEFT JOIN。這也可以讓你避免運行查詢的hunderts,這很慢。

$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

+0

簡而言之:增加'$ stmt-> store_result()''低於$ stmt->執行( );'和你的代碼將工作。但JOIN可能會更明智。 – BurninLeo 2014-09-25 12:35:01

0

我覺得你可以將這段代碼

while ($stmt->fetch()) { 

,而是U可以寫

while ($row = $stmt->fetch()) {