MySQL - Как вставить возможно нулевое значение - PullRequest
1 голос
/ 29 ноября 2011

У меня есть некоторые значения в сценарии PHP, которые я должен вставить в таблицу MySQL. Вот, например, 3 даты d1, d2 и d3.

У меня есть инструкция по умолчанию для вставки значений в базу данных:

insert into mytable set a=1, b=2, d1='$val', d2='$val2', d3='$val3'

Есть ли очень простой способ написать оператор SQL для вставки в N1LL значения d1, d2 и d3 вместо даты, если один (или более) из $val1, $val2 и $val3 равен нулю? Без необходимости иметь дело с новыми переменными PHP?

Ответы [ 4 ]

4 голосов
/ 29 ноября 2011

Предполагая, что у вас есть все в массиве $data:

$query_string = "insert into mytable set a=1, b=2, d1=" .
    (isset($data['val1']) ? "'" . $data['val1'] . "'" : 'NULL') . ", d2=" .
    (isset($data['val2']) ? "'" . $data['val2'] . "'" : 'NULL') . ", d3=" .
    (isset($data['val3']) ? "'" . $data['val3'] . "'" : 'NULL') . ";";

Строка будет содержать, например,.d2=NULL вместо d2='xyz', если значение в массиве не существует или равно null.

Также необходимо убедиться, что строки, которые вы хотите вставить в запрос, должным образом очищены(например, используя mysql_real_escape_string()). В моем ответе ваши переменные считаются уже подготовленными и обработанными , поскольку вам нужно было только узнать, как вставить NULL значения вместо имеющихся у вас переменных.вопрос был только во вводе NULL значений в запросе, основанном на значении переменных, я не думаю, что подробное обсуждение санации здесь было бы хорошей идеей.Вы можете найти гораздо более подробную информацию о SQL-инъекциях и о том, как их предотвратить в PHP, здесь: Лучший способ остановить SQL-инъекции в PHP .Удачи!:)

3 голосов
/ 29 ноября 2011

Возможно, есть лучший способ сделать это, но если ничего не помогает, вы можете сделать это с каждым из ваших значений:

$val = isset($val) ? "'$val'" : "NULL";

Затем измените строку запроса PHP следующим образом:

insert into mytable set a=1, b=2, d1=$val, d2=$val2, d3=$val3

Вам следует рассмотреть возможность использования подготовленных операторов и PDO вместо построения строки запроса, подобной этой, особенно если в ваши переменные входит пользовательский ввод.

1 голос
/ 29 ноября 2011

Самое простое было бы определить

function esc_null($src) {
    return $src === null ? 'NULL' : ("'" + mysql_real_string_escape($src) + "'");
}

"insert into mytable set a=1, b=2, d1=" . esc_null($val) . ", d2=" . esc_null($val2) . ", d3=" . esc_null($val3)

Это также обеспечивает целостность ваших запросов.

0 голосов
/ 09 декабря 2011

Я обнаружил, что это самый простой способ сделать то, что я хотел сделать:

INSERT INTO mytable SET a=1, b=2, d1=IF('$val' = '', NULL, '$val');
...