我有一些int类型的列,但是value是空的。所以我想在插入数据库时将空值转换为空值。
我使用代码:
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...
为什么?
最佳答案
虽然erwin关于NULLIF
的回答很棒,但它并没有解决您的语法错误。
让我们看看查询:
$query="Insert Into tr_view(name,age,month,year) values ({toDB($name)},{toDB($age)},{toDB($month)},{toDB($year)})
早些时候,您定义了一个名为
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 injection attacks的攻击。您应该使用prepared statements with parameterized placeholders。
Postgres扩展为此使用
pg_prepare
。它们有一个明显的优势,比如,允许传递phpnull
,而不必担心所有的空检测和引用。如果坚持保持
toDB
不变,可以考虑将pg_escape_
函数之一(如pg_escape_string
)添加到构建带引号字符串的对象中。