首页 > 解决方案 > 带有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_idproduct

      <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;


?>

标签: phpmysqlsql

解决方案


插入时是否有原因将“”添加到列名?当您执行更新时,您不会这样做。

替换这个:

"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)"

检查此演示


推荐阅读