Sessions / foreach问题与我的购物车

时间:2016-02-28 00:00:04

标签: php session shopping-cart

这个问题实际上是另一个问题的延续。我想确保说明这一内容的所有细节。

我是Php之类的一个相对较新的程序员,我有这个任务,我必须制作一个购物车

我从数据库中获取产品数据 - >然后我点击产品 - >它转到一个页面,它将productid,productname和price添加到带有array_push的会话中,然后它返回到购物车所在的同一页面上(购物车与产品线位于同一页面上)

cart.class.php - >这是我最初收到产品数据的页面。通过使用我的getAllproducts();我得到了所有数据,然后循环显示6个产品。

<?php

class Cart
{
private $con;
private $productid;

function __construct(){
    $this->con = new PDO('mysql:host=localhost;dbname=#', '#', '#');
}

public function getProductDataById($passedId){

    $this->productid = $passedId;

    $statement = $this->con->prepare("SELECT productname, productdescription, productimage, price FROM producten WHERE productid = :productid");
    $statement->execute(array("productId" => $this->productid));
    $data = $statement->fetch();

    return($data);
}
public function getAllproducts(){

    $statement = $this->con->prepare("SELECT productid, productname, productdescription, productimage, price FROM producten");
    $statement->execute();
    $data = $statement->fetchAll();

    return($data);
}
}
?>

接下来,我使用 Cart.php 来展示我的产品。在这个页面上,我循环浏览产品,然后当有人点击订单(bestellen)productid时,productname和price将被发送到add_to_cart.php

<?php
/*errors */
error_reporting(E_ALL);
ini_set("display_errors", 1);

/*Php classes */
require_once("../classes/cart.class.php");

$products = new cart();
$data = $products->getAllproducts();

?>
<title>Side Cart</title>
</head>
<body>
<header>
    <div id="cd-cart-trigger"><a class="cd-img-replace" href="#0">Cart</a></div>

<div class="container productline">
    <div class="row">
    <?php
    foreach($data as $value){

        echo '<div class="col-md-4 productcage">';
        echo '<h2 class="product_name">'.$value["productname"].'</h2>';
        echo '<p class="price_tag">€'.$value["price"].' euro</p>';
        echo '<p class="#">'.$value["productdescription"].'...</p>';
        echo '<a href="/shoppingcart/php/add_to_cart.php?productid='.$value["productid"] . "&productname=" . $value["productname"]. "&price=" . $value["price"].'" class="btn btn_order addcart">Add to cart <span class="glyphicon glyphicon-shopping-cart"></span></a><br/><br/>';
        echo '</div>';
    }
    ?>
    </div>
</div>
<div id="cd-shadow-layer"></div>
 // Here's where the shopping cart starts 
<?php

session_start();

if(isset($_SESSION["cart"]) && count($_SESSION["cart"])> 0)

{

echo '<div id="cd-cart">';
echo '<h2>Cart</h2>';
echo '<ul class="cd-cart-items">';
echo '<li>';

 foreach($_SESSION['cart'] as $id => $value)
{
    echo 'Product Name ' . $value["productname"] . '<br/>';
    echo 'Product ID ' . $value["productid"] . '<br/>';
    echo 'Product Price ' . $value["price"] . '<br/>';
    echo '<br/>';
}

echo '</li>';
echo '</ul>';
echo '<div class="cd-cart-total">';
echo '<p>Total <span>$39.96</span></p>';
echo '</div>';

echo '<a href="#0" class="checkout-btn">Checkout</a>';
echo '<p class="cd-go-to-cart"><a href="#0">Go to cart page</a></p>';
echo '</div>';

}

?>

然后我去 add_to_cart.php

这会将会话发送回cart.php,其中我想在购物车中循环产品

<?php
 session_start();

 if(empty($_SESSION['cart'])){
 $_SESSION['cart'] = array();
 }

 array_push($_SESSION['cart'], $_GET['productid'], $_GET['productname'], $_GET['price']);

 ?>

  <p>Het product is toegevoegd aan uw winkelwagen</p> <a href="../cart.php">Naar winkelwagen</a>

