php - 带有if和else语句的foreach循环在if语句为假时不执行else语句
问题描述
背景:
我有一个关于各种产品的数据库表。此数据库表称为产品。列设置为 id | group_id | model | description | price |
。
id = the product id.
group_id = identifies the group that this product belongs too.
model = product model
description = Description
price = Price
从这个表中,我生成一个基于表的动态group_id
表product
。
<table>
<tr>
<th>Model</th>
<th>Description</th>
<th>Price</th>
<th>QTY</th>
</tr>
<?php
$conn = mysqli_connect("localhost", "root", "root", "test");
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql ="SELECT * FROM product WHERE group_id = 2";
$result = $conn->query($sql);
while($row = $result->fetch_assoc()) :
?>
<tr>
<td><?php echo $row['model']; ?></td>
<td><?php echo $row['description']; ?></td>
<td>R <?php echo $row['price']; ?></td>
<td><input type="number" name = "<?php echo $row['id']?>" value = 0></td>
</tr>
<?php endwhile; ?>
</table>
<div class="input-group">
<button type="submit" class="btn" name="save">Save and Return</button>
</div>
</form>
这很好用。生成此表后,它允许用户编辑属于该表quantity
的每个产品group id
,在提交使用POST
时,信息将发送到config_824.php
请参阅下面的代码以获取此文件。
<?php
session_start();
include ('customer_details_config.php');
$quote_id = $_SESSION['quote_id'];
$salesman_id = $_SESSION['salesman_id'];
$db = mysqli_connect('localhost', 'root', 'root', 'test');
if (isset($_POST['save_pan_han'])){
unset($_POST['save_pan_han']);
foreach($_POST as $key => $value):
$test_query = "SELECT * FROM quote_items WHERE quote_id = $quote_id AND prod_id = $key AND rep_id = $salesman_id";
$result = mysqli_query($db, $test_query);
$item = mysqli_fetch_assoc($result) or die (mysqli_error($db));
if($item['quote_id'] == $quote_id &&
$item['prod_id'] == $key &&
$item['rep_id'] == $salesman_id){
$update_query = "UPDATE quote_items SET
qty = $value
WHERE
quote_id = $quote_id
AND prod_id = $key
AND rep_id = $salesman_id
";
mysqli_query($db,$update_query) or die (mysqli_error($db));
}else{
$query = "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) VALUES ($quote_id, $key, $salesman_id, $value)" ;
mysqli_query($db,$query) or die (mysqli_error($db));
}
endforeach;
}
?>
$quote_id
设置为$_SESSION['quote_id']
和用户登录时$salesman_id
设置为$_SESSION['salesman_id']
。
报价项目表有名为 id
, quote_id
, prod_id
, rep_id
, 的列qty
CREATE TABLE `project`.`quote_items` ( `id` INT(10) NOT NULL AUTO_INCREMENT , `quote_id` INT(10) NOT NULL , `prod_id` INT(10) NOT NULL , `rep_id` INT(10) NOT NULL , `qty` INT(10) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;
根据上面的代码,我正在尝试将数据插入到名为 quote_items 的数据库表中,如果我将测试数据插入到数据库中,则UPDATE
查询运行良好。
问题:
问题是,如果它检查并且该行不在数据库中,则INSERT
查询不起作用。尽管error showing = TRUE
.
我将使用以下示例:我在数据库中有六行测试数据。动态表允许设置 8 个值并将其发送到数据库。所以说前两个值已经在数据库中并且符合UPDATE
查询。值 3 和 4 尚未插入,将在INSERT
查询范围内。值 5、6、7 和 8 再次属于Update
查询范围。
如果我运行代码。只有第 1 行和第 2 行会被更新。不会插入第 3 行和第 4 行,也不会更新第 5、6、7、8 行。
我试过的:
Stackoverflow 使用 mysqli_autocommit($db,FALSE);
SQL
复制查询并通过in插入数据库phpMyAdmin
,如果我从查询中删除变量,它可以正常工作INSERT
。
正如您在上面的代码中看到的那样,当我回显数组包含 table 的数组时,我注意到了 unset($var) name
。这是一个字符串。如果我尝试插入一个字符串,这显然会导致问题,我认为这会解决问题。
遗憾的是,情况并非如此。
通过删除 if 和 elseif 并仅使用下面评论中推荐的 insert 进行测试:
<?php
include ('customer_details_config.php');
$quote_id = $_SESSION['quote_id'];
$salesman_id = $_SESSION['salesman_id'];
$db = mysqli_connect('localhost', 'root', 'root', 'test');
if (isset($_POST['save_pan_han'])):
foreach($_POST as $key => $value):
$test_query = "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) VALUES ($quote_id, $key, $salesman_id, $value)";
$result = mysqli_query($db, $test_query) or die (mysqli_error($db));
/*
$item = mysqli_fetch_assoc($result) ;
if ($item['quote_id'] == $quote_id &&
$item['prod_id'] == $key &&
$item['rep_id'] == $salesman_id
){
$update_query = "UPDATE quote_items SET
qty = $value
WHERE
quote_id = $quote_id
AND prod_id = $key
AND rep_id = $salesman_id
";
mysqli_query($db,$update_query) or die (mysqli_error($db));
}else{
$query = "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) VALUES ($quote_id, $key, $salesman_id, $value)" ;
mysqli_query($db,$query) or die (mysqli_error($db));
}
*/
endforeach;
endif;
?>
解决方案
插入时是否有原因将“”添加到列名?当您执行更新时,您不会这样做。
替换这个:
"INSERT INTO quote_items ('quote_id', 'prod_id', 'rep_id', 'qty') VALUES ($quote_id, $key, $salesman_id, $value)"
和:
"INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) VALUES ($quote_id, $key, $salesman_id, $value)"
或者也许你想用这个:`
"INSERT INTO quote_items (`quote_id`, `prod_id`, `rep_id`, `qty`) VALUES ($quote_id, $key, $salesman_id, $value)"
检查此演示
推荐阅读
- javascript - 在 react 应用程序中使用 react router v4 的正确方法
- ruby-on-rails - 如何使用 rolify gem 检查角色?
- python - cv2和Flask,destroywindows函数后窗口不打开
- ios - 如何在不改变其位置的情况下在界面构建器中将子视图置于前面
- kotlin - Camel:当项目数小于批量大小时如何拆分然后聚合
- javascript - 使用函数 .map() 更新状态是变异状态?
- node.js - 无法从“src\containers\Login.js”解析“firebase”
- html - 映射onclick禁用父div的滚动条
- php - TCPDF 问题:如何对齐文本和图像?
- ruby-on-rails - 在范围内使用关联域进行计算