这个问题实际上是另一个问题的延续。我想确保我在这篇文章中陈述了所有细节。
我是一个相对较新的程序员,比如Php,我有这个任务,我必须制作一个购物车
。我从数据库中获取我的产品数据 ->然后我点击一个产品 ->它进入一个页面,在该页面中,它将产品ID,产品名称和价格添加到与array_push的会话中,然后它最终回到与购物车所在的同一页面上(购物车与产品线在同一页面上)
购物车.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);
}
}
?>
接下来,我使用购物车.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>$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
这会将会话发送回购物车.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["产品名称"] 我的 foreach 返回警告:非法字符串偏移量"产品名称"
我不知道如何使所有这些工作,因为我仍然是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购物车时.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/>';
}
我仍然收到相同的错误
警告:非法字符串偏移量"产品名称"
那么我还有什么做错吗?我现在明白我需要发送一系列东西而不是我以前所做的,但我仍然不太明白为什么它现在失败了
非常感谢大家对我的帮助!我似乎已经解决了这个问题。我采纳了大家的建议,终于有了一套有效的声明。现在产品已订购并将显示在购物车中
再次感谢所有帮助过我的人!
我没有看到您有新问题,所以我将其作为对您的另一个问题的评论。
用这个替换你的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' ] . ' ';
?>