PDO多选查询

时间:2015-12-08 16:36:12

标签: php mysql pdo

我正试图从2个表中获取行。第一个查询有效。但第二个没有。这是我的代码:

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>';

行名称来自products表,名称价格来自price表。这是我得到的错误:

注意:未定义的索引:第15行的/var/www/html/design2/pages/cart.php中的价格

我确信查询正常。谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:0)

由于查询的结构方式,您正在接收未定义的索引。你有:

startService()

这结构为返回2个结果集。您在此处获取第一个结果集:

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

但是,您尝试访问该结果集中不存在的$ row [&#39; price&#39;]。该结果集仅是第一个SELECT的结果。如果只是var_dump($ row),你可以看到这个,看看你的结果集是什么样的。

看起来您可以组合查询,以便获得一个结果集:

$row = $result->fetch();

如果您无法将查询合并为一个,那么您应该迭代结果集并访问相关的$ 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;

需要考虑的一些事项:

  • 您可能需要LEFT JOIN而不是INNER JOIN。这取决于 产品是否总是有相应的记录 价格表。
  • 我不确定你想要实现的目标 限制1.您可能需要考虑和订购 - 除非确实如此 与您在结果中返回的记录无关。
  • 在分割$ cartproduct之后,您应该考虑测试您的变量$ productid和$ productquantity以验证它们是否具有您的预期值。如果一个是空的/空白怎么办?
  • 您应该在尝试访问特定索引处的结果数组之前测试结果。

例如:

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