如果if语句为false,则使用if和else语句的Foreach循环不会执行else语句

时间:2019-11-25 10:34:58

标签: php mysql sql

背景:

我有一个关于各种产品的数据库表。该数据库表称为产品。列设置为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']idquote_idprod_idrep_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

3 个答案:

答案 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查询。如果有人有更好的建议,请补充。我知道我对数据库进行了太多调用,这才是最好的解决方案。