2015-10-30 2 views
0

У меня есть цикл, который выполняет итерацию через таблицу и отображает идентификатор клиента. Он отлично работает. В верхней части цикла он устанавливает переменную равной идентификатору клиента, а затем выводит ее на экран. Если в таблице указано семь элементов, в них отображаются семь OrderIds.Почему мой запрос Sum разбивает мой цикл?

Однако, если я попытаюсь использовать этот идентификатор клиента, чтобы выполнить оператор суммы, программа отображает результаты в первый раз, но затем завершает работу без ошибки после первой итерации, а не зацикливается, как если бы набор записей был уничтожен.

У меня полная потеря, чтобы понять, почему. Код ниже. Большое спасибо заранее:

include ("../Connections/PDOConnection.php") 

$Query= " 
SELECT distinct 
    OrderID, 
    CustID, 
    Name 
FROM 
    dbo.JNO_OrderHeader 
WHERE 
    CustID is Not Null 
"; 

$stmt = $pdo->prepare($Query); 

if ($stmt->execute()) { 

    while ($Order=$stmt->fetch(PDO::FETCH_ASSOC)){ 

     $OrderID = $Order['OrderID']; 
     echo "<br>OrderID: " . $OrderID; 


     $Query1 = "SELECT SUM(dbo.JNO_OrderDetail.ExtendedPrice) AS TotalOrderPrice 
        FROM dbo.JNO_OrderDetail 
        WHERE dbo.JNO_OrderDetail.OrderId = :OrderID"; 

     $stmt1 = $pdo->prepare($Query1); 
     $stmt1->bindValue("OrderID", $OrderID); 
     $stmt1->execute(); 
     $OrderTotal=$stmt1->fetch(PDO::FETCH_ASSOC);  

     echo "<br>Totals for order number ". $OrderID .": " . $OrderTotal['TotalOrderPrice']; 
    } 
} 

?> 
+0

Вы показываете ошибки PDO? Вы не можете запустить новый запрос в том же соединении, пока предыдущий не вернет все строки? Может быть, «fetchAll» будет полезен? Хм, какая база данных вы используете? Я предполагаю 'mysql'. Что бы это ни стоило проверить? –

+0

http://php.net/manual/en/pdo.error-handling.php –

+0

Это объясняет это полностью. Мне нужно новое соединение! Спасибо Спасибо! –

ответ

0

Как говорят люди, какова ошибка?

С первого взгляда это может быть повторное использование $pdo, попробуйте $pdo1, как вы это делали с другими переменными в цикле.

В любом случае, цикл и выдача нескольких инструкций SQL, подобных этому, не являются оптимальными. Подумайте о соединении и чем-то вроде этого?

SELECT 
    oh.OrderID, 
    oh.CustID, 
    oh.Name 
    SUM(od.ExtendedPrice) AS TotalOrderPrice 
FROM 
    dbo.JNO_OrderHeader oh 
LEFT JOIN 
    dbo.JNO_OrderDetail od ON od.OrderId = oh.OrderID 
WHERE 
    oh.CustID IS NOT NULL 
GROUP BY 
    oh.OrderID, 
    oh.CustID, 
    oh.Name 
+0

Другим вариантом будет подзапрос - 'select some_columns (выберите something_else from other_table) как extra_column from first_table'. В зависимости от данных он может быть быстрее или медленнее! –

+0

Зависит от курса, но, по крайней мере, в моем опыте работы с MySQL, подзапрос почти никогда не является более функциональным. – ficuscr

Смежные вопросы