2012-01-22 5 views
6

У меня есть страница (index.php), которая принимает переменную GET URL-адрес и проверяет ее в целях безопасности. Эта переменная GET должна быть только целым числом. Я использую следующий код, чтобы проверить это, но во всех экземплярах целое или нет, я получаю страницу index.php. Заголовок никогда не появляется. После этого кода остальная страница появляется, начиная с тега html.PHP is_int не работает должным образом

PHP:

<?php ob_start(); session_start(); 
$q=trim($_GET['q']); 
if (!is_numeric($q)){ 
header("HTTP/1.0 404 Not Found"); 
} 
?> 
+1

Я не знаю, знаете ли вы уже, но вы должны добавить 'exit();' после 'header (..)'. В противном случае скрипт будет продолжать печатать содержимое страницы. – laher

+0

Чтение [документация] (http://php.net/manual/en/function.is-int.php) покажет вам, что 'is_int()' проверяет тип переменной, поэтому строка с символом '' 123 '' в 'is_int()' не вернет 'true', так как это строка. Кроме того, почему вы пометили свое сообщение «http-status-code-404»? – Tadeck

+0

@Tadeck tag удален. благодарю вас за эту документацию. im теперь использует is_numeric и он все еще не работает – kirby

ответ

19

Это не будет целым, если он передается в строке запроса.

Попробуйте is_numeric()

+1

Также 'ctype_digit()' для строки, состоящей только из чисел. – mrlee

+0

@alien Я обновил свой текущий код, и я получил то же поведение, что и раньше: [ – kirby

+0

Попробуйте изменить 'ob_start;' на 'ob_start();' – AlienWebguy

5

Существует лучший способ сделать это, который бросает в целое:

$q = (int) $_GET['q']; 

is_int является себя, как ожидалось. Поскольку аргументы GET всегда являются строками. Попробуйте var_dumping их.

+1

Подумайте об этом, ответ AlienWebguy, вероятно, лучше, поскольку вы сможете отфильтровать любые« странные »значения ... – Joep

0

Иногда вы хотите проверить ввод, который должен быть номером, но в $_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(), как это только для целочисленных значений, так ... Вы (не строка!) может проверить номера, которые являются строку и целое таким образом:

function is_int_val($value){ 
    return (string) $value === (string) ((integer) $value); 
} 

is_int_val('33'); // true 
is_int_val('33a'); // false 
is_int_val('033'); // false 

Кроме того, можно переопределить функцию is_int(), с помощью override_function() но он все еще может быть полезным в оригинальной версии.