Php Numrows问题

时间:2009-10-22 09:36:44

标签: php sql

我使用查询字符串来访问我的页面。我尝试制作,如果有人手动输入未知的查询字符串,然后重定向到某个地方..

例如:

网址:test.php?m = 1(这是一个有效的网址)          test.php?m = 1324234(这不是一个有效的网址)          test.php?m = 1asdaa(这不是一个有效的网址)

include("config/database.inc");
$qm=$_GET['m'];
 $query = "select acc from test where acc=$qm"; 
 $numresults=mysql_query($query);
 $numrows=mysql_num_rows($numresults);
  if ($numrows == 0){
          header("Location: index.php"); 
          exit;
     }

在数据库中我有两行,LINE 1:acc = 1;第2行:acc = 2;

如果我键入url:test.php?m = 12312431,则重定向到index.php'coz $ numrows = 0。没关系。  但如果我键入:test.php?m = 1sdfsfsf,那么我得到了这个错误消息:  警告:mysql_num_rows():提供的参数不是...中的有效MySQL结果资源。

我该怎么做?在从数据库查询之前需要检查$ _GET ['m']吗?

谢谢。

4 个答案:

答案 0 :(得分:2)

如果没有正确地过滤和转义它,就不应该将GET变量的值直接放入SQL查询中。您的问题是您允许将不是数字的内容放入SQL查询中。在这种特殊情况下,您的测试是无害的,只是错误,但恶意用户也可以通过SQL注入做更有害的事情。

相反,你真正想做的是将变量的值转换为知道的类型(在这种情况下,是一个整数),然后使用它来查询数据库。试试这个:

include("config/database.inc");
$qm=intval($_GET['m']);
 $query = "select acc from test where acc=$qm"; 
 $numresults=mysql_query($query);
 $numrows=mysql_num_rows($numresults);
  if ($numrows == 0){
          header("Location: index.php"); 
          exit;
     }

注意对intval()的调用,它强制结果为整数值,而不是可能有害的字符串。

答案 1 :(得分:1)

这样做:

$qm=intval($_GET['m']);

答案 2 :(得分:0)

如果m无效,mysql_query将返回$ query = false。

如果你向mysql_num_rows提供“false”,它不知道你发送了什么查询,并且正确地获得了无效的numrows结果,例如:失败。

检查m是否为intval($ m)的整数;

答案 3 :(得分:0)

除了验证输入或强制类型转换,正如其他人建议确保输入有意义一样,尝试养成用引号括起用户提交的值的习惯,例如

$query = "select acc from test where acc='$qm'"; 

虽然这里你在技术上将一个整数与一个字符串进行比较,MySQL允许这个(并且仍然会使用可用的整数键),如果你忘记过滤输入,它会提供最后一道防线。