将第一个数字存储到$ _SESSION []变量时,为什么会出现此未定义错误?

时间:2013-07-03 22:01:34

标签: php

我正在为我的项目制作一个迷你购物车。我存储了用户选择的项目数量,我不明白,当我在我的会话变量中添加一个项目时,我总是会在第一时间收到此错误 未定义的索引:第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>

3 个答案:

答案 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;