我有一些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)添加到构建带引号字符串的对象中。

08-27 10:39