我创建了一个网页,每次页面重新加载时,都会从我的数据库中加载一个表(" Products"表)中的随机产品。登录用户(用户必须登录)可以选择是否将该产品添加到他们的个人收藏夹中(存储在"收藏夹"表中)。每次用户单击相应的按钮将该产品添加到他们的收藏夹时,网页就会重新加载并显示另一个新的随机项。问题是网页可能会在执行查询之前重新加载,因此新的'项目将添加到他们的收藏夹中。有谁知道我怎么解决这个问题?这是我到目前为止所得到的:
HTML
<form method="get">
<button type="submit" name="like">
<img class="add-to-favorites" src="image.png">
</button>
</form>
PHP
header("Cache-Control: no-cache, must-revalidate");
session_start();
include_once 'dbconnect.php';
$user_id = ($_SESSION['user']);
$sSQLQuery = "SELECT product_id FROM Products ORDER BY RAND()";
$aResult = mysql_query($sSQLQuery);
$aRow = mysql_fetch_array($aResult, MYSQL_ASSOC);
$productid = $aRow['product_id'];
if(isset($_GET['like'])){
$SQL = "INSERT INTO Favorites(user_id,product_id)
VALUES('$user_id','$aRow[product_id]')";
$result = mysql_query($SQL);
}
答案 0 :(得分:0)
首先,PDO ......总是:P。
但是要回答你的问题,你需要发送product_id和$ _GET ['like'],这样你就知道他们选择了哪个产品。因为你在每次加载时都是从数据库中随机选择一个。
在目前状态下,这是您最好的选择。 但请考虑转移到PDO,特别是因为您提到登录的用户和产品。
How can I prevent SQL injection in PHP?
*将信用链接到肖恩(评论)
答案 1 :(得分:0)
您的问题是,当页面刷新时,您首先从数据库中获取新数据,然后保存旧数据 - 由新数据替换。
显然,您需要在GET-Parameters中传输旧的product-id。有很多选项可以做到这一点,例如创建隐藏字段。
echo "<input type=\"hidden\" name=\"oldProductId\" value=\"$productid\">
然后,您可以在使用
重新加载页面时访问它$_GET['oldProductId']
并将其写入收藏夹表。
答案 2 :(得分:0)
嗯,实际上你的PHP代码只获取一个随机项,然后在用户点击时保存它。您应该在表单上输出产品ID,如下所示:
<form method="get">
<input type="hidden" name="current_product_id" value="<?php echo $productid; ?>">
<button type="submit" name="like">
<img class="add-to-favorites" src="image.png">
</button>
</form>
<?php echo $productid; ?>
具有新随机产品的ID。
您的PHP应按此顺序使用以下值:
if(isset($_GET['like'])){
$SQL = "INSERT INTO Favorites (user_id,product_id) VALUES ('$user_id','$_GET[current_product_id]')";
$result = mysql_query($SQL);
}
$sSQLQuery = "SELECT product_id FROM Products ORDER BY RAND()";
$aResult = mysql_query($sSQLQuery);
$aRow = mysql_fetch_array($aResult, MYSQL_ASSOC);
$productid = $aRow['product_id'];
所以现在,如果你点击那样,$_GET['current_product_id']
将拥有当前产品,然后我在隐藏输入中输出新的随机产品ID,以便下一个项目也能正常工作!
另外:很重要,考虑使用mysqli_ *函数而不是mysql_ *函数,因为这些函数不推荐使用:)