Как преобразовать пустой в null в PostgreSQL?

У меня есть несколько столбцов типа int, но значение пусто. Поэтому я хочу преобразовать пустой в null, когда я вставляю в базу данных. Я использую код:

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 является удивительным , он не учитывает вашу синтаксическую ошибку.

Давайте посмотрим на запрос:

 $query="Insert Into tr_view(name,age,month,year) values ({toDB($name)},{toDB($age)},{toDB($month)},{toDB($year)}) 

Раньше вы определяли функцию, называемую toDB . К сожалению, синтаксис, который вы используете здесь, заключается не в том, как вызывать функцию из строки с двумя toDB( , поэтому колышки и toDB( бит все еще проходят. Существуют две альтернативы:

  1. Конкатенация с использованием . :

     $query='insert Into tr_view(name,age,month,year) values (' . toDB($name) . ',' . toDB($age) . ',' . toDB($month) . ',' . toDB($year) . ')') 
  2. Вы можете интерполировать вызываемую переменную в строку с двойными кавычками:

     $fn = 'toDB'; $query="Insert Into tr_view(name,age,month,year) values ({$fn($name)},{$fn($age)},{$fn($month)},{$fn($year)})"; 

Первое ясное и здравомыслящее, второе – неопределенное для незнакомого и совершенно безумного .

Тем не менее, вы все равно не должны собирать входные данные таким образом. Вы все еще можете быть уязвимы для SQL-инъекций . Вы должны использовать подготовленные заявления с параметризованными заполнителями .

Для этого расширения Postgres использует pg_prepare . У них есть явное преимущество, скажем, в том, что вы разрешаете PHP null вместо того, чтобы беспокоиться обо всем этом обнаружении и цитировании нулей.

Если вы настаиваете на том, чтобы сохранить toDB как есть, подумайте о добавлении одной из функций pg_escape_ , таких как pg_escape_string , к тому, что создает строковые строки.

Существует функция NULLIF() :

 SELECT NULLIF(var, ''); 

Если var хранит значение в $ 2, вместо него вы получаете NULL .
В примере я заменяю пустую строку: '' NULL .

Для целочисленного типа нет пустой строки . Просто невозможно. «Пустой» является исключительным для типов строк, таких как text или varchar . Поскольку NULLIF() не может переключать тип данных, вы должны дезинформировать свой ввод в PHP.

Если вы не определили столбец по умолчанию, вы также можете просто опустить столбец в команде INSERT и он будет заполнен NULL (который является значением по умолчанию DEFAULT ).

Проверьте, что параметр пуст в PHP и не содержит столбца в команде INSERT если он есть.

Или используйте литературный NULL PHP, как показано на рисунке @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 AS $BODY$ BEGIN IF NEW.age = '' THEN NEW.age := NULL; END IF; IF NEW.month = '' THEN NEW.month := NULL; END IF; RETURN NEW; END $BODY$ LANGUAGE plpgsql CREATE TRIGGER log_up BEFORE INSERT OR UPDATE ON tr_view FOR EACH ROW WHEN (NEW.age = '' OR NEW.month = '') EXECUTE PROCEDURE trg_tr_view_avoid_empty();