首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL检查是否null如果值使用php为空

MySQL检查是否null如果值使用php为空
EN

Stack Overflow用户
提问于 2021-05-29 19:51:30
回答 3查看 165关注 0票数 1

我有多个类似于下面的数组。

代码语言:javascript
复制
{
  ["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条件,如果不是空的话。我试过像下面这样的东西。

代码语言:javascript
复制
$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如下所示。

代码语言:javascript
复制
$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

EN

回答 3

Stack Overflow用户

发布于 2021-05-29 21:46:55

在迭代options变量(假设您已经使用表列名的白名单验证了所有键)时,有条件地将静态IS NULL表达式写入WHERE子句或非空值的绑定参数。

代码语言:javascript
复制
// 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>";
}
票数 1
EN

Stack Overflow用户

发布于 2021-05-29 20:15:53

可以在准备好的语句中直接使用NULL。下面是构建查询的一种动态方法

代码语言:javascript
复制
// 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();
票数 0
EN

Stack Overflow用户

发布于 2021-05-29 22:05:34

如果您只是想要光学标准,您可以在SQL中通过询问“是参数集,然后使用它,否则不要”来处理这个问题。

代码语言:javascript
复制
$sql = "SELECT abc FROM abc WHERE (po = $po OR $po IS NULL) AND (ca = $ca OR $ca IS NULL) ...";

它也可以写成

代码语言:javascript
复制
$sql = "SELECT abc FROM abc WHERE po <=> COALESCE($po, po) AND ca <=> COALESCE($ca, ca) ...";

在MySQL中(因此每个参数在查询中只有一次,而不必使用两次)。

更新:我在上面的答案中重点讨论了。已经提到,不应该通过连接构建查询字符串,而应该使用准备好的语句并绑定变量。这是正确的。我不是一个PHP程序员,但是上面分配的区别似乎主要是用一个$来代替:。就像这样:

代码语言:javascript
复制
$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();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67755267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档