While循环只能找到最后一次迭代

4

我正在尝试搭建一个网店(这是一个项目),购物车使用的是数据库,我会根据用户信息获取相应的信息并打印。但是我的 while 循环只能找到最后一个商品而不能找到其他两个。现在我很确定旧数据被覆盖了,因此不会被打印出来,但我不知道该如何解决这个问题。

以下是我目前的代码:

<?php
if(isset($_SESSION['userid'])){

    $db = new PDO('mysql:host=localhost;dbname=ismsite', 'root', 'e-scooter');
    $result = $db->prepare("SELECT * FROM cart where user_id=:userid ORDER BY cart_id DESC LIMIT 3 ");
    $result->bindParam(':userid', $_SESSION['userid']);
    $result->execute();
    $info = array();

    while($row = $result->fetch(PDO::FETCH_ASSOC)){

        $pid = $row['product_id'];
        $quantity = $row['quantity'];

        $result = $db->prepare("SELECT * FROM Products WHERE productID=:pid");
        $result->bindParam(':pid', $pid);
        $result->execute();

        while($row = $result->fetch(PDO::FETCH_ASSOC)){
            echo $row['naam'];
        }

    }
}
else{

    echo "Je moet inloggen om te kunnen winkelen.";

}
?>

有人能帮我解决这个问题吗?


4
你在两个循环中都使用了 $row$result 这两个变量名,导致内部循环中的值会覆盖外部循环中的值......这很可能会出现问题......如果你必须要嵌套循环,那么至少对于 $result 这个变量名,应该使用不同的变量名。 - Mark Baker
4
如果你学会使用SQL JOIN操作,那么你甚至不需要嵌套循环。 - Mark Baker
我不懂SQL连接,这只是我大一第二学期。 - Waro1234
但是你可以自己阅读/学习一些东西,对吧? - Jay Blanchard
1
尝试使用此查询替换您的主要查询。删除第二个查询和第二个while循环。echo $row['naam'],并查看您获得的结果。 SELECT c.*,p.* FROM cart c INNER JOIN Products p ON p.product_id = c.product_id where user_id=:userid ORDER BY cart_id DESC LIMIT 3 我假设product_id是两个表中的字段。 - ArtleMaks
我认为这是发生的原因是覆盖了一个变量,例如 $result、$row,请检查我的答案。 - Parth Chavda
4个回答

2
您的代码覆盖了类似$result,$row的变量。在内部循环中,您覆盖了一个$row和$result,所以您的外部While循环不能正常工作。
     while($row = $result->fetch(PDO::FETCH_ASSOC)){
                                    $pid = $row['product_id'];
                                    $quantity = $row['quantity'];

                                    $result1 = $db->prepare("SELECT * FROM Products WHERE productID=:pid");
                                    $result1->bindParam(':pid', $pid);
                                    $result1->execute();

                                    while($row1 = $result1->fetch(PDO::FETCH_ASSOC)){
                                        echo $row1['naam'];
                                    }
}

2

您的变量名称存在冲突。 尝试这样做:

if(isset($_SESSION['userid'])){
    $db = new PDO('mysql:host=localhost;dbname=ismsite', 'root', 'e-scooter');
    $cart = $db->prepare("SELECT * FROM cart where user_id=:userid ORDER BY cart_id DESC LIMIT 3 ");
    $cart->bindParam(':userid', $_SESSION['userid']);
    $cart->execute();
    $info = array();

    while($row = $cart->fetch(PDO::FETCH_ASSOC)){
        $pid = $row['product_id'];
        $quantity = $row['quantity'];
        $products = $db->prepare("SELECT * FROM Products WHERE productID=:pid");
        $products->bindParam(':pid', $pid);
        $products->execute();

        while($product = $products->fetch(PDO::FETCH_ASSOC)){
              echo $product['naam'];
        }
}

1

你应该使用SQL JOIN

试试这种方式:

 $db = new PDO('mysql:host=localhost;dbname=ismsite', 'root', 'e-scooter');
             $sql = "SELECT cart.*,Products.* FROM cart 
                    LEFT JOIN Products
                    ON cart.product_id = Products.productID
                    where cart.user_id=:userid ORDER BY cart.cart_id DESC LIMIT 3"; 
                $result = $db->prepare($sql);
                $result->bindParam(':userid', $_SESSION['userid']);
                $result->execute();                   

                while($row = $result->fetch(PDO::FETCH_ASSOC)){
                   echo $row['naam'];
                }

这仍然只打印最后一个项目。 - Waro1234

-1

使用for循环而不是while循环

for($i = 0, $c = count($result->fetch(PDO::FETCH_ASSOC)); $i < $c; $i++){
    //Do stuff here
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接