【问题标题】:Update cart - mysql table update - while loop更新购物车 - mysql 表更新 - while 循环
【发布时间】:2011-12-01 17:21:25
【问题描述】:

新人来了! 我正在构建一个由 mysql 驱动的自定义购物车,并且我正在尝试根据数量逐项更新我的购物车。似乎我做错了什么,因为当我尝试更新数量时,它只更新最后一项。我在下面发布代码。任何帮助,将不胜感激。提前致谢。

1.cart.php:

    $sql = "select * from orders";
    $result = mysql_query($sql);
    $num = mysql_num_rows($result);
    echo "Στοιχεία: ".$num;
    ?>
    <form name="cart" method="post" action="updatecart.php">
      <table border="2">
        <tr>
          <td>Α/Α</td>
          <td>img_name</td>
          <td>Reprints</td>
          <td>Color</td>
        </tr>
        <?php
        if($num){
            while ($row = mysql_fetch_array($result)){
             ?>
                <tr>
                  <td><?php  echo $row['item_id']; ?></td>
                  <td><?php echo $row['img_name']; ?></td>
                  <td><input type="number" name="quantity" value="<?php echo $row['quantity']; ?>"></td>
                  <input type="hidden" name="item_id" value="<? echo $row['item_id']; ?>">
                  <td><?php echo $row['color']; ?></td>
                </tr>
            <?php
            }
        }

            ?>
      </table>
      <input type="submit" name="update" value="Update Cart" />
      <input type="button" name="2checkout" value="Proceed to Checkout" />
</form>

2.updatecart.php

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<?php
    $database_name = "vog";
    $conn = mysql_connect("localhost","root","toor");
    mysql_select_db($database_name);

    $num = 2; //na to ferw me session meta edw!
    if(isset($_POST['update'])){
        $item_id = $_POST['item_id'];
        $i=1;

        while($i<=$num){
            $item_id = $_POST['item_id'][$i];
            $quantity = $_POST['quantity'];
            $sql2 = "update orders SET quantity = '$quantity' where item_id = '$item_id' ";
            $result2 = mysql_query($sql2) or die ("Error in query: $result2");
            $i++;
        }
    }

    if(isset($result2)){
        header("Location:cart.php");
    }
?>

到目前为止,它只更新最后一条记录。

【问题讨论】:

    标签: php mysql cart


    【解决方案1】:

    您的问题在于 HTML 表单中的字段名称:

    <input type="number" name="quantity" value="<?php echo $row['quantity']; ?>">
    <input type="hidden" name="item_id" value="<? echo $row['item_id']; ?>">
    

    我认为您打算将它们称为 quantity[]item_id[],因此它们稍后将作为数组在您的 $_POST 变量中,现在它们相互覆盖,使 $_POST['item_id'] 仅包含最后一个 id数据库。

    【讨论】:

    • 各地PHP程序员工会打电话给我补充一句:在你再写一行PHP代码之前,先阅读一下SQL注入。此代码使您的数据库对黑客开放。检查php.net/manual/en/security.database.sql-injection.php
    • 在抗 sql 注入测量方面,您有什么建议?
    • @EvanSap : 使用 mysql_real_escape_string 函数 .. 也参考stackoverflow.com/questions/60174/…
    • @EvanSap 每当您将字符串从一种语言(例如 PHP)嵌入到另一种语言(例如 SQL 或 HTML)中时,您需要将字符串转换为正确的语言,否则您会遇到问题。要将 PHP 字符串转换为 SQL,请使用 mysql_real_escape_string。要将 PHP 字符串转换为 HTML,请使用 htmlspecialchars。这不仅可以防止黑客滥用您的系统,还可以解决有人想将Mac Donald's 写入数据库或将I &lt;3 burgers 写入 HTML 时出现的问题。
    【解决方案2】:

    在#1.cart.php 中使用输入作为数组:

    <input type="number" name="quantity[<?php  echo $row['item_id']; ?>]" value="<?php echo $row['quantity']; ?>">
    <input type="hidden" name="item_id[<?php  echo $row['item_id']; ?>]" value="<? echo $row['item_id']; ?>">
    

    并在 #2.updatecart.php 中:像处理它一样

     foreach($_POST['item_id'] as $key => $id){
    
     $item_id = $id;
     $quantity = $_POST['quantity'][$key];
     $sql2 = "update orders SET quantity = '$quantity' where item_id = '$item_id' ";
     $result2 = mysql_query($sql2) or die ("Error in query: $result2");
     $i++;
    
     }
    

    【讨论】:

    • 非常感谢您的帮助。它按预期工作!现在我可能需要添加针对 sql 注入的保护措施。
    【解决方案3】:

    您需要告诉 PHP 您正在为提交的表单项使用数组。这样做的方法是使每个输入的名称为quantity[]。您也可以将项目 ID 作为键直接放入数组中。在cart.php 中,您可以在循环中执行此操作:

    <input type="number" name="quantity[<?php echo $row['item_id']; ?>]" 
                         value="<?php echo $row['quantity']; ?>"/>
    

    实际上,这将输入如下内容:

    <input type="number" name="quantity[2]" value="1" />
    <input type="number" name="quantity[4]" value="1" />
    <input type="number" name="quantity[8]" value="2" />
    

    即第 2 项第 1 项,第 4 项第 1 项和第 8 项第 2 项。

    然后,在updatecart.php 中,您可以读取数组并循环处理它。

    if(isset($_POST['update'])){ 
       foreach ($_POST['quantity'] as $item_id => $item_qty) {
           $item_id  = (int)$item_id;
           $item_qty = (int)$item_qty;
    
           $sql2 = "update orders SET quantity = '$item_qty' where item_id = '$item_id' ";
           mysql_query($sql2);
       }
    }
    

    【讨论】:

    • 您可以通过投票并接受人们的答案来感谢人们。 =)
    猜你喜欢
    • 2014-08-29
    • 2020-11-27
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2018-07-29
    • 2011-10-29
    • 1970-01-01
    相关资源
    最近更新 更多