我正在为网店编制购物车的过程。现在,我正在尝试添加“从购物车中删除”按钮。
我设置的方式是$_SESSION['id']
包含客户添加到购物车的所有产品ID,然后循环创建一个包含5列的表:img |名字|尺寸|价格| “从购物车中删除”-Button。
我的目标是点击按钮后,只需从$_SESSION['id']
移除产品即可。由于变量中现在少了一个项目,strlen($_SESSION['id'])
也应该降低一个。
每个按钮都有一个唯一的名称,这要归功于for循环将当前迭代添加到其名称中:<td valign="middle"><form action="#" method="post"><input type="submit" name=" delete_<?php echo $i; ?>" value="Remove"></form></td>
。
为了检查是否按下了其中一个按钮,我合并了另一个for循环:
if (isset($_SESSION['id'])) {
for ($i=0; $i < strlen($_SESSION['id']); $i++) {
if (isset($_POST['delete_'.$i])) {
$_SESSION['id'][$i]=""; //removes item from $_SESSION['id']. Instead of "" I also tried NULL
$_SESSION['size'][$i]=false; //removes corresponding size.
//I may be mistaken, but PRG should be implemented to avoid problems with the form being resent upon refreshing the page
header("Location: ".$_SERVER['REQUEST_URI']);
exit();
}
}
}
单击按钮后,该项目确实已从$_SESSION['id']
字符串中删除,但奇怪的是字符串长度保持不变。
在购物车中添加和删除3件商品后执行了var_dump ($_SESSION['id']);
,结果为:string(3) ""
。那么,字符串的长度为3但不包含任何内容?怎么会这样?
这显然会带来一些挑战!由于表行是基于strlen($_SESSION['id'])
创建的,因此我留下了3行(或者我从购物车中删除了多少产品),这些行充满了错误消息,告诉我“未定义的索引”。虽然它没有说“未初始化的字符串偏移”,所以这对我来说意味着存在偏移,但是没有任何东西可以使用。
任何帮助都会被强烈谴责! 菲利克斯
答案 0 :(得分:2)
无法更改字符串的长度。将空字符串分配给字符串字符时,它不会将所有其他字符移位,它会将其视为在该位置放置代码为0
的字符。您可以使用以下代码查看它:
$str = "abcdef";
$str[1] = "";
echo $str; //acdef
echo ord($str[1]); // 0
所以它相当于:
$str[1] = chr(0);
相反,如果您尝试分配多个字符,它只会分配第一个字符:
$str[1] = "xyz";
表现得像:
$str[1] = "x";
请勿尝试将字符串用作数组,这不是它的目的。使用真实数组,然后您可以使用unset($_SESSION['id'][$i])
;