【问题标题】:Loop textbox and loop input gathering循环文本框和循环输入收集
【发布时间】:2018-09-08 02:12:39
【问题描述】:

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

$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_tbl 插入循环中。它执行上面的代码,但在循环之后它会停止。我知道是因为数据库交易和支付没有改变。它说“超过 30 秒的最大执行时间”。帮我。我的代码正确吗?谢谢

【问题讨论】:

    标签: php mysql mysqli phpmyadmin


    【解决方案1】:

    我真的不想对这个问题做一个完整的代码审查,但我偷偷怀疑它过于复杂。

    至于你的:

    最大执行时间超过 30 秒

    我认为您有一个无限循环,因为$x 永远不会被关联结果集行停止。

    我推荐:

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

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

    附言我将删除我的 cmets 并包含我的其他建议:

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

    for ($x=0; $x&lt;$y; ++$x) { 循环将比 $x=0; while($x&lt;$y){...$x=$x+1;} 更简洁的语法。

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

    【讨论】:

      【解决方案2】:

      您在主循环中的 while 检查将永远不会退出。

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

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

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

      编辑

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

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

      此外,如果您使用良好的 IDE,那么大多数内务工作都会自动完成。还可以考虑使用xdebug,能够逐行遍历代码是必不可少的工具。

      【讨论】:

      • OP 在查询中执行 COUNT(product_sku),因此 mysqli_num_rows 将始终返回 1。
      • 我很抱歉。我的教授是一个隐形人。我有点难以学习,因为我没有指导从哪里开始或其他什么。我用括号。非常感谢。
      猜你喜欢
      • 2018-07-16
      • 1970-01-01
      • 2023-03-27
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多