Sessions/foreach 我的购物车有问题
Sessions/foreach issue with my shopping cart
这个问题实际上是另一个问题的延续。我想确保我在这一篇中陈述了所有细节。
我和 Php 一样是一个相对较新的程序员,我的任务是制作购物车
我从数据库中获取我的产品数据 -> 然后我点击一个产品 -> 它会转到一个页面,在该页面中将产品 ID、产品名称和价格添加到与 array_push 的会话中,然后结束up back on the same page with where the cart is (购物车与产品线在同一页面上)
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 时,产品名称和价格将发送到 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>.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["productname"] 我的 foreach returns 警告:非法字符串偏移量 'productname'
我不知道如何完成所有这些工作,因为我仍然是 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']));
当我 print_r 在 cart.php 上时,我得到以下回复
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/>';
}
我仍然遇到同样的错误
Warning: Illegal string offset 'productname'
所以我还有哪里做错了吗?我现在明白我需要发送一组东西而不是我以前做的,但我仍然不太明白为什么它现在失败了
非常感谢大家对我的帮助!
我似乎已经解决了问题。我听取了每个人的建议,终于有了一个有效的 foreach 语句。现在产品已订购并将出现在购物车中
再次感谢所有帮助过我的人!
抱歉,我没有看到你有新问题,所以我把这个作为对你另一个问题的评论。
用这个替换你的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 数组推到那里,我们可能会得到一堆我们不需要的其他东西(用户可以放置 &someothervariable=aReallyReallyLongString),然后它们也会在我们的会话中结束。
<?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' ] . ' ';
?>
这个问题实际上是另一个问题的延续。我想确保我在这一篇中陈述了所有细节。
我和 Php 一样是一个相对较新的程序员,我的任务是制作购物车
我从数据库中获取我的产品数据 -> 然后我点击一个产品 -> 它会转到一个页面,在该页面中将产品 ID、产品名称和价格添加到与 array_push 的会话中,然后结束up back on the same page with where the cart is (购物车与产品线在同一页面上)
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 时,产品名称和价格将发送到 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>.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["productname"] 我的 foreach returns 警告:非法字符串偏移量 'productname'
我不知道如何完成所有这些工作,因为我仍然是 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']));
当我 print_r 在 cart.php 上时,我得到以下回复
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/>';
}
我仍然遇到同样的错误
Warning: Illegal string offset 'productname'
所以我还有哪里做错了吗?我现在明白我需要发送一组东西而不是我以前做的,但我仍然不太明白为什么它现在失败了
非常感谢大家对我的帮助! 我似乎已经解决了问题。我听取了每个人的建议,终于有了一个有效的 foreach 语句。现在产品已订购并将出现在购物车中
再次感谢所有帮助过我的人!
抱歉,我没有看到你有新问题,所以我把这个作为对你另一个问题的评论。
用这个替换你的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 数组推到那里,我们可能会得到一堆我们不需要的其他东西(用户可以放置 &someothervariable=aReallyReallyLongString),然后它们也会在我们的会话中结束。
<?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' ] . ' ';
?>