【问题标题】:After refreshing the page product adding automatically in cart刷新页面后产品自动加入购物车
【发布时间】:2018-03-04 06:53:35
【问题描述】:

我正在尝试为购物车编写代码,该代码正在运行。但是,当我刷新页面时,它会自动将产品添加到我的购物车中。

例如,我的网站上有 3 个产品,它们是 Apple, Banana, Orange。 我点击 Apple,它被添加到我的购物车,数量为 1,并且 URL 显示

`mydomain.com/my-cart?action=addcart&p_id=FylvGt6Yyb6n%2BzTXcJHwjBawOY%2Fw3QSZxF7rdUJLqhA%3D#`

现在,如果我刷新页面,它会将另一个 Apple 添加到我的购物车(数量 2)。然后,如果我再次刷新页面,它会添加另一个 Apple(数量 3)等等。我不知道为什么会这样。它正在添加到 SESSION。

你会在这方面帮助我吗?

下面是我的购物车代码。

    $action = isset($_GET['action'])?$_GET['action']:"";
       $p_id=$conn->real_escape_string($_GET['p_id']);
       $decrypted_p_id = decryptIt($p_id);
    //Add to cart
    if($action=='addcart') {
        //Finding the product by code
     $query = "SELECT p_unique_id, p_images,p_name, p_currentprice FROM products WHERE p_id=?";
    if ($stmt = $conn->prepare($query)) {
        $stmt->bind_param("i", $decrypted_p_id);
        $stmt->execute();
        $stmt->bind_result($p_unique_id,$p_images, $p_name, $p_currentprice);
        $stmt->fetch();

}
        $currentQty = $_SESSION['products'][$decrypted_p_id]['qty']+1; //Incrementing the product qty in cart
        $_SESSION['products'][$decrypted_p_id] =array(
                                            'qty'=>$currentQty,
                                            'p_unique_id'=>$p_unique_id,
                                            'p_images'=>$p_images,
                                            'p_name'=>$p_name,
                                            'p_currentprice'=>$p_currentprice
                                        );
        $product='';
       // header("Location:cart.php");
    }

展示产品

  <?php if(!empty($_SESSION['products'])):
   foreach($_SESSION['products'] as $key=>$product):?>
    /*some code here*/
    endforeach;?>
    <?php endif;?>

此处编辑的代码由 ADyson 建议

    if (isset($_POST['submit'])) {
        $action=$conn->real_escape_string($_POST['action']);
       $decrypted_p_id=$conn->real_escape_string($_POST['p_id']);
// whole code here

【问题讨论】:

  • 是的,因为如果您只是单击刷新完全相同的页面,则 action=addcart 等仍在 URL 中,因此它会再次运行该操作。老实说,像这样的“添加”操作最好作为 POST 请求完成,部分原因是语义原因(它是“发送”数据而不是“获取”数据),部分原因是为了避免这样的烦恼。理想情况下,GET 请求不应导致应用程序中的任何状态更改。
  • 另外,您的代码容易受到 SQL 注入攻击。您应该使用参数化查询和准备好的语句来帮助防止攻击者通过使用恶意输入值来破坏您的数据库。 bobby-tables.com 给出了风险解释,以及如何使用 PHP / mysqli 安全地编写查询的一些示例。切勿将未经处理的数据直接插入 SQL。转义字符串本身并不安全 - 该函数从未打算防止注入攻击(尽管在某些情况下可以,但并非总是如此,也不是设计使然)。
  • @ADyson,现在我在准备好的语句中更新了我的代码。现在可以了吗?
  • @ADyson,你能分享一些购物车中 POST 请求的例子吗?
  • 好吧,我不知道你是如何首先向 URL 发出请求的,但如果它是通过 HTML 表单完成的,那么将其“方法”属性更改为“POST”,并且在 PHP 中寻找 $_POST 变量而不是 $_GET。您也可以在网上找到大量简单的 POST 请求示例。

标签: javascript php jquery ajax session


【解决方案1】:

我找到了这段代码:

$currentQty = $_SESSION['products'][$decrypted_p_id]['qty']+1;

当您重新加载页面时,此代码始终运行, 如果要手动添加,请给出一些条件

【讨论】:

  • 这里需要什么条件?
【解决方案2】:

如果您只是在完全相同的页面上单击刷新,则action=addcart 等仍然在 URL 中。因此,它不可避免地会在页面加载时再次运行该操作,并将商品再次添加到购物车中。

像这样的“添加”操作最好作为 POST 请求完成,部分原因是出于语义原因(它是“发送”数据而不是“获取”数据),部分原因是为了避免这样的烦恼。理想情况下,GET 请求不应导致应用程序中的任何状态更改。

代替

<a href="my-cart?action=addcart&p_id=<?php echo $p_user_id;?>">Add to cart</a>

你可以这样做:

<form action="my-cart" method="POST">
  <button type="submit">Add to cart</button>
  <input type="hidden" name="action" value="addcart"/>
  <input type="hidden" name="p_id" value="<?php echo $p_user_id;?>"/>
</form>

如果您愿意,可以使用一些 CSS 使按钮看起来更像旧的超链接。

然后,在您的 PHP 购物车代码中,只需将所有对 $_GET 的引用替换为 $_POST,即可从 POST 请求中读取值。

这样做的好处是变量不会保存到 URL 中,因此如果有人尝试刷新 URL,它不会根据这些变量自动重复相同的操作。

您还可以考虑通过 AJAX 发送数据以添加购物车项目,这样它根本不需要回发,通常会带来更流畅的用户体验 - 如果您现在查看大多数购物网站,通常他们做什么。

【讨论】:

  • 我试过你的代码,现在这个 URL 是 mydomain.com/mycart 但如果我刷新页面,我也会遇到同样的问题,即使我将 GET 更改为 POST
  • 我最后在我的问题中添加了代码。当我刷新页面时,我得到确认弹出重新发送或取消
  • 是的,这是网络的默认行为。你无能为力。但至少它不再自动成为问题。用户被警告并且可以取消它。希望用户一旦看到它就不会再次尝试刷新它。如果这还不够,您可以按照我的建议尝试 AJAX 解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2014-08-02
相关资源
最近更新 更多