php - 根据先前查询的结果显示某些项目的 SQL 查询有什么问题?

标签 php mysql mysqli

我正在尝试显示当前可用的汽车列表。我对我期望完成的工作进行了巨大的查询,但它没有显示任何汽车,如果我使用 var_dump() 输出它给我的 $available 的值这个输出:

array(2) { [0]=> string(1) "1" ["car_car_id"]=> string(1) "1" }

下面代码的输出是回显 test 字符串文字 3 次。

SQL 出了什么问题?

  <?php
            $result = mysqli_query($con, "SELECT car_car_id FROM invoice_line WHERE '2017-06-12' > start_date AND '2017-06-12' < end_date OR '2017-06-12' > start_date AND '2017-06-14' < start_date OR '2017-06-12' < start_date AND '2017-06-14' > end_date OR '2017-06-12' != start_date OR '2017-06-14' != end_date OR '2017-06-12' != end_date OR '2017-06-14' != start_date");
            $available = mysqli_fetch_array($result);
            $product_array= mysqli_query($con, "SELECT * FROM car WHERE id != '$available'");
            while($result = mysqli_fetch_array($product_array)){
              echo 'test';
            }
            if (!empty($product_array)) {
              foreach($product_array as $key=>$value){
            ?>
              <div class="product-item">
                <form method="post" action="cars.php?action=add&code=<?php echo $product_array[$key]["id"]; ?>">
                <div><strong><?php echo $product_array[$key]["brand"]; ?> <?php echo $product_array[$key]["type"]; ?></strong></div>
                <div class="product-price"><?php echo "€".$product_array[$key]["price"]; ?></div>
                <div><input type="submit" value="toevoegen aan winkelwagen" class="btnAddAction" /></div>
                </form>
              </div>
            <?php
                }
            }
            ?>

expected table output

最佳答案

太;博士:

在第二个 SQL 查询中使用 NOT IN () 而不是 id != '$available',并分隔数组的值(例如使用 implode() )。

你的问题

Whats wrong with the sql?

最值得注意的问题是第二个查询将从第一个查询获取数组返回的数组直接放入第二个查询中。这一行:

$product_array= mysqli_query($con, "SELECT * FROM car WHERE id != '$available'");

当替换$available时可以概念化为:

$product_array= mysqli_query($con, "SELECT * FROM car WHERE id != 'Array'");

大概所需的条件是 car 表的 id 字段不等于汽车 id 数组中的任何值(来自第一个查询)。在 SQL 中我们可以使用 IN运算符,与 NOT 组合。例如:

WHERE id NOT IN (3,4)

有多种技术可以使用 PHP 生成此内容。一是使用implode()创建逗号分隔的字符串:

$available = array('car_car_id' => 3, 'car_car_id' => 4); //Sample
$ids = implode(', ', $available); //3,4 when $available has those elements
$product_array= mysqli_query($con, "SELECT * FROM car WHERE id NOT IN ($ids)");

重复值

您可能会注意到 ID 是重复的:

array(2) { [0]=> string(1) "1" ["car_car_id"]=> string(1) "1" }

这是因为 $resulttype 没有(第二个nd)参数传递至mysql_fetch_array()默认值为MYSQLI_BOTH:

$available = mysqli_fetch_array($result);

要仅选择列的名称,请使用MYSQLI_ASSOC

$available = mysqli_fetch_array($result, MYSQLI_ASSOC);
// => Array ( [car_car_id] => 1 )

或者仅对于数字索引,使用 MYSQLI_NUM

$available = mysqli_fetch_array($result, MYSQLI_NUM);
// => Array ( [0] => 1 )

WHERE 子句中的第一个查询运算符

Yusef Hassan the first comment中提到,需要考虑条件。请记住,AND 的优先级高于 OR(请参阅 MySQL Operator Precedence)。

两者之间有很大区别:

SELECT car_car_id 
FROM invoice_line 
WHERE '2017-06-12' > start_date AND '2017-06-12' < end_date
 OR '2017-06-12' > start_date AND '2017-06-14' < start_date 
 OR '2017-06-12' < start_date AND '2017-06-14' > end_date 
 OR '2017-06-12' != start_date OR '2017-06-14' != end_date 
 OR '2017-06-12' != end_date OR '2017-06-14' != start_date

还有

SELECT car_car_id 
FROM invoice_line 
WHERE ('2017-06-12' > start_date AND '2017-06-12' < end_date)
 OR ('2017-06-12' > start_date AND '2017-06-14' < start_date) 
 OR ('2017-06-12' < start_date AND '2017-06-14' > end_date) 
 OR ('2017-06-12' != start_date OR '2017-06-14' != end_date) 
 OR ('2017-06-12' != end_date OR '2017-06-14' != start_date)

事后分析

这里解决的问题很可能可以通过在 SQL 中使用子查询来避免(例如 SELECT * FROM car WHERE id NOT IN (SELECT car_car_id FROM发票_line WHERE ...))或LEFT JOIN条件如 car_car_id IS NULL

关于php - 根据先前查询的结果显示某些项目的 SQL 查询有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44530391/

相关文章:

php - 在 Mysql 数据库中添加新记录时触发 ajax

php - 使用php从日期中减去天、月或年

php - 如何在 Laravel 中隐藏空类别

php - get_result() 函数的替代品?

php - 有没有办法在MySQL中获取自动提交的默认值?

php - 如果没有准备好的语句,如何防止 SQL 注入(inject)?

php - 如何知道 Solr 搜索在 Magento CE 中的工作原理

php - 如何在后台执行多个 bash 命令

mysql - 插入触发器后创建 View

php - sql查询唯一/不同的行