У меня есть несколько столбцов типа int, но значение пустое. Итак, я хочу преобразовать пустой в нуль при вставке в базу данных. Я использую код:
function toDB($string) {
if ($string == '' || $string == "''") {
return 'null';
} else {
return "'$string'";
}
}
//age,month,year is type integer.
$name="Veo ve";
$age='10';
$month='';
$year='';
$query="Insert Into tr_view(name,age,month,year) values ({toDB($name)},{toDB($age)},{toDB($month)},{toDB($year)})
$db->setQuery($query);
$result= $db->query();
Но он показывает ошибку:
pg_query(): Query failed: ERROR: syntax error at or near ";" LINE 153: {toDB(10)}, ^ in...
Почему?
Решение проблемы
Есть NULLIF()функция:
SELECT NULLIF(var, '');
Если varравно второму параметру, NULLвместо этого вы получите.
В примере пустая строка заменяется ''на NULL.
Для типа integer нет "пустой строки". Оба параметра должны быть совместимого типа, поэтому дезинфицируйте свой ввод в PHP.
Если вы не определили столбец по умолчанию, вы также можете просто опустить столбец в INSERTкоманде, и он будет заполнен NULL(что является значением по умолчанию DEFAULT).
Проверьте, не пуст ли параметр в PHP, и не включайте столбец в INSERTкоманду, если это так.
Или вместо этого используйте PHP-литерал NULL, как показано здесь Quassnoi.
Остальное имеет смысл только для строковых типов
Чтобы быть абсолютно уверенным, что никто не может ввести пустую строку, добавьте CHECKв таблицу ограничение:
ALTER TABLE tr_view
ADD CONSTRAINT tr_view_age_not_empty CHECK (age <> '');
Чтобы избежать исключений, вызванных этим, вы можете добавить триггер, который автоматически исправляет ввод:
CREATE OR REPLACE FUNCTION trg_tr_view_avoid_empty()
RETURNS trigger
LANGUAGE plpgsql AS
$func$
BEGIN
IF NEW.age = '' THEN
NEW.age:= NULL;
END IF;
IF NEW.month = '' THEN
NEW.month:= NULL;
END IF;
RETURN NEW;
END
$func$;
CREATE TRIGGER tr_view_avoid_empty
BEFORE INSERT OR UPDATE ON tr_view
FOR EACH ROW
WHEN (NEW.age = '' OR NEW.month = '')
EXECUTE PROCEDURE trg_tr_view_avoid_empty();
Комментариев нет:
Отправить комментарий