2012-01-22 5 views
6

मेरे पास एक पृष्ठ (index.php) है जो URL से GET वैरिएबल लेता है और इसे सुरक्षा उद्देश्यों के लिए जांचता है। यह GET चर केवल एक पूर्णांक होना चाहिए। मैं इसे जांचने के लिए निम्न कोड का उपयोग कर रहा हूं, लेकिन सभी मामलों में, पूर्णांक या नहीं, मुझे index.php पृष्ठ मिलता है। हेडर कभी प्रकट नहीं होता है। इस कोड के बाद, शेष पृष्ठ html टैग से शुरू होता है।PHP is_int अपेक्षित के रूप में प्रदर्शन नहीं कर रहा है

पीएचपी:

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

मुझे नहीं पता कि आप पहले से ही जानते हैं, लेकिन आपको 'हेडर (..)' के बाद 'निकास();' जोड़ना चाहिए। अन्यथा स्क्रिप्ट पेज सामग्री को मुद्रित करना जारी रखेगी। – laher

+0

पढ़ना [प्रलेखन] (http://php.net/manual/en/function.is-int.php) आपको दिखाएगा कि 'is_int() 'चर के प्रकार की जांच करता है, इसलिए" 123 " '' is_int() 'में' सत्य 'वापस नहीं आएगा, क्योंकि यह स्ट्रिंग है। आपने अपनी पोस्ट को 'http-status-code-404' के साथ क्यों टैग किया? – Tadeck

+0

@Tadeck टैग हटा दिया गया। उस दस्तावेज़ीकरण के लिए धन्यवाद। अब मैं is_numeric का उपयोग कर रहा हूं और यह अभी भी – kirby

उत्तर

19

यह एक पूर्णांक अगर यह एक क्वेरी स्ट्रिंग में पारित कर दिया है नहीं होगा।

is_numeric()

+1

एक स्ट्रिंग के लिए 'ctype_digit()' भी है जिसमें केवल संख्याएं होती हैं। – mrlee

+0

@alien मैंने अपना वर्तमान कोड अपडेट किया है और मुझे पहले जैसा ही व्यवहार मिलता है: [ – kirby

+0

'ob_start;' से 'ob_start();' – AlienWebguy

5

ऐसा करने के लिए, एक बेहतर तरीका है जो int करने के लिए कास्टिंग जाती है का प्रयास करें:

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

is_int व्यवहार कर है अपेक्षा के अनुरूप। क्योंकि तर्क प्राप्त करते हैं हमेशा तार होते हैं। Var_dumping उन्हें आज़माएं।

+1

इसके बारे में सोचने के लिए आओ, एलियनवेब्यू का जवाब शायद बेहतर है क्योंकि आप किसी भी' अजीब 'मान को फ़िल्टर करने में सक्षम होंगे ... – 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() का उपयोग कर लेकिन यह अभी भी मूल संस्करण में उपयोगी हो सकता है।

संबंधित मुद्दे