-2

当用户单击链接时,我想将数据库中的数据添加到数组中,例如

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

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

$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[] 的数据?谢谢

4

2 回答 2

1

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

PHP数组排序

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']);

于 2013-05-24T09:16:54.743 回答
1

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

主要安全漏洞 #1 - 在 URL 中发送 carid:

编辑:我误解了这一点。您的cartid变量指的是product_id. 这是非常糟糕的变量命名,任何程序员都会认为这指的是购物车的 ID。虽然这个安全漏洞在这种情况下无关紧要,但我将把它留在这里给任何误解你的代码并决定复制它的人。

首先,这个网址有问题:

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

这意味着如果我能猜出另一个用户的购物车 ID,我可以通过访问另一个用户的购物车 ID 来将商品添加到他们的购物车cart-page.php?action=add&cartid=100100。您应该使用经过验证的会话$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='';

如果你想避免这种情况,你有几个选择。最好的选项是切换到使用prepared statements,这些选项中最简单的选项是使用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 框架,例如ZendCakePHP。这些不会为您完成所有工作,但它们将使您更容易保持代码的良好维护和可读性。

于 2013-05-24T10:17:57.103 回答