Это для подготовки строки для mysql-запроса. Проблема в NULL. Я хочу, чтобы ТОЛЬКО столбец d был NULL (если он установлен как null в массиве данных). проблема в том, что «isset» имеет значение false, если значение null, и «is_null» также имеет значение true, если не установлено.
И как это исправить?
У меня есть следующее в 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);
?>
ЭТО ВЫВОДЫ:
ВСТАВИТЬ В таблицу (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1', '', '', '', '', '', '', '', 'чао', '', ''), ('2', '', '', '', '', 'привет', '', '', '', '', '') ПРИ ОБНОВЛЕНИИ ДУБЛИКАЦИИ КЛЮЧА b=ЗНАЧЕНИЯ(b), c=ЗНАЧЕНИЯ(c), d=ОБЪЕДИНЯЮТ(ЗНАЧЕНИЯ(d), d), e=ЗНАЧЕНИЯ(e), f=ЗНАЧЕНИЯ(f), g=ЗНАЧЕНИЯ(g) , h = ЗНАЧЕНИЯ (h), i = ЗНАЧЕНИЯ (i), j = ЗНАЧЕНИЯ (j), k = ЗНАЧЕНИЯ (k)
Если я прокомментирую «isset» во внутреннем «foreach» (if (/* isset($val[$c]) && */is_null($val[$c]))
), он выводит:
INSERT INTO table (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1', NULL, '', NULL strong>, '', '', NULL, NULL, 'ciao', '', ''), ('2', '', '', NULL , '', 'hello', '', '', '', NULL, NULL) ПРИ ОБНОВЛЕНИИ ДУБЛИКАЦИИ КЛЮЧА b=VALUES(b), c=VALUES(c), d=COALESCE( ЗНАЧЕНИЯ (d), d), e = ЗНАЧЕНИЯ (e), f = ЗНАЧЕНИЯ (f), g = ЗНАЧЕНИЯ (g), h = ЗНАЧЕНИЯ (h), i = ЗНАЧЕНИЯ (i), j = ЗНАЧЕНИЯ (j), к = ЗНАЧЕНИЯ (к)
РЕЗУЛЬТАТ, КОТОРЫЙ Я ХОЧУ:
INSERT INTO table (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1', '', '', NULL, '', '', '', '', 'чао', '', ''), ('2', '', '', NULL, '', 'привет', '', '', '', '', '') ПРИ ОБНОВЛЕНИИ ДУБЛИРОВАННОГО КЛЮЧА b=ЗНАЧЕНИЯ(b), c=ЗНАЧЕНИЯ(c), d=ОБЪЕДИНЯЮТ(ЗНАЧЕНИЯ(d), d), e=ЗНАЧЕНИЯ(e), f = ЗНАЧЕНИЯ (f), g = ЗНАЧЕНИЯ (g), h = ЗНАЧЕНИЯ (h), i = ЗНАЧЕНИЯ (i), j = ЗНАЧЕНИЯ (j), k = ЗНАЧЕНИЯ (k)