向数组追加内容


Appending contents to an array

我想从我的数据库添加数据到数组时,用户单击一个链接,例如

echo '<a href="cart-page.php?action=add&cartid='.$row[0].'">ADD</a>'.

我获取元素的id并查询数据库以获取所单击项的详细信息,并使用如下(在cart-page.php上)的for循环显示它:

$cart = $_GET['cartid'];
$cartData = array();
$SQL = "SELECT * FROM tbl_product where id ='$cart'";
$result = mysql_query($SQL);
while($row = mysql_fetch_assoc($result)){
          array_push($cartData, $row);
      }
     $length = count($cartData);
     for($i = 0; $i < $length; $i++) {
       echo '</tr>';
       echo ' <td class="product">'.$cartData[$i]['name'].'</td>';
      echo'<td class="quantity"><input type="text" value='.$cartData[$i]['quantity'].'   class="inputform"/></td>';
    echo '</tr>';
     }

我的问题是array_push()没有附加数据。每次我从cart-page.php导航并单击链接时,cartData[]中的先前内容被覆盖,每次只在cartData[]中留下一行。我怎么能得到的数据追加到cartData[]每当我点击一个像上面所示的链接?由于

需要追加吗?为什么不直接将它添加到数组中,并在以后对数组进行排序呢?

数组排序

while($row = mysql_fetch_assoc($result)){
    $cartData[] = $row;
}

另外,你应该总是转义你的数据。

$cart = $_GET['cartid'];

以上代码容易受到SQL注入的攻击。至少,逃离它吧!

$cart = mysql_real_escape_string($_GET['cartid']);

编辑

为了记住之前添加的所有购物车,您需要创建一个会话,并将每次点击添加到会话中:

session_start();
$cartid = mysql_real_escape_string($_GET['cartid']);
function addToCart($cartid)
{
    $SQL = "SELECT * FROM tbl_product where id ='{$cartid}'";
    $result = mysql_query($SQL);
    while($row = mysql_fetch_assoc($result)){
        $_SESSION['cartItems'][] = $row;
    }
}

function getCartItems()
{
    print_r($_SESSION['cartItems']);
}

这将有望按您的期望工作。会话将在浏览器刷新时保持状态。要使用这段代码,当您想要向原始$cartData添加项时,需要调用函数addToCart($cartid)。这将把项目数据添加到cartItems会话数组

查看购物车中的内容作为数组,只需使用print_r($_SESSION['cartItems']);

简短的回答:您的问题不是您没有将项目添加到数组中,而是您不了解数组是如何工作的。数组不会跨页持久存在,除非另有声明,否则它们将实例化到单个脚本的单个运行时。

重大安全漏洞#1 -在URL中发送cartid:

编辑:我误解了。您的cartid变量指向product_id。这是一个非常糟糕的变量命名,任何程序员都会认为这是一个购物车的ID。虽然这个安全漏洞与此实例无关,但我把它留在这里,供任何误解您的代码并决定复制它的人使用。

首先,这个URL有问题:

echo '<a href="cart-page.php?action=add&cartid='.$row[0].'">ADD</a>'

这意味着如果我能猜出另一个用户的购物车ID,我可以通过访问cart-page.php?action=add&cartid=100 (100是另一个用户的购物车ID)向他们的购物车中添加商品。你应该在内部使用一个经过验证的会话来处理$cart变量,而不是通过GETPOST请求在互联网上发送它们,这些请求可以被用户操纵。

重大安全漏洞#2 - SQL注入攻击漏洞:

声明

$SQL = "SELECT * FROM tbl_product where id ='$cart'";

非常危险。假设我在我的URL中提交这个(当然是正确编码的):

cartid = 2'; DROP TABLE tbl_product; SELECT * FROM tbl_product WHERE cartid='

这将在数据库上执行以下查询:

SELECT * FROM tbl_product where id ='2'; DROP TABLE tbl_product; SELECT * FROM tbl_product WHERE cartid='';

如果你想避免这种情况,你有几个选择。这些选项中最好的是切换到使用预处理语句,这些选项中最简单的是对您放入数据库的所有内容使用mysql_real_escape_string,如下所示:

$SQL = "SELECT * FROM tbl_product where id ='" . mysql_real_escape_string($cart) . "';";

一旦修复了上面的问题,我们就可以修复剩下的代码了:

首先,我们要将结果放入数组中。由于$results已经是一个关联数组,您可以直接使用它,也可以像这样存储它:

$cartData = $results;

保持商品在购物车中

编辑:我误解了你在做什么,你正在使用一个名为$cart的变量来存储产品ID,你需要整理你的变量名称。

为了有一个数组,它将持续多个页面加载,你将需要使它成为一个会话变量,首先你必须启动一个PHP会话:

session_start();

使用这样的会话变量:

$_SESSION['shopping_cart'] = array();

然后,当你"添加"一个产品时,这样做:

$_SESSION['shopping_cart'][$cartData['id']] = array(
    'name'=>$cartData['name'], 
    'quantity'=>1
);

当你改变数量时,这样:

$_SESSION['shopping_cart'][$productId]['quantity'] = $newQuantity;

现在,当您显示购物车时,不是直接从产品中显示,而是首先使用上面的方法插入到数组中,然后返回$_SESSION['shopping_cart']的内容。

foreach是为数组截线制作的,使用它!

最后,不要使用难看的for循环来迭代数组,只需:

<?php foreach($_SESSION['shopping_cart'] as $product): ?>
<tr>
    <td><?php echo $product['name'] ?></td>
    <td><input type='text' value='<?php echo $product['quantity'] ?>'></input></td>
</tr>
<?php endforeach; ?>

希望这对你有帮助,我并没有为你做所有的工作,但我已经给了你很多正确方向的指点,并确定了一些重要的严重问题。

本项目建议:

一个购物网站是一个重大的事业,你应该花一些时间阅读一些概念,如PHP安全,会话,关系数据库等。这似乎是一个不必要的麻烦,但现在编写干净和安全的代码意味着,当你必须调试和修改它时,你将能够更容易地做到这一点。

我还建议你看看一些(免费的,开源的)MVC框架,如Zend和CakePHP。这些不会为你做所有的工作,但它们会让你的代码更容易维护和可读性。