我想在用户点击链接时将数据从数据库添加到数组中,例如
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 []?谢谢
答案 0 :(得分:1)
是否需要重置?为什么不将它添加到数组并在以后订购数组?
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 :(得分:1)
简短回答:您的问题不在于您没有将项目添加到数组中,而是您不了解数组的工作原理。除非另有声明,否则数组不会跨页面持久存在,它们会被实例化为单个脚本的单个运行时。
主要安全漏洞#1 - 在网址中发送cartid:
编辑:我误解了这一点。您的cartid
变量引用product_id
。这是非常差的变量命名,任何程序员都会认为这是指购物车的ID。虽然这个安全漏洞在这种情况下并不相关,但我将其留在这里,以免误解您的代码并决定复制它。
首先,此网址存在问题:
echo '<a href="cart-page.php?action=add&cartid='.$row[0].'">ADD</a>'
这意味着,如果我猜错了其他用户的购物车ID,我可以访问cart-page.php?action=add&cartid=100
其中100
是其他用户的购物车ID,将商品添加到购物车中。您应该使用经过验证的session在内部处理$cart
变量,而不是通过可由用户操作的GET
或POST
请求在互联网上发送这些变量。
主要安全漏洞#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框架,如Zend和CakePHP。这些不会为您完成所有工作,但它们将使您更容易保持代码的良好维护和可读性。