返回的函数结果在条件语句中混淆

时间:2011-08-14 18:02:06

标签: php

我有一个在PHP中使用数据库的类。此类中的Add函数是:

    function Add($post_id)
    {
        if(!is_numeric($post_id))
        {
            return 1181;
        }

        $query  = "...";
        $result = mysql_query($query, $this->link);
        return $result;
    }

我还有一个页面可以获取表单数据并将它们传递给此类。页面代码是:

$result = $obj->Add($post_id);

if($result == 1181)
{
    echo 'invalid';
}
else if($result)
{
    echo 'success';
}
else
{
    echo 'error';
}

返回值为1,输出必须为“成功”,但我收到“无效”消息。如果我交换'无效'和'成功'条件语句,一切运作良好,但我想知道这是什么问题?

2 个答案:

答案 0 :(得分:5)

var_dump($result);是一个很好的起点。在布尔上下文中,1181将转换为true,因为它打印success时不要指望它成功。

您可能传递了错误的post_id。启用显示警告和通知。不要使用疯狂的魔术常量,使用false或抛出异常。请务必检查mysql_query的返回值。

如果你这样做,我不必猜测,你可以取得进步并提出有意义的问题。

答案 1 :(得分:2)

正如其他人在评论中指出的那样,您应该在这些类型的案例中使用Exceptions。这是一个例子。

function Add($post_id)
{
    if(!is_numeric($post_id))
    {
        throw new InvalidArgumentException( 'Argument should be numeric' );
    }

    $query  = "...";
    $result = mysql_query($query, $this->link); 
    return $result;
}

try
{
    $result = $obj->Add($post_id);
}
catch( InvalidArgumentException $e )
{
    /* handle the invalid argument exception */
}

if($result)
{
    echo 'success';
}
else
{
    echo 'error';
}

此外,如果您坚持使用代码来解决错误,可以使用:

function Add($post_id)
{
    if(!is_numeric($post_id))
    {
        throw new InvalidArgumentException( 'Argument should be numeric', 1181 );
    }

    if($post_id <= 0)
    {
        throw new InvalidArgumentException( 'Argument should be larger than 0', 1182 );
    }

    $query  = "...";
    $result = mysql_query($query, $this->link); 
    return $result;
}

try
{
    $result = $obj->Add($post_id);
}
catch( InvalidArgumentException $e )
{
    switch( $e->getCode() )
    {
        case 1181:
            /* handle the invalid argument exception with code 1181 */
            break;
        case 1182:
            /* handle the invalid argument exception with code 1182 */
            break;
        default:
            /* handle other invalid argument exceptions */
            break;
    }
}

最后,像其他人一样评论说,异常处理与之无关,也不会干扰防止SQL注入。