我正在为我的项目制作一个迷你购物车。我存储了用户选择的项目数量,我不明白,当我在我的会话变量中添加一个项目时,我总是会在第一时间收到此错误
未定义的索引:第100行的D:\ wamp \ www \ MiniCart \ cart.php中的cart_1
当我再次添加或刷新同一页面时,它工作正常。为什么会出现这个错误?我从语句中删除了+=1
,它工作正常,显然也没有语法错误。
Cart.php
<!DOCTYPE>
<html>
<head></head>
<body>
<?php
session_start();
//The page where to jump to after adding/editing cart.
$page = 'mini_cart_index.php';
$link = mysqli_connect("localhost","root","","cart");
if(mysqli_connect_errno())
{
echo "Error:".mysqli_connect_error();
echo "<br/>";
} else {
echo "Connected to SQL<br/>";
}
//==================================================
if(isset($_GET['add']))
{
$obt=$_GET['add'];
$quantity_limit = 'SELECT id,quantity FROM products WHERE id='.mysqli_real_escape_string($link,(int)$_GET['add']);
$quantity = mysqli_query($link,$quantity_limit);
while($quantity_row=mysqli_fetch_assoc($quantity))
{
if($quantity_row['quantity']!=$_SESSION['cart_'.$_GET['add']])
{
$_SESSION['cart_'.$_GET['add']]+='1';
}
}
/*
echo 'id='.$obt.' '.'next<br/>';
echo 'Now storing info into session variable and adding one<br/>';
echo $_SESSION['cart_'.$_GET['add']];
echo '<br/>';
echo 'info stored<br/>';
*/
}
//***************************************************
function products()
{
GLOBAL $link;
$get ="SELECT id,name,description,price FROM products
WHERE quantity > 0 ORDER by id ASC";
if($result=mysqli_query($link,$get))
{
echo "Data Selected to be displayed<br/>";
} else {
echo "Error:".mysqli_error($link);
}
if(mysqli_num_rows($result)==0)
{
echo "There are no products to display!<br/>";
} else {
while($get_row=mysqli_fetch_assoc($result))
{
echo '<hr/><br/>';
echo 'displaying data from database<br/>';
echo '==================================';
echo '<p>'.$get_row['name'].'<br/>'.
$get_row['description'].'<br/>'.
number_format($get_row['price'],2).
'<a href="cart.php?add='.$get_row['id'].'"> Add</a>'.'</p>';
echo '<hr/><br/>';
}
}
}
echo 'outside'.$_SESSION['cart_1'];
?>
</body>
</html>
Mini_cart_index.php
<?php require 'cart.php';?>
<!DOCTYPE>
<html>
<head>
</head>
<body>
<?php products() ?>
</body>
</html>
答案 0 :(得分:2)
该代码充满了SQL注入漏洞,您应该使用PDO和prepare
语句。
PHP警告你,因为它必须读取当前值并添加到它,但是第一次尝试访问它时不存在。
您可以通过以下方式取消警告:
@$_SESSION['cart_'.$_GET['add']]+='1';
更好的方法是检查它是否存在
$name = 'cart_'.$_GET['add'];
if(isset($_SESSION[$name]) {
$_SESSION[$name] = 1;
} else {
$_SESSION[$name] += 1;
}
答案 1 :(得分:0)
更改你的if语句以检查它是否也是空的:
if (!isset($_SESSION['cart_'.$_GET['add']])) {
$_SESSION['cart_'.$_GET['add']] = 1;
} elseif ($quantity_row['quantity'] != $_SESSION['cart_'.$_GET['add']]) {
$_SESSION['cart_'.$_GET['add']] += 1;
}
答案 2 :(得分:0)
问题是由......
引起的$var['abc'] += 1
...与
相同$var['abc'] = $var['abc'] + 1
因此,如果你有一个干净的会话且$var['abc']
不存在,你将会收到一个警告,因为你试图读取一个不存在的值,以便为它添加1
虽然0 + 1 = 1
确实如此
......这里实际发生的是undefined + 1 = 1 with a warning
。
正如其他答案所提到的 - 要解决此问题,您可以在尝试增加数组索引之前显式检查数组索引是否存在。
我会像这样使用三元运算符:
$key = 'card_' . $_GET['add'];
$_SESSION[$key] = (isset($_SESSION[$key]) ? $_SESSION[$key] : 0) + 1;
这实际上是在说
$val = ($val if it exists, otherwise 0) + 1;