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

时间:2018-03-29 07:48:06

标签: php mysql mysqli phpmyadmin

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

$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秒的最大执行时间”#39;帮我。我的代码是否正确? Thanksss

2 个答案:

答案 0 :(得分:0)

你在主循环中的检查永远不会退出。

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

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

}

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

修改

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

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

此外,如果您使用一个好的IDE,那么大多数这些内务工作都会自动完成。另外考虑使用xdebug,能够逐行逐步执行代码是必不可少的工具。

答案 1 :(得分:0)

我真的不想对这个问题进行完整的代码审查,但我有一种潜在的怀疑,认为它过于复杂。

至于你:

  

超过30秒的最长执行时间

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

我建议:

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

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

P.S。我将删除我的评论并包含其他建议:

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

for ($x=0; $x<$y; ++$x) {循环将比$x=0; while($x<$y){...$x=$x+1;}更清晰。

最后,您的脚本不执行受影响的行检查,因此header(...success)是一个假设。 UPDATE个查询可以没有错误,但仍会影响零行,因此在整个过程中包含一些检查点是明智的。