【发布时间】:2023-04-11 12:03:01
【问题描述】:
这是为 mysql-query 准备一个字符串。问题是关于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', '', '', '', '', '', '', '', 'ciao', '', ''), ('2', '', '', '', '', 'hello', '', '', '', '', '') 重复键更新 b=VALUES(b), c=值(c),d=合并(值(d),d),e=值(e),f=值(f), g=VALUES(g), h=VALUES(h), i=VALUES(i), j=VALUES(j), k=VALUES(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', NULL, '', NULL, '', '', NULL, NULL, 'ciao', '', ''), ( '2', '', '', NULL, '', 'hello', '', '', '', NULL, NULL) ON DUPLICATE KEY UPDATE b=值(b),c=值(c),d=合并(值(d),d),e=值(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', '', '', NULL, '', '', '', '', 'ciao', '', ''), ('2', '', '', NULL , '', 'hello', '', '', '', '', '') 重复键更新 b=VALUES(b), c=值(c),d=合并(值(d),d),e=值(e),f=值(f), g=VALUES(g), h=VALUES(h), i=VALUES(i), j=VALUES(j), k=VALUES(k)
【问题讨论】: