PHP isset和is_null: PHP条件中notset值和null值的问题


php isset and is_null: problems with notset values and null-values in php condition

这是为mysql查询准备字符串。问题是关于NULL。我希望只有'd'列为NULL(如果在数据数组中设置为NULL)。问题是,'isset'是假的,如果null和'is_null'也为真,如果没有设置。

我该怎么解决呢?

我在php中有以下内容:

<?
$data = array(
    array('id' => 1, 'c' => '', 'd' => NULL, 'e' => '', 'f' => '', 'i' => 'ciao', 'j' => '', 'k' => ''),
    array('id' => 2, 'b' => '', 'c' => '', 'd' => NULL, 'e' => '', 'f' => 'hello', 'g' => '', 'h' => '', 'i' => ''),
);
$col = array('id', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k');
$insert = $update = array();
foreach (array_values($data) as $key => $val){
    $val_stack = array();
    $insert[$key] = "(";
    foreach ($col as $c){
        if (isset($val[$c]) && is_null($val[$c])) $val_stack[] = 'NULL';
        else if (isset($val[$c])) $val_stack[] = "'".$val[$c]."'";
        else $val_stack[] = "''";
    }
    $insert[$key] .= implode(', ', $val_stack).")";
}
foreach (array_diff($col, array('id')) as $v){
    $update[] = $v == 'd' ? "$v=COALESCE(VALUES($v), $v)" : "$v=VALUES($v)";
}
echo "INSERT INTO table (".implode(', ', $col).") VALUES ".implode(', ', $insert)." ON DUPLICATE KEY UPDATE ".implode(', ', $update);
?>
这个输出:

INSERT INTO table (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1', ', ', ', ','', '', '', '', '', '', ' 再见 ', '', ''), (' 2 ', '', '', '', '',"你好 ', '', '', '', '', '') 在重复键更新b =值(b),c=VALUES(c), d=COALESCE(VALUES(d), d), e=VALUES(e), f=VALUES(f),g (g) =值,h =值(h), i =值(i), j =值(j), k =值(k)

如果我在内部"foreach"(if (/* isset($val[$c]) && */is_null($val[$c])))中注释"isset",它输出:

INSERT INTO table (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1',零",, '', '', 空,空,再见 ', '', ''), (' 2 ', '', '',零","你好 ', '', '', '', 空,空)复制关键更新b=VALUES(b), c=VALUES(c), d=COALESCE(VALUES(d), d), e=VALUES(e),f =值(f), g (g) =值,h =值(h), i =值(i), j =值(j),k =值(k)

我想要的输出:

INSERT INTO table (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1', ', ', ', ',零, '', '', '', '', ' 再见 ', '', ''), (' 2 ', '', '', <"零,"你好 ', '', '', '', '', '') 在重复键更新b =值(b),c=VALUES(c), d=COALESCE(VALUES(d), d), e=VALUES(e), f=VALUES(f),g (g) =值,h =值(h), i =值(i), j =值(j), k =值(k)

您可以使用 array_key_exists (c, val美元)收取(val美元[c]美元)。它的效果非常一致。我用这种方法解决了同样的问题。