-1

我正在为我的项目制作一个迷你购物车。我存储了用户选择的项目数,我不明白当我向会话变量添加一个时,我总是在第一次运行时出现此错误 Undefined index: cart_1 in D:\wamp\www\MiniCart\cart。 php on line 100 当我再次添加或刷新同一页面时,它工作正常。为什么会出现这个错误?我+=1从语句中删除了它,它工作正常,显然也没有语法错误。

购物车.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>
4

3 回答 3

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;
}
于 2013-07-03T22:05:48.517 回答
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;
}
于 2013-07-03T22:03:48.770 回答
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;
于 2013-07-03T22:31:26.100 回答