我有一些列类型为int,但value为空。所以我想在插入数据库时将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...
为什么?
答案 0 :(得分:42)
有NULLIF()
功能:
SELECT NULLIF(var, '');
如果var
保留了$ 2中的值,则会得到NULL
在示例中,我将空字符串''
替换为NULL
。
类型为整数的空字符串。只是不可能。由于NULLIF()
无法切换数据类型,因此您必须使用PHP清理输入。
如果您没有定义列默认值,您也可以忽略INSERT
命令中的列,它将填充NULL
(这是默认值DEFAULT
)。
检查PHP中的参数是否为空,如果是INSERT
命令,则不包括该列。
或者使用 PHP文字NULL ,而不是像Quassnoi演示here。
要绝对确定,没有人可以输入空字符串向表中添加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();
答案 1 :(得分:6)
虽然Erwin关于NULLIF
的答案是 awesome ,但它并没有解决您的语法错误。
让我们来看看查询:
$query="Insert Into tr_view(name,age,month,year) values ({toDB($name)},{toDB($age)},{toDB($month)},{toDB($year)})
之前您定义了一个名为toDB
的函数。不幸的是,你在这里使用的语法是 not 如何从双引号字符串中调用函数,因此curlies和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 injection attacks的攻击。您应该使用prepared statements with parameterized placeholders。
Postgres扩展程序使用pg_prepare
。它们具有明显的优势,例如,允许您传递PHP null
,而不必担心所有的空检测和引用。
如果您坚持保持toDB
原样,请考虑将pg_escape_
函数之一添加到构建引用字符串的内容中,如pg_escape_string
。