我拥有以下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
部分?
答案 0 :(得分: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逻辑纯粹是为了查询成功或失败,这比你正在尝试的更加明智。
答案 1 :(得分: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(Exception $e)
{ echo $e->getMessage()}
由你来决定你将用它做回声或记录。