TL; DR当我尝试循环$ value [&#34; productname&#34;]我的foreach返回警告:非法字符串偏移&#39; productname&#39;

我不知道如何完成所有这些工作,因为我还是PHP的初学者。如果有人想花时间弄清楚我的愚蠢错误,那将是非常了不起的。

我希望我已经足够清楚了。对于给您带来的不便,我深表歉意

 foreach($_SESSION['cart'] as $id => $value)
 {
    echo ($_SESSION[ 'cart' ][ $id ] . " " . $value); //1 1solexfiets1 solexfiets115.99 15.99
    var_dump(($_SESSION[ 'cart' ][ $id ] . " " . $value)); // string(3) "1 1" string(23) "solexfiets1 solexfiets1" string(11) "15.99 15.99"
}

我已将array_push更改为

 array_push($_SESSION['cart'], array('productid' => $_GET['productid'], 'productname' => $_GET['productname'], 'price' => $_GET['price']));

当我在cart.php上print_r时,我得到以下回复

Array ( [0] => 1 [1] => solexfiets1 [2] => 15.99 [3] => Array ( [productid] => 1 [productname] => solexfiets1 [price] => 15.99 ) )

但是当我尝试像这样循环它时

   foreach($_SESSION['cart'] as $id => $value)
{
    echo 'Product Name ' . $value["productname"] . '<br/>';
    echo 'Product ID ' . $value["productid"] . '<br/>';
    echo 'Product Price ' . $value["price"] . '<br/>';
    echo '<br/>';
}

我仍然得到同样的错误

  

警告:非法字符串偏移&#39; productname&#39;

那么我还有什么问题吗?我现在明白,我需要发送一系列的东西,而不是我以前做过的东西,但我仍然不能理解为什么它现在失败了

非常感谢你帮助我! 我好像已经解决了这个问题。我接受了大家的建议,最后我得到了一份工作的foreach声明。现在订购的产品将出现在购物车中

再次感谢所有帮助过我的人!

2 个答案:

答案 0 :(得分:1)

抱歉,我没有看到你有新问题,所以我把这个问题作为评论给你的另一个。

用这个替换你的array_push,让我知道这是否适合你。

array_push($_SESSION['cart'], array('productid' => $_GET['productid'], 'productname' => $_GET['productname'], 'price' => $_GET['price']));

你的问题是你将相关数据推送到一个数组($ _SESSION ['cart'])但不保持这种关系 - 用这种方式想一想:

$ _ GET是一个包含大量数据的数组 - 当你引用该数组的特定部分(例如$ _GET ['productname'])时,你要从它的集合中删除它并用它做一些事情 - 使用你的array_push你只是将东西推入另一个数组($ _SESSION ['cart'])但不保持关系 - 所以你反复将一堆东西推入$ _SESSION ['cart'],它们都会迷失 - 他们不再保持彼此的关系。

我们所做的是推送你想要的东西的数组(集合),所以$ _SESSION ['cart']现在包含几个东西,而不仅仅是东西。

另一种想到这一点的方法是 - 你可以这样做:

array_push($_SESSION['cart'], $_GET); 

这会产生相同的效果,因为我们将$ _GET数组推送到我们的其他数组中,因此保持关系 - 你不想这样做的原因是因为,在上面的例子中,我们创建了一个只有我们需要的数据的新数组。如果我们只是在那里推送整个$ _GET数组,我们最终会得到一些我们不需要的其他东西(用户可以放置&amp; someothervariable = aReallyReallyLongString),然后这也会在我们的会话中结束。

答案 1 :(得分:0)

<?php
    session_start();

    $_SESSION[ 'cart' ] = array();

    array_push( $_SESSION[ 'cart' ], array( 'productid' => 1, 'productname' => 'product1', 'productprice' => 15.99 ) );
    array_push( $_SESSION[ 'cart' ], array( 'productid' => 2, 'productname' => 'product2', 'productprice' => 4.99 ) );
    array_push( $_SESSION[ 'cart' ], array( 'productid' => 3, 'productname' => 'product3', 'productprice' => 17.99 ) );

    foreach( $_SESSION[ 'cart' ] AS $arr )
        echo $arr[ 'productname' ] . ' ';
?>