我向file.PHP发送一个请求,其中包含这样的URL:file.PHP?number = 2
file.PHP:
$number = 0;
if (isset($_GET['number'])) {
$temp_var = $_GET['number']; // 2
if (ctype_digit($temp_var)) {
$number = (int)$temp_var; // 2
}
}
print $number; // 0
作为回应,我得到0(零).为什么?
解决方法:
问题出在ctype_digit()
看看这个例子
<?PHP
$numeric_string = '42';
$integer = 42;
ctype_digit($numeric_string); // true
ctype_digit($integer); // false (ASCII 42 is the * character)
is_numeric($numeric_string); // true
is_numeric($integer); // true
?>
ctype_digit($整数); // false(ASCII 42是*字符)在您的情况下也会发生这种情况,因为2是不同非数字字符的ASCII值,if()在您的情况下返回false.
如果要检查字符串或数字实际上是否为int,则应使用is_numeric()
并且您的代码将变为:
$number = 0;
if (isset($_GET['number'])) {
$temp_var = $_GET['number']; // 2
if (is_numeric($temp_var)) {
$number = (int)$temp_var; // 2
}
}
print $number; // 2
ctype_digit()手动说明:
此函数需要一个字符串才有用,因此例如传入一个整数可能不会返回预期的结果.但是,请注意HTML表单将导致数字字符串而不是整数.另请参见手册的“类型”部分.
如果提供介于-128和255之间的整数,则将其解释为单个字符的ASCII值(为了允许扩展ASCII范围内的字符,添加了256个负值).任何其他整数都被解释为包含整数的十进制数字的字符串.
加:
如果有人真的绝对必须使用ctype_digit(),出于安全考虑,你可以使用:
ctype_digit((string)$value);
这样,你将始终确保$value是一个字符串,如果它只由数字字符组成,那么ctype_digit将评估为true;)