1

これは、mysql-query の文字列を準備するためのものです。問題はNULLについてです。「d」列のみをNULLにしたい(データ配列でnullとして設定されている場合)。問題は、null の場合は「isset」が false であり、設定されていない場合は「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);
?>

この出力:

INSERT INTO テーブル (id、b、c、d、e、f、g、h、i、j、k) VALUES ('1'、''、''、''、''、''、''、 '', 'ciao', '', ''), ('2', '', '', '', '', 'こんにちは', '', '', '', '', '')重複キー更新時 b=VALUES(b), c=VALUES(c), d=COALESCE(VALUES(d), d), e=VALUES(e), f=VALUES(f), g=VALUES(g) 、h=VALUES(h)、i=VALUES(i)、j=VALUES(j)、k=VALUES(k)

内部の「foreach」() の「isset」にコメントを付けると、次の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 , '', '', NULL, NULL , ' ciao', '', ''), ('2', '', '', NULL , '', 'hello', '', '', '', NULL, NULL ) ON DUPLICATE KEY UPDATE b=VALUES (b)、c=VALUES(c)、d=COALESCE(VALUES(d)、d)、e=VALUES(e)、f=VALUES(f)、g=VALUES(g)、h=VALUES(h) 、i=VALUES(i)、j=VALUES(j)、k=VALUES(k)

私が望む出力:

INSERT INTO table (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1', '', '', NULL , '', '', '', ' ', 'ciao', '', ''), ('2', '', '', NULL , '', 'hello', '', '', '', '', '') ON DUPLICATEキー更新 b=VALUES(b), c=VALUES(c), d=COALESCE(VALUES(d), d), e=VALUES(e), f=VALUES(f), g=VALUES(g), h =VALUES(h)、i=VALUES(i)、j=VALUES(j)、k=VALUES(k)

4

1 に答える 1

3

isset($val[$c])の代わりにarray_key_exists ($c,$val)を使用できます。それは非常に一貫して動作します。私は同じ問題をそのように解決しました。

于 2013-03-13T08:57:37.977 に答える