php isset и is_null: проблемы с неустановленными значениями и нулевыми значениями в состоянии php

Это для подготовки строки для 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)


person John Doe Smith    schedule 13.03.2013    source источник


Ответы (1)


Вы можете использовать array_key_exists($c,$val) вместо isset($val[$c]). Он работает очень последовательно. У меня такая же проблема решилась таким образом.

person Ihsan    schedule 13.03.2013
comment
Добро пожаловать, и хорошего дня. - person Ihsan; 13.03.2013