0

我有以下 PHP 源代码:

$type_ID =$_GET["typeID"];
try{                               
$article_ID =$_GET["articleID"];
$select_query = mysql_query("SELECT articleContent, articleTitle From articles WHERE articleID=$article_ID && typeID=$type_ID");
}
catch(Exception $e)
{ $select_query = mysql_query("SELECT articleContent, articleTitle From articles WHERE typeID=$type_ID");
                                   }
$row = mysql_fetch_assoc($select_query); 
echo '<h1>'.$row['articleTitle'].'</h1>';
echo  $row['articleContent'];

我知道这段代码不安全,你可以轻松地进行 sql 注入。

这里的问题是它没有进入catch部分(在 之后try)即使它应该。解决方案可能很简单,但我无法解决。

为什么没有进入该catch部分?

4

2 回答 2

1

在这种情况下,您必须更改查询以使用或捕获失败,尽管我不是 100%,但这样的事情可能会起作用(有人可以纠正我吗?)您最好远离 mysql_ 功能虽然并以 OO 风格迁移到 mysqli 或 pdo,那么您可以更好地捕获和处理错误。

$type_ID =$_GET["typeID"];
try{                               
$article_ID =$_GET["articleID"];
$select_query = mysql_query("SELECT articleContent, articleTitle From articles WHERE articleID=$article_ID && typeID=$type_ID") or throw new Exception("ERROR HERE");
}
catch(Exception $e)
{ 
 $select_query = mysql_query("SELECT articleContent, articleTitle From articles WHERE typeID=$type_ID"); // note we can't throw exception here because its already in the try catch. perhaps we should look at something like the finally statement.
//echo $e->getMessage(); //uncomment this line if you want to output the exception error text set above
}
$row = mysql_fetch_assoc($select_query); 
echo '<h1>'.$row['articleTitle'].'</h1>';
echo  $row['articleContent'];

实际上只是想你会更好地做这样的事情并事先验证你的输入。(注意我在这里没有进行字符串转义,不要忘记这样做)

$type_ID =$_GET["typeID"];
$article_ID =$_GET["articleID"];

if (strlen($type_ID)>0 && strlen($article_ID)>0 && is_numeric($type_ID) && is_numeric($article_ID)) { 
$sqlquery = "SELECT articleContent, articleTitle From articles WHERE articleID=$article_ID && typeID=$type_ID";
} else {
$sqlquery = "SELECT articleContent, articleTitle From articles WHERE typeID=$type_ID";
}

try {
    $queryresult = mysql_query($sqlquery) or throw new Exception("Query Failed");
} catch(Exception $e) { 
    echo $e->getMessage(); 
}

所以基本上你在验证和检查你的输入并切换你的 sql 语句,然后你的 try catch 逻辑纯粹是为了查询是成功还是失败,这比你尝试的要明智得多。

于 2013-07-03T12:53:46.670 回答
1

Mysql 查询将在错误时返回 FALSE
所以你可以为此抛出异常
$result = mysql_query("SELECT articleContent, articleTitle From articles WHERE articleID=$article_ID && typeID=$type_ID");

if(!$result) throw new Exception("Invalid query: ". mysql_error());

并在你的 catch 块中捕捉它们
catch(Exception $e) { echo $e->getMessage()}

由您决定如何使用它来回显或记录。

于 2013-07-03T13:06:33.643 回答