У меня есть несколько столбцов типа 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(
бит все еще проходят. Существуют две альтернативы:
Конкатенация с использованием .
:
$query='insert Into tr_view(name,age,month,year) values (' . toDB($name) . ',' . toDB($age) . ',' . toDB($month) . ',' . toDB($year) . ')')
Вы можете интерполировать вызываемую переменную в строку с двойными кавычками:
$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();