我有一个在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,输出必须为“成功”,但我收到“无效”消息。如果我交换'无效'和'成功'条件语句,一切运作良好,但我想知道这是什么问题?
答案 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注入。