【问题标题】:My foreach returns Warning: Illegal string offset 'productname'我的 foreach 返回警告:非法字符串偏移 'productname'
【发布时间】:2016-02-27 21:00:48
【问题描述】:

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

如果出现混乱或无法辨认,我深表歉意。我已经在这些论坛上搜索了大约 2 天,但我真的找不到自己的解决方案

现在我的问题如下

我从数据库中获取我的产品数据 -> 然后我单击一个产品 -> 它转到一个页面,在该页面中它将产品 ID、产品名称和价格添加到与 array_push 的会话中,然后它最终回到同一页面与购物车在哪里(购物车与产品线在同一页面上)

现在我很好地收到了会话,并且通过 var dumps 我可以看到即使在 foreach 中数组也已完全填充。

我要做的就是分别显示产品 ID/产品名称/价格。

array(6) { ["productid"]=> string(1) "6" ["productname"]=> string(11) "solexfiets6" ["price"]=> string(5) "12.99" [0]=> 字符串(1) "5" [1]=> 字符串(11) "solexfiets5" [2]=> 字符串(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/>';
}

我将产品发送到此页面的方式是,当有人点击订单时,将产品 ID、产品名称和价格发送到 add_to_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>

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

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

Sessions/foreach issue with my shopping cart

很抱歉给您带来不便

【问题讨论】:

  • 我想我知道问题出在哪里,但首先,您能否将 print_r($value) 放入您的循环中(您有 var_dump 的地方)并将输出发布到问题中:) - 这个当你看到输出时,甚至可以回答你的问题。
  • 非常感谢您的帮助,我已经添加了 print_r($value),现在整个会话都是这样的。对不起,我还是不明白问题是什么!
  • $value 不是一个数组...它将像 $_SESSION['cart']["productname"] 一样工作
  • Offtopic:考虑到这是您的第一篇文章,格式很好。仅仅因为格式,我+1。继续努力:)
  • 非常感谢!我仍然在努力解决这个问题,所以我希望也许在后续问题中有人可以为我解决这个问题!

标签: php session foreach


【解决方案1】:

好的,这是你的问题 -

您正在迭代购物车,就像它包含多个项目一样,而实际上它只包含一个。

我会给你一个完整的例子来展示给你:

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 循环如何与示例一起工作:)

【讨论】:

  • 非常感谢您的反应,我会查看您的示例并尝试对其进行编辑以使其正常工作。这是一个巨大的帮助,谢谢(:
  • 如果可能的话,我想再问你一个问题。我也在这个页面通过 array_push 发送我的数据,其中 $_GETS productid、productname 和 price 数据。有没有更好的发送方式?
  • 我认为您需要提出一个包含完整详细信息的单独问题才能真正了解您在做什么 - 我猜考虑到会话变量的值,您的方法并不完美。跨度>
猜你喜欢
  • 2020-06-11
  • 2019-03-01
  • 2021-09-30
  • 2013-09-13
  • 2013-04-11
  • 2012-04-09
  • 2019-07-28
相关资源
最近更新 更多