我正在尝试显示当前可用的汽车列表。我对我期望完成的工作进行了巨大的查询,但它没有显示任何汽车,如果我使用 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
}
}
?>
最佳答案
太;博士:
在第二个 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/