我有一些类型为int的列,但值是空的。因此,当我插入数据库时,我想将empty转换为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()功能:
SELECT NULLIF(var, '');
如果var保持$ 2中的值,则NULL取而代之。 在这个例子中我替换空字符串:’‘有NULL。
有该类型的整数无空字符串。只是不可能。由于NULLIF()无法切换数据类型,因此必须清理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 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$ LANGUAGE plpgsql 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();