如何在 PHP 中进行更新?

How to do a update in PHP?

我正在 symfony 中开店,但我的购物车有问题。

我需要做的是当我更改产品的数量时,然后当我点击更新时我希望购物车自动更新并显示正确的数量但它总是显示从开始的数量( 1 或 3)

出现上面的3和1是因为我点击了3次商品

这是我的控制器

/**
     * @Route("/update/{qtt}", name="update")
     */
    public function updateAction($qtt,Request $req) 
    {

        $session = $req->getSession();

        $panier = $session->get('panier', []);

        if(empty($panier[$qtt])){
            isset($panier[$qtt]);
        }

        dd($qtt);

        $session->set('panier', $panier);

      return $this->redirectToRoute('panier');
    }

这是树枝

{% for item in items %}
                    <tbody>
                        <tr>
                    
                            <td>{{ item.produit.Nom }}</td>
                            <td>{{ item.produit.Prix}}$</td>
                            <td><input type="number"  value="{{item.quantitee}}" min="0" max="20"/></td>
                            <td>{{item.quantitee * item.produit.Prix}}$</td>
                            <td><a class="btn btn-danger" href="{{path('item_del', {'id': item.produit.id})}}">supprimer</a></td>
                            <td><a class="btn btn-info" href="{{path('update', {'qtt': item.quantitee})}}">update</a></td>

        
                        </tr>
                    </tbody>

    {% endfor %}

问题是您的 Update 按钮 HTML 代码是静态的。您应该添加一些 Javascript 代码来更新它,或者将 HTML 表单添加到来自 Quantity 输入的 post 数据。

在这里,您为更新操作呈现一个静态 URL,其中包含页面呈现时的数量:

<a class="btn btn-info" href="{{path('update', {'qtt': item.quantitee})}}">update</a>

我建议您学习一些关于 HTML 表单的基础知识以及如何使用 PHP 中的表单。

您需要在 Cart 数组上实际设置数量。

您在 $panier['qtt'] 上使用的 isset 方法仅检查密钥是否存在以及是否有任何值。您需要实际设置值 $panier['qtt'] = $qtt;.

另外,你是用生成的url访问控制器,它只使用第一个版本的数量,改变输入后它不会改变。如果可能的话,我建议在这里使用 Symfony 表单——使用 POST 传递数据是优于在 URL 中传递数据的首选方式。如果不可能 - 在编辑输入后使用 javascript 修改 link。

我还建议尽可能创建一个 Cart class 而不是使用数组 :)

首先,您没有传递数量 update/delete 的产品 ID。

您的代码应如下所示:

Client-Side

<form action="{{path('update_cart')}}" method="post">
    <table>
        {% for item in items %}
            <tr>
                <td>{{ item.produit.Nom }}</td>
                <td>{{ item.produit.Prix}}$</td>
                <td><input type=number name="qty[{{item.produit.id}}]" value="{{item.quantitee}}" min="0" max="20"></td>
                <td>{{item.quantitee * item.produit.Prix}}$</td>
                <td><button type="submit" class="btn btn-danger" name="delete_id" value="{{item.produit.id}}}">supprimer</button></td>
                <td><button type="submit" class="btn btn-info" name="update_id" value="{{item.produit.id}}}">Update</button></td>
            </tr>
        {% endfor %}
    </table>
</form>

Server-Side

/**
 * @Route("/update_cart}", name="update_cart")
 */
public function updateCart(Request $req)
    {
        $session = $req->getSession();

        $product_qty_list = $req->request->get('qty');

        $product_update_id = $req->request->get('update_id');
        $product_delete_id = $req->request->get('delete_id');

        $panier = $session->get('panier', []);

        if ($product_delete_id !== null) {
            // delete item

            unset($panier[$product_delete_id]);
        } else {
            // update item

            $qty = $product_qty_list[$product_update_id];

            if ($qty > 0)
                $panier[$product_update_id] = $qty;
            else
                unset($panier[$product_update_id]);
        }

        $session->set('panier', $panier);

        return $this->redirectToRoute('panier');
    }

如您所见,我用一个表单包装了一个 table,它对 update_cart 路由有一个操作。

每个按钮都有自己的名称和值。例如:

  • 删除按钮的名称为 delete_id,产品 ID 的值为
  • 更新按钮具有名称 update_id 和产品 ID 的值

这将有助于确定您尝试对产品执行的操作。

当然,每个数量输入的名称中都有一个键(作为数组),这是通过在名称后使用 [] 来实现的。例如:

  • 如果您的输入是 <input type=number name="qty[33]" value="12"> 并且您点击了 Update 按钮,那么您会将 ID 为 33
  • 的产品的数量更新为 12

P.S。您应该将标题更改为 How to update item quantity in shopping cart - Symfony PHP