背景:
我有一个关于各种产品的数据库表。该数据库表称为产品。列设置为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
的{{1}}生成一个动态表。
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
。
quotes项目表具有称为$_SESSION['salesman_id']
,id
,quote_id
,prod_id
,rep_id
的列
qty
按照上面的代码,我试图将数据插入名为quote_items的数据库表中,如果我将测试数据插入数据库,则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;
查询运行良好。
问题:
问题是,如果它检查并且该行不在数据库中,则UPDATE
查询将不起作用。尽管有INSERT
,我也看不到任何错误。
我将使用以下示例:
我在数据库中有六行测试数据。动态表允许设置8个值并将其发送到数据库。假设前两个值已经在数据库中,并且符合error showing = TRUE
查询。值3和4尚未插入,将属于UPDATE
查询。值5、6、7和8再次属于INSERT
查询。
如果我运行代码。仅第1行和第2行会被更新。将不会插入第3行和第4行,也不会更新第5、6、7、8行。
我尝试过的事情:
Stackoverflow using mysqli_autocommit($db,FALSE);
复制查询并通过Update
中的SQL
插入数据库,如果我从查询中删除变量,则它在phpMyAdmin
上运行良好。
正如您在上面的代码中看到的那样,当我回显该数组包含表INSERT
时,我注意到有一个unset($ var)。这是一个字符串。如果我尝试插入字符串,这显然会引起问题,而我将解决此问题。
可惜情况并非如此。
通过删除if和elseif并仅按照下面的注释中的建议使用插入来进行测试:
name
答案 0 :(得分:1)
插入时是否有理由在列名称中添加''? 当您执行UPDATE时,请勿这样做。
替换此:
"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)"
选中此DEMO
答案 1 :(得分:0)
像在update语句中一样,在insert语句中的值周围添加单引号,以便在SQL中将其正确识别为字符串。
除了不是字符串的字段外,但是由于您没有发布创建表脚本,因此无法从代码中分辨出来。
使用字符串连接来构建SQL语句也是一个可怕的安全问题,您绝对必须使用PDO和准备好的语句!
答案 2 :(得分:-1)
我终于得到了想要的结果。好吧。
$db = mysqli_connect('localhost', 'root', 'root', 'test');
if (isset($_POST['save_pan_han'])){
unset($_POST['save_pan_han']);
foreach($_POST as $key => $value):
$query = "INSERT INTO quote_items (quote_id, prod_id, rep_id, qty) SELECT $quote_id, $key, $salesman_id, $value WHERE NOT EXISTS (SELECT quote_id, prod_id, rep_id, qty FROM quote_items WHERE quote_id = $quote_id AND prod_id = $key AND rep_id = $salesman_id)";
mysqli_query($db,$query) or die (mysqli_error($db));
endforeach;
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));
}
endforeach;
}
?>
唯一的问题是,这现在还会在qty = 0
我将只包含一个DROP
查询。如果有人有更好的建议,请补充。我知道我对数据库进行了太多调用,这才是最好的解决方案。