如何使用php检查$_GET['id']是否已设置且不为空

11

这是一段 PHP 代码

if(isset($_GET['id'])) {
    //do something
} else {
    redirect('index.php'); //redirect is a function
}

如果id被设置了(例如:index.php?id=12),那么操作就会执行,但是如果id没有被设置(例如:index.php?id=),就会显示错误。如何解决这个问题...?

如何确定id是一个整数且不为空,然后执行特定的操作....

编辑过的内容

感谢大家的回答,但我仍然遇到了那个错误...

if(isset($_GET['id'])) { // I implemented all these codes but still....
    $user= User::find_by_id($_GET['id']);
   // Database Classes Fetches user info from database
}
else {
    redirect('index.php'); //redirect function
}
如果id等于1或大于1,则脚本执行完美。 ( index.php?id=1 )
但如果将id设置为空,即index.php?id=,则会出现错误。
代码应该自动将用户重定向到index.php页面,而不是显示错误...
错误:数据库查询失败:您的SQL语法有误;请参阅与您的MySQL服务器版本相对应的手册,了解使用正确语法的方法 'LIMIT 1' 的位置在第1行。

当查询字符串中未设置ID变量时会发生什么? - kevtrout
你所说的整数是指PHP的数据类型还是任何数字序列? - Gordon
如果您查看代码,它并不是数据类型的问题,因为@_GET始终返回一个字符串。 - ThoKra
8个回答

31

你应该检查设置状态和内容:

if ( isset( $_GET['id'] ) && !empty( $_GET['id'] ) )
    // ....

请注意,您不应仅使用该值并处理它。您应确保它仅包含您期望的值。要检查整数,甚至更好地从中使用整数,请执行以下操作:

$id = ( isset( $_GET['id'] ) && is_numeric( $_GET['id'] ) ) ? intval( $_GET['id'] ) : 0;

if ( $id != 0 )
    // id is an int != 0
else
    redirect('index.php');

1
is_int永远不会为真,来自php.net:注意:要测试变量是否为数字或数字字符串(例如表单输入,它始终是一个字符串),必须使用is_numeric()。 - ThoKra
但如果我保持URL为(index.php?id=),它会显示错误.....,应该重定向到index.php。 - Dhruv Kumar Jha
@Terw:哎呀,这就是我尝试记住一些不常用的函数时会发生的事情...谢谢! - poke

2

这个错误告诉你什么?

但是这会检查它是否被设置,并且是否为整数。

if(isset($_GET['id']) && ctype_digit($_GET['id']) && intval($_GET['id']) > 0)

is_numeric @ php.net

或者查看ctype_digit


1
“is_numeric” 确实不够用。 - delete me
链接到 ctype_digit 函数,该函数仅检查是否存在整数,已更新示例以使用此函数。 - ThoKra
但是如果我将URL保留为(index.php?id=),它会显示错误.....,应该重定向到index.php。 - Dhruv Kumar Jha
尝试这个:if(isset($_GET['id']) && ctype_digit($_GET['id']) && intval(@_GET['id']) > 0)。我不确定是否需要使用intval,因为我已经很久没有使用PHP了。 - ThoKra
解析错误:语法错误,在H:\Dev\Websites\www.demo.com\user-info.php的第4行意外出现'['。 - Dhruv Kumar Jha
只是复制并粘贴我的代码?出现错误了,在上面的代码中使用$而不是@ :P - ThoKra

0
if (!empty($_GET['id']) && filter_var($_GET['id'], FILTER_VALIDATE_INT))

或者

if (!empty($_GET['id']) && ctype_digit($_GET['id']))

2
请注意,在PHP中,整数0和字符串"0"被视为“空”。 - Daniel Vandersluis
@Daniel:是的,我在写答案时记得这一点,但我敢打赌他指的是某个肯定是正整数的主键。 - zerkms
主键可能为零或负数是完全有可能的。 - timdev
@timdev 我怀疑用户的主键是负数或零。虽然这是可能的,但这是一个不好的设计。 - Chad Cache
@Chad Scira 是的,可能是糟糕的设计(基本上,它表明负主键值在某种程度上是特殊的,这有点像魔法数字反模式)。 - timdev

0
如何判断id是整数并且不为空,然后执行特定的操作...
if (!empty($_GET['id']) && (intval($_GET['id']) == $_GET['id'])) {
    //do something
} else {
    redirect('index.php'); //redirect is a function
}

以上可能不是最好的解决方案,但它应该适合您的需求。它将不允许id为0,并要求其为整数。


在php.net上看到的不同,@_GEt永远不会返回整数(除非您自己指定),它会返回一个字符串。 - ThoKra
谢谢您指出这个问题。我修改了代码,使其能够满足他的需求。 - Joseph
很遗憾它对我所需的功能没有起作用... 如果id=(空格)或id=0,则应简单地自动将用户重定向到index.php页面,而不需要进一步操作... 但它不起作用... :( - Dhruv Kumar Jha
在 if 语句之前,你是否对 $_GET['id'] 进行了任何操作? - Joseph

0

嗯...如果您将其设置为整数类型变量,则也可以这样做:

if($_GET['id'] && gettype($_GET['id']) == 'integer'){
    #do something
}else{
    #do something else
}

这样做行不通,因为gettype总是报告字符串类型,因为GET参数通常没有类型。而且当未设置时,调用$_GET['id']会引发索引警告。 - poke

0
 if(isset($_GET['id']) && ctype_digit($_GET['id']) && is_numeric($_GET['id']) && $_GET['id']>0) {
  $user= User::find_by_id($_GET['id']);
  }
else {
  redirect('index.php'); //redirect function
  }

尝试这个和这个代码,完全满足您的要求。


0

看起来你只是在处理 ?id 时出现了问题,当你想检查它是否设置时,它会返回 true。这是因为它已经被设置,但并没有设置为你想要使用的值。

我假设用户 ID 必须大于 0,所以只需这样做

if (isset($_GET['id']) && $_GET['id'] > 0) {
    $user= User::find_by_id($_GET['id']);
} else {
    redirect('index.php'); 
}

另外,在处理之前最好清理一下ID。

$userID = isset($_GET['id']) && $_GET['id'] > 0 ? (int) $_GET['id'] : 0;

if ($userID) {
    $user= User::find_by_id($userID);
} else {
    redirect('index.php'); 
}

有很多方法可以做到这一点,我个人更喜欢这种方法。这会使您的代码看起来更清晰。


0

你需要多次检查每种情况:如果id未设置或为空怎么办?如果id已设置但不是数字怎么办?如果GET请求中根本不存在“id”键怎么办?

我曾经遇到过类似的情况。我用GET发送了两个变量,一个是数字:“id”,另一个是字符串,即名称:“state”...我通过检查所有可能的条件来解决它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接