PHP只为数字验证$ _GET ['id']

时间:2014-09-19 06:55:27

标签: php

我使用以下代码检查验证数字$_GET['id']

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

if($id){

echo "True";}

else{

echo "false";

}

输出:

  ID           RESULT
  1        =>  TRUE
  "        =>  FALSE
  <SCRIPT> =>  FALSE
  1.5      =>  TRUE

如果id = 1.5,则结果为TRUE !!

如何防止这个和安全ID仅为有效号码?!

2 个答案:

答案 0 :(得分:1)

使用filter_var功能:

var_dump(filter_var(1, FILTER_VALIDATE_INT));      // int(1)
var_dump(filter_var('1', FILTER_VALIDATE_INT));    // int(1)
var_dump(filter_var(1.5, FILTER_VALIDATE_INT));    // bool(false)
var_dump(filter_var('1.5', FILTER_VALIDATE_INT));  // bool(false)
var_dump(filter_var('<script></script>', FILTER_VALIDATE_INT)); // bool(false)

如果您只想要数字gt然后为0,请使用options参数:

$options = array('options' => array('min_range' => 1));
var_dump(filter_var(-100, FILTER_VALIDATE_INT, $options));   // bool(false)
var_dump(filter_var(0, FILTER_VALIDATE_INT, $options));      // bool(false)

答案 1 :(得分:-1)

我更喜欢使用ctype_digit(仅适用于字符串,它可以使用$ _GET)。

<?php
 $id = $_GET['id'];
if (ctype_digit($id)) {
  echo 'ok';
} else {
  echo 'nok';
}
?>

或者你可以试试这个:

$expr = '/^[1-9][0-9]*$/';
if (preg_match($expr, $id) && filter_var($id, FILTER_VALIDATE_INT)) {
 echo 'ok';
} else {
echo 'nok';
}