0

这是代码:

  //check if the starting row variable was passed in the URL or not
  if (!isset($_GET['pg']) or !is_numeric($_GET['pg'])) {
 //we give the value of the starting row to 0 because nothing was found in URL
  $startrow = 0;
//otherwise we take the value from the URL
} else {
$startrow = (int)mysql_real_escape_string($_GET['pg']);
}

每当我尝试添加 mysql_real_escape_string(); 到!isset 中的 $_GET['pg'),代码不执行,我没有收到错误消息。

4

3 回答 3

2

不要将 pg 值转换为 int。相反,验证它是否包含整数值,或者不执行查询。如果您不打算执行查询(我们看不到),那么mysql_real_escape_string()完全是错误的工具,因为它需要连接。

适当的做法是验证 的内容$_GET['pg']是一个整数,而不是转义它。

由于is_numeric()将对非整数实数返回 TRUE,因此我倾向于使用它ctype_digit()来验证正整数。如果您还需要负整数的可能性,您可以使用ctype_digit(abs($_GET['pg']))

if (!isset($_GET['pg']) or !ctype_digit($_GET['pg'])) {
   // it wasn't an integer
   // initialize to your default value
}
else {
  // $_GET['pg'] *has to be a valid int* or we wouldn't have entered the else block
  // no need to escape or further process it - it's safe to use
}
于 2012-04-07T19:55:53.260 回答
1

您希望有一个 0 或更大的整数值;如果输入无效,则为 0:

$startrow = max(0, isset($_GET['pg']) ? $_GET['pg'] : 0);

mysql_real_escape_string()数值不需要 。根据您的编码风格,这在 PHP 中也是可能的:

$startrow = max(0, @$_GET['pg']);

如果您使用的是 PHP 5.4,它的性能甚至非常好。

于 2012-04-07T20:27:59.920 回答
0

mysql_real_escape_string 需要与数据库的连接(第二个参数),如果未提供,将使用最后打开的连接 - 请参阅:

http://php.net/manual/en/function.mysql-real-escape-string.php

可能是在您的代码的这一点上没有创建与数据库的连接?在这种情况下,您应该看到一个警告(检查您的 php 配置是否允许显示警告)

于 2012-04-07T20:00:29.303 回答