猿问

可以使用此代码来验证 $_GET 变量吗?

我正在构建一个使用 GET 参数的页面,我想知道这段代码是否成功评估了下一个条件:$_GET["id"]必须是一个积分器,而$_GET["status"]必须是一个“true”或“假”。


$rawId = $_GET["id"];

$rawStatus = $_GET["status"];


$Id = filter_var($rawId, FILTER_SANITIZE_NUMBER_INT);

$Id = filter_var($Id, FILTER_VALIDATE_INT);


if (!$Id) {

    die();

}


if ($rawStatus != "true" && $rawStatus != "false") {

    die();

}


桃花长相依
浏览 128回答 3
3回答

aluckdog

您可以使用 is_int 和 is_bool 来实现这一点。在执行此操作之前,请确保您还检查是否设置了 $_GET 变量以避免潜在的通知$rawId = (isset($_GET["id"]) ? $_GET["id"] : null);$rawStatus = (isset($_GET["status"]) ? $_GET["status"] : null);if (!is_int($rawId)) {     //handle}if (!is_bool($rawStatus)) {     //handle}

冉冉说

如果您需要检查 $rawId 和 $rawStatus 的类型,您可以这样做is_integer($rawId); // return true if $rawId is integeris_bool($rawStatus); // return true if $rawStatus is boolean要检查 $rawId 是否只有数字,您可以这样做is_numeric($rawId)要检查 $rawStatus 是否为 bool 你可以看到这个答案测试字符串是否可以是布尔值 PHP如果需要解析值,您可以使用intval()和boolval()

湖上湖

FILTER_SANITIZE_NUMBER_INT允许.,+和-,您可能不想包含它们。使用FILTER_VALIDATE_INT将定期检查整数细,不过请记住,这将返回false了0。如果您希望您的 ID 也包含0,那么您需要明确检查这一点:$Id = filter_var($rawId, FILTER_VALIDATE_INT) === 0 || filter_var($rawId, FILTER_VALIDATE_INT));假设您想$rawStatus成为true/的文字字符串false,那么您目前覆盖它的方式可能是最佳方法,尽管听起来您正在尝试在此处进行布尔检查。在这种情况下,你可以简单地检查了存在的$rawStatus,使用缺乏它的存在表示一个falsy值:if ($rawStatus)正如您在评论中提到的,您确实需要检查两者是否都设置为isset()... 但您还需要检查这些值是否为空。这可以通过!empty().我还建议仅在已知有效状态下进行,而不是die()在已知无效状态下进行调用。将所有这些放在一起,您将得到如下所示的内容:$rawId = null;if (isset($_GET["id"]) && !empty($_GET["id"])) {    $rawId = $_GET["id"];}if (isset($_GET["status"]) && !empty($_GET["status"])) {    $rawStatus = $_GET["status"];}$Id = filter_var($rawId, FILTER_VALIDATE_INT) === 0 || filter_var($rawId, FILTER_VALIDATE_INT);if ($Id && $rawStatus) {    // Logic}
随时随地看视频慕课网APP
我要回答