PHP is_int 未按预期执行
Posted
技术标签:
【中文标题】PHP is_int 未按预期执行【英文标题】:PHP is_int is not performing as expected 【发布时间】:2012-01-22 19:25:28 【问题描述】:我有一个页面 (index.php),它从 URL 中获取 GET
变量并出于安全目的对其进行检查。这个GET
变量只能是一个整数。我正在使用以下代码来检查这一点,但在所有情况下,无论是否为整数,我都会得到 index.php 页面。标题永远不会出现。在此代码之后,页面的其余部分以 html
标记开头。
PHP:
<?php ob_start(); session_start();
$q=trim($_GET['q']);
if (!is_numeric($q))
header("HTTP/1.0 404 Not Found");
?>
【问题讨论】:
我不知道你是否已经知道,但你应该在header(..)
之后添加一个exit();
。否则脚本会继续打印页面内容。
阅读the documentation 会告诉你,is_int()
检查变量的类型,所以带有“123
”的字符串到is_int()
不会返回true
,因为这是字符串.还有你为什么用http-status-code-404
标记你的帖子?
@Tadeck 标记已删除。谢谢你的文件。我现在正在使用 is_numeric,但它仍然无法正常工作
@amir75 你是对的。有效!如果我改用die();
可以吗?
【参考方案1】:
如果在查询字符串中传递,它将不是整数。
试试is_numeric()
【讨论】:
还有ctype_digit()
表示只包含数字的字符串。
@alien 我已经更新了我当前的代码,我得到了和以前一样的行为:[
尝试将ob_start;
更改为ob_start();
@AlienWebguy 当我用die("test")
代替标题时,它工作得很好。我的标题一定有问题。我必须在我的服务器上设置 404 页面吗?
您可以在您的 .htaccess 中轻松做到这一点:ErrorDocument 404 /notfound.html
【参考方案2】:
有一个更好的方法可以做到这一点,即强制转换为 int:
$q = (int) $_GET['q'];
is_int is 行为符合预期。因为 GET 参数始终是字符串。尝试 var_dumping 它们。
【讨论】:
想一想,AlienWebguy 的答案可能会更好,因为您将能够过滤掉任何“奇怪”的值......【参考方案3】:有时您想验证应该是数字的输入,但在$_GET
或$_POST
中,您将得到它作为字符串。 is_numeric()
可能有问题,因为它允许十六进制、二进制和八进制格式(来自手册):
Thus +0123.45e6 is a valid numeric value. Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but only without sign, decimal and exponential part.
您不能使用is_int()
,因为它仅用于整数值(不是字符串!)所以...您可以通过这种方式验证字符串和整数的数字:
/**
* Validate integer.
*/
class IntegerValidator
/**
* Run validation.
* @param string $value
* @return bool
*/
public static function isIntVal(string $value): bool
if (!self::hasValidIntegerFormat($value))
return false;
return !self::hasLeadingZero($value);
/**
* Check if given string looks like valid integer. Negative numbers allowed.
* @param string $value
* @return bool
*/
private static function hasValidIntegerFormat(string $value): bool
return (bool) preg_match('/^-?[0-9]+$/', $value);
/**
* Check if given number has leading 0. Thus it's invalid integer.
* @param string $number
* @return bool
*/
private static function hasLeadingZero(string $number): bool
return self::extractFirstDigit($number) === 0;
/**
* Extract first digit from given number.
* @param string $number
* @return int
*/
private static function extractFirstDigit(string $number): int
return self::isNegativeInteger($number)
? (int) $number[1]
: (int) $number[0];
/**
* Check if number is negative integer. ie. starts with minus sign on the beginning.
* @param string $number
* @return bool
*/
private static function isNegativeInteger(string $number): bool
return $number[0] === '-';
var_dump(IntegerValidator::isIntVal('123')); // true
var_dump(IntegerValidator::isIntVal('0123')); // false
var_dump(IntegerValidator::isIntVal('-0123')); // false
var_dump(IntegerValidator::isIntVal('-123')); // true
也可以使用 override_function() 覆盖 is_int() 函数,但它在原始版本中仍然可能有用。
【讨论】:
以上是关于PHP is_int 未按预期执行的主要内容,如果未能解决你的问题,请参考以下文章