繁体   English   中英

PDO多项选择查询

[英]PDO multiple select queries

我正在尝试从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>';

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

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

我确定查询有效。 谁能告诉我我在做什么错?

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

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

但是然后您尝试访问该结果集中不存在的$ row ['price']。 该结果集只是第一个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索引。 看起来像:

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

要考虑的一些事情:

  • 您可能需要一个LEFT JOIN而不是一个INNER JOIN。 这取决于产品在价格表中是否始终有相应的记录。
  • 我不确定您要使用LIMIT 1实现什么。您可能需要考虑和ORDER BY-除非返回结果的记录并不重要。
  • 您应该考虑对变量$ productid和$ productquantity进行测试,以在拆分$ cartproduct之后验证它们是否具有预期值。 如果一个是空/空白怎么办?
  • 在尝试以特定索引访问结果数组之前,应测试结果。

例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM