我的foreach返回警告:非法字符串偏移'productname'

时间:2016-02-27 21:00:49

标签: php session foreach

这是我第一次在stackoverflow上发布内容。我是一个相对较新的程序员,喜欢Php,我有这个任务,我必须制作一个购物车

如果这很麻烦或无法解决,我道歉。我一直在这些论坛上搜索大约2天,我真的找不到自己的解决方案

现在我的问题如下

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

现在我收到会话就好了,使用var转储我可以看到即使在foreach中数组也完全填满了。

我想要做的就是单独显示productid / productname / price。

  
    

array(6){[“productid”] => string(1)“6”[“productname”] => string(11)“solexfiets6”[“price”] => string(5)“12.99”[0] => string(1)“5”[1] => string(11)“solexfiets5”[2] => string(5)“16.99”}

  

向前是我正在使用的代码。也许有人在这里可以解释我发生了什么

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) {
    //var_dump($_SESSION["cart"]); // this var_dump
    //echo $id; //
    $products = $id;
    echo $value["productname"] . '<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>';

}

谢谢你的帮助

     foreach($_SESSION['cart'] as $id => $value) {
     print_r($value); //outputs 6solexfiets612.995solexfiets516.99 
     (it puts everything in the session in a string)

    //var_dump($_SESSION["cart"]);
    //echo $id; //
    //$products = $id;
    //echo $value["productname"] . '<br/>';
}

我将产品发送到此页面的方式是,当有人点击订单add_to_cart.php然后执行此操作时,在网址中发送productid,productname和price

<?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>

通过我收到的所有帮助,我发现我以错误的方式发送数据。有没有更好的方法将产品发送到购物车然后循环它?

我在这里提出了关于这个问题的后续问题,并提供了有关我的代码的所有信息

Sessions/foreach issue with my shopping cart

我很抱歉给您带来不便

1 个答案:

答案 0 :(得分:0)

好的,这是你的问题 -

您正在迭代购物车,因为它包含多个商品,实际上它只包含一个商品。

我会给你一个完整的例子来告诉你:

foreach($_SESSION['cart'] as $id => $value){

ITERATION 1: 
    $id = “productid”
    $value = “6”

ITERATION 2: 
    $id = “productname”
    $value = “solexfiets6”

ITERATION 3: 
    $id = “price”
    $value = “12.99”

ITERATION 4: 
    $id = 0
    $value = “5”

ITERATION 5: 
    $id = 1
    $value = “solexfiets5”

ITERATION 6: 
    $id = 2
    $value = “16.99”

At no point in this iteration is there a valid variable called `$value[“productname"]` which is why your code fails.

}

您正在将$_SESSION[‘cart']视为一个数组数组,但它不是,因此,您的循环失败是因为它在每次迭代中都找不到$value[“productname"] - 或者任何迭代(在这种情况下)

它的一个例子:

运行此代码(这里我们设置一个数组,里面有两个数组):

  $_SESSION['cart'] = array(
    0 => array( "productid" => 6, "productname" => "solexfiets6", "price" => 12.99 ),
    1 => array( "productid" => 5, "productname" => "solexfiets5", "price" => 16.99 )
  );

  print_r($_SESSION[‘cart']);

你会得到这个输出:

Array
(
    [0] => Array
        (
            [productid] => 6
            [productname] => solexfiets6
            [price] => 12.99
        )

    [1] => Array
        (
            [productid] => 7
            [productname] => solexfiets5
            [price] => 16.99
        )

)

运行此代码:

 $_SESSION['cart'] = array(
    0 => array( "productid" => 6, "productname" => "solexfiets6", "price" => 12.99 ),
    1 => array( "productid" => 7, "productname" => "solexfiets5", "price" => 16.99 )
  );

  //this loop iterates twice because $_SESSION[‘cart’] has two ‘members’ - so we know we are seeing one product for every loop iteration
  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/>';
  }

您将获得此输出:

Product Name solexfiets6
Product ID 6
Product Price 12.99

Product Name solexfiets5
Product ID 7
Product Price 16.99

它的示例不起作用(您当前的输入用作示例)

  //this is what your cart is currently set to
   $_SESSION['cart'] = array(
      "productid" => "6",
      "productname" =>  "solexfiets6",
      "price" => "12.99", 
      0 =>  "5",
      1 => "solexfiets5",
      2 => "16.99"
    );

  //this loop (which is like your loop) iterates 6 times because there are 6 items in the $_SESSION[‘cart’] array, i.e. it is not executing per-product as you expect.
  foreach($_SESSION['cart'] as $id => $value)
  {
    echo 'the value is: ' . $value . '<br/>';
  }

将输出

the value is: 6
the value is: solexfiets6
the value is: 12.99
the value is: 5
the value is: solexfiets5
the value is: 16.99

总之,输入数组的结构是不正确的,它需要是一个产品数组的数组,而不仅仅是一维的数组值,如果它应该以你想要的方式工作。

调试此类内容的一些常规技巧

1。print_r非常酷(如果你查看页面来源,你就会明白为什么 - 它会打印结构良好的东西)   2.循环中的$value$id是你关心的,而不是会话 - 你不应该在循环中var_dumping你的会话,因为它是循环的常量 - 你想看看是什么$value$id是(因为这些会改变每次迭代)

foreach循环将始终迭代count($n)次:

foreach ($n as $something)
{

}

换句话说 - 如果你有$n进入foreach循环 - 你可以通过查看count($n)来查看它会迭代多少项 - 在你的情况下,count($_SESSION['cart'])是6,但你期待2 - 所以你会立刻知道输入数据有问题。

对不起,我不能给你解决方案来解决你的问题,因为问题在于输入,但输入非常接近正确。你拥有会话变量中的所有内容,只需要使用正确的结构进行格式化。我希望我已帮助您了解数据和foreach循环如何使用示例:)