我在表单中做了输入标记的循环。我的这个代码是:
$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
答案 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
个查询可以没有错误,但仍会影响零行,因此在整个过程中包含一些检查点是明智的。