2015-12-08 6 views
0

Я пытаюсь получить строки из 2 таблиц. Первый запрос работает. Но второй - нет. Это мой код:PDO multiple select queries

echo '<table width="100%">'; 
echo '<tr><td>Product</td><td>Quantity</td><td>Price</td><td>Remove</td></tr>'; 
foreach ($_SESSION['cart'] as $key => $cartproduct) { 
    list($productid, $productquantity) = split("\|", $cartproduct, 2); 
    global $db; 
    $result = $db->prepare('SELECT name FROM products WHERE ID= :ID LIMIT 1; SELECT price FROM prices WHERE productid = :ID AND quantity = :quantity LIMIT 1'); 
    $result->bindParam(':ID', $productid); 
    $result->bindParam(':quantity', $productquantity); 
    $result->execute(); 
    $row = $result->fetch(); 
    if($result->RowCount() == 1){ 
     echo '<tr><td>' . $row['name'] . '</td><td>' . $productquantity . '</td><td>' . $row['price'] . '</td><td><a href="?page=cart&removeproduct=' . $key . '">Remove</a></td></tr>'; //LINE15 
    }else{ 
     unset($_SESSION['cart'][$key]); 
    } 
} 
echo '</table>'; 

Название строки из таблицы продуктов и название указано из таблицы цен. Это ошибка, я получаю:

Примечание: Undefined индекс: цена в /var/www/html/design2/pages/cart.php на линии 15

Я уверен, что запрос работает. Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

Что линия 15 в cart.php? –

+0

@devlincarnate Извините, я добавил номер после строки 15. – jwz104

ответ

0

Вы получаете индекс, не определенный из-за того, как структурирован ваш запрос. У вас есть:

SELECT name FROM products WHERE ID= :ID LIMIT 1; SELECT price FROM prices WHERE productid = :ID AND quantity = :quantity LIMIT 1 

Это структурировано, чтобы вернуть 2 набора результатов. Вы хватаете первый набор результатов здесь:

$row = $result->fetch(); 

Но вы пытаетесь получить доступ к $ строки [ «цена»], который не существует в этом наборе результатов. Этот результирующий набор является результатом только первого SELECT. Вы можете увидеть это, если вы просто var_dump ($ row) и посмотрите, как выглядит ваш результат.

Похоже, что вы можете комбинировать свой запрос так, что вы получите один набор результатов:

SELECT p.name, pp.price FROM products p 
INNER JOIN prices pp ON p.ID = pp.productid 
WHERE p.ID= :ID AND pp.quantity = :quantity 
LIMIT 1; 

Если вы не можете комбинировать запросы в один, то вы должны выполнять итерацию над вашими наборами результатов и получить доступ к соответствующим $ row index. Это будет выглядеть примерно так:

while($row = $result->fetch()) { 
    if(isset($row['name'])) { 
     //do something 
    } else if(isset($row['price'])) { 
     //do something else 
    } 
} 

Некоторые вещи, чтобы рассмотреть следующие вопросы:

  • Вы, возможно, потребуется LEFT JOIN вместо INNER JOIN. Это зависит от , независимо от того, имеют ли товары всегда соответствующую запись в таблице цен .
  • Я не уверен, чего вы пытаетесь достичь с помощью LIMIT 1. Возможно, вам придется рассмотреть и ЗАКАЗАТЬ BY - если это действительно так, не имеет значения, в какую запись вы вернетесь в свой результат.
  • Вы должны рассмотреть возможность проверки ваших переменных $ productid и $ productquantity, чтобы убедиться, что они имеют ваши предполагаемые значения после разделения $ cartproduct. Что если пустой или пустой?
  • Перед попыткой доступа к массиву результатов по определенному индексу вы должны проверить свой результат.

Например:

if(isset($row['name']) && isset($row['price'])) { 
    //echo your results 
} else { 
    //return an error 
}