代码之家  ›  专栏  ›  技术社区  ›  Cheryl Blossom

循环文本框和循环输入收集

  •  0
  • Cheryl Blossom  · 技术社区  · 6 年前

    我在表单中循环输入标记。我的代码是:

    $sql = "SELECT * FROM inventory_tbl";
            $result = mysqli_query($conn, $sql);
            $resultCheck = mysqli_num_rows($result);
    
            echo "<table>
                        <tr>
                            <th>Product SKU</th>
                            <th>Category</th>
                            <th>Product Name</th>
                            <th>Size</th>
                            <th>Quantity</th>
                        </tr>";
            if ($resultCheck > 0) {
                    while ($row = mysqli_fetch_assoc($result)) {
                        echo "<tr>
                                <td>" . $row['product_sku'] . "<input type='hidden' name='productsku[]' value='" . $row['product_sku'] . "'></td>
                                <td>" . $row['product_category'] . "</td>
                                <td>" . $row['product_name'] . "</td>
                                <td>" . $row['product_size'] . "</td>
                                <td><input type='text' name='productqty[]'></td>
                            </tr>";
                    }
            }
    

    这是我将数据放入数据库时的代码:

    $event_name = $_POST['eventname'];
    $event_date = $_POST['eventdate'];
    $event_place = $_POST['eventplace'];
    $amount = $_POST['amount'];
    
    $product_sku = $_POST['productsku'];
    $quantity = $_POST['productqty'];
    
    
    $sqlcount_product = "SELECT COUNT(product_sku) FROM inventory_tbl WHERE is_deleted = 0;";
    $result = mysqli_query($conn, $sqlcount_product);
    $y = mysqli_fetch_assoc($result);
    
    $sqlst = "INSERT INTO stalltransaction_tbl(event_name, event_place, event_date) VALUE ('$event_name', '$event_place', '$event_date');";
    if (mysqli_query($conn, $sqlst)) {
        $last_id = mysqli_insert_id($conn);
    }
    
    $x = 0;
    while ($x<$y) {
        if (!empty($quantity[$x])) {
            $sqlo = "INSERT INTO stallitems_tbl(stransaction_no, item_no, product_sku, quantity) VALUE ('$last_id', '$x+1', '$product_sku[$x]', '$quantity[$x]');";
            mysqli_query($conn, $sqlo);
    
            $sqlr = "UPDATE inventory_tbl
            SET no_of_stock = (no_of_stock - '$quantity[$x]'), no_of_avstock = (no_of_avstock - '$quantity[$x]')
            WHERE product_sku = '$product_sku[$x]';";
            mysqli_query($conn, $sqlr);
        }
        $x=$x+1;
    }
    $x=0;
    
    $sqla = "UPDATE stransaction_tbl
            SET total_amount = (SELECT SUM(I.item_price*O.quantity) FROM order_tbl O JOIN inventory_tbl I ON O.product_sku = I.product_sku WHERE O.transaction_no = '$last_id')
            WHERE transaction_no = '$last_id';";
    mysqli_query($conn, $sqla);
    
    $sqlp = "INSERT INTO payment_tbl(transaction_no, payors_name, payment_mode, payment_date, amount) VALUE ('$last_id', '$event_name', 'Cash', '$event_date', '$amount');";
    mysqli_query($conn, $sqlp);
    
    header("Location: ../index.php?newstransaction=success");
    

    数据库的输入在stallitems\u tbl insert循环中工作。它执行上面的代码,但在循环之后停止。我知道,因为数据库传输和支付没有改变。它说“超过了30秒的最大执行时间”。帮帮我。我的代码正确吗?谢谢

    2 回复  |  直到 6 年前
        1
  •  0
  •   mickmackusa    6 年前

    我真的不想对这个问题做一个完整的代码审查,但我暗自怀疑它太复杂了。

    至于您的:

    超过30秒的最大执行时间

    我想你有一个无限循环,因为 $x 关联结果集行从未停止。

    我建议:

    $y = mysqli_fetch_row($result)[0];
    

    。。。这 应该 是一个数字。

    p、 我将删除我的评论,并包括我的其他建议:

    出于安全原因,您应该使用占位符实现mysqli准备的语句。

    A. for ($x=0; $x<$y; ++$x) { 循环的语法将比 $x=0; while($x<$y){...$x=$x+1;}

    最后,您的脚本不会执行受影响的行检查,因此 header(...success) 是一种假设。 UPDATE 查询可以是无错误的,并且仍然影响零行,因此您最好在查询过程中包含一些检查点。

        2
  •  0
  •   DevDonkey    6 年前

    主循环中的while check将永远不会退出。

    $y = mysqli_fetch_assoc($result); 将包含数组

    $x = 0;
    while ($x<$y) {
    
    }
    

    $x 是整数,因此比较2将解析为true。因此,你的循环永远不会退出。

    编辑

    如注释中所述,结果集将包含计数,但可以在数组中访问。因此,您需要先提取它,然后才能使用它。

    但是,请注意所有评论。代码很混乱,没有经过深思熟虑。简单的内务管理(如良好的缩进)将帮助您更有效地进行调试。

    此外,如果您使用一个好的IDE,那么大多数家务活都会自动完成。同时考虑使用 xdebug ,能够逐行遍历代码是一个必不可少的工具。