PHP在执行查询之前刷新页面

时间:2015-12-29 22:27:42

标签: php

我创建了一个网页,每次页面重新加载时,都会从我的数据库中加载一个表(" 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);
}

3 个答案:

答案 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_ *函数,因为这些函数不推荐使用:)