我有多个类似于下面的数组。
{
["sku_original"]=>
string(33) "98iuoo"
["po"]=>
string(5) "9897"
["ca"]=>
string(3) "557"
["cl"]=>
string(5) "33"
["aa"]=>
string(3) "80"
["ad"]=>
NULL
["da"]=>
string(4) "143.9"
["dr"]=>
NULL
["cors"]=>
NULL
}当数组中的值为null时,我想使用IS NULL条件,否则我必须检查equal to条件,如果不是空的话。我试过像下面这样的东西。
$po = $option['po'] != NULL ? $option['po'] : NULL ;
$ca = $option['ca'] != NULL ? $option['ca'] : NULL ;
$cl = $option['cl'] != NULL ? $option['cl'] : NULL ;
$aa = $option['aa'] != NULL ? $option['aa'] : NULL ;
$ad = $option['ad'] != NULL ? $option['ad'] : NULL ;
$da = $option['da'] != NULL ? $option['da'] : NULL ;
$dr = $option['dr'] != NULL ? $option['dr'] : NULL ;
$cors = $option['cors'] != NULL ? $option['cors'] : NULL ;如果选项索引为null,我也尝试过.。
和SQL如下所示。
$sql = "SELECT abc FROM `abc` WHERE `po` = $po AND `ca` = $ca AND `cl` = $cl AND `aa` = $aa AND `ad` = $ad AND `da` = $da AND `dr` = $dr AND `dr` = '$dr' AND `cors` = '$cors' `sku` = '$sku' ";当值为空时,我必须在SQL中检查IS NULL,否则我必须使用equal to。
发布于 2021-05-29 21:46:55
在迭代options变量(假设您已经使用表列名的白名单验证了所有键)时,有条件地将静态IS NULL表达式写入WHERE子句或非空值的绑定参数。
// unconditionally include sku
$where[] = "sku = ?";
$params = ['s', $sku];
foreach ($option as $key => $value) {
if ($value === null) {
$where[] = "$key IS NULL";
} else {
$where[] = "$key = ?";
$params[0] .= 's';
$params[] = $value;
}
}
$sql = "SELECT column_with_different_name_from_table
FROM abc
WHERE " . implode(" AND " , $where);
$stmt = $conn->prepare($sql);
$stmt->bind_param(...$params);
$stmt->execute();
$result = $stmt->get_result();
foreach ($result as $row) {
echo $row['column_with_different_name_from_table'] . "<br>";
}发布于 2021-05-29 20:15:53
可以在准备好的语句中直接使用NULL。下面是构建查询的一种动态方法
// put all your variables in an array
$vars = array('po', 'ca', 'ab') ;
// iterate through and set up your key/value pairs
foreach ($vars as $var) {
$val = (isset($option[$var]) && !is_null($option[$var])) ? $option[$var] : NULL;
$q[] = " $var = ? ";
$v[] = $val ;
}
// set up the prepared statement
$query = "SELECT abc FROM `abc` WHERE " . implode(" AND " , $q) ;
$stmt = $mysqli->prepare($query);
$types = str_repeat("s", count($q)) ;
$stmt->bind_param($types, ...$v);
$stmt->execute();发布于 2021-05-29 22:05:34
如果您只是想要光学标准,您可以在SQL中通过询问“是参数集,然后使用它,否则不要”来处理这个问题。
$sql = "SELECT abc FROM abc WHERE (po = $po OR $po IS NULL) AND (ca = $ca OR $ca IS NULL) ...";它也可以写成
$sql = "SELECT abc FROM abc WHERE po <=> COALESCE($po, po) AND ca <=> COALESCE($ca, ca) ...";在MySQL中(因此每个参数在查询中只有一次,而不必使用两次)。
更新:我在上面的答案中重点讨论了。已经提到,不应该通过连接构建查询字符串,而应该使用准备好的语句并绑定变量。这是正确的。我不是一个PHP程序员,但是上面分配的区别似乎主要是用一个$来代替:。就像这样:
$sql = "SELECT abc FROM abc WHERE po <=> COALESCE(:po, po) AND ca <=> COALESCE(:ca, ca) ...";
$query = $pdo->prepare($sql);
$query->bindParam(":po", $option["po"]);
$query->bindParam(":ca", $option["ca"]);
...
$query->execute();https://stackoverflow.com/questions/67755267
复制相似问题