2012-01-22 29 views
6

Tôi có một trang (index.php) có biến số GET từ URL và kiểm tra nó vì mục đích bảo mật. Biến số GET này chỉ nên là số nguyên. Tôi đang sử dụng mã sau đây để kiểm tra điều này, nhưng trong mọi trường hợp, số nguyên hay không, tôi nhận được trang index.php. Tiêu đề không bao giờ xuất hiện. Sau mã này, phần còn lại của trang xuất hiện bắt đầu bằng thẻ html.PHP is_int không hoạt động như mong đợi

PHP:

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

Tôi không biết bạn đã biết chưa, nhưng bạn nên thêm 'exit();' sau tiêu đề '(..)'. Nếu không, tập lệnh sẽ tiếp tục in nội dung trang. – laher

+0

Đọc [tài liệu] (http://php.net/manual/en/function.is-int.php) sẽ cho bạn thấy rằng 'is_int()' kiểm tra kiểu biến, vì vậy chuỗi với "' 123 '" vào 'is_int()' sẽ không trả về 'true', vì đây là chuỗi. Ngoài ra, tại sao bạn gắn thẻ bài đăng của mình bằng 'http-status-code-404'? Đã xóa thẻ – Tadeck

+0

@Tadeck. cảm ơn vì tài liệu đó. im bây giờ sử dụng is_numeric và nó vẫn không hoạt động – kirby

Trả lời

19

Nó sẽ không phải là một số nguyên nếu nó được thông qua trong một chuỗi truy vấn.

Hãy thử is_numeric()

+1

Cũng 'ctype_digit()' cho một chuỗi chỉ bao gồm các số. – mrlee

+0

@alien Tôi đã cập nhật mã hiện tại của mình và tôi nhận được cùng một hành vi như trước: [ – kirby

+0

Hãy thử thay đổi 'ob_start;' thành 'ob_start(); ' – AlienWebguy

5

Có một cách tốt hơn để làm điều này, được đúc để int:

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

Các is_int hành xử như mong đợi. Bởi vì các đối số GET luôn là chuỗi. Hãy thử var_dumping chúng.

+1

Nghĩ lại thì câu trả lời của AlienWebguy có lẽ tốt hơn khi bạn có thể lọc ra bất kỳ giá trị 'lạ' nào ... – Joep

0

Đôi khi bạn muốn xác thực thông tin nhập phải là số nhưng trong $_GET hoặc $_POST bạn sẽ nhận được nó dưới dạng chuỗi. is_numeric() có thể có vấn đề, vì nó cho phép hex, nhị phân và định dạng bát phân (từ thủ công):

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.

Bạn không thể sử dụng is_int() như nó chỉ cho các giá trị số nguyên như vậy ... Bạn (không dây) có thể xác nhận con số đó là chuỗi và số nguyên như vậy:

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 

nó cũng có thể ghi đè lên is_int (chức năng), sử dụng override_function() nhưng nó vẫn có thể hữu ích trong phiên bản gốc.

Các vấn đề liên quan