2010-08-17 16 views
10

क्यों is_int हमेशा निम्न स्थिति में झूठी वापसी करता है?is_int और GET या POST

echo $_GET['id']; //3 
if(is_int($_GET['id'])) 
    echo 'int'; //not executed 
+2

is_int() चर के प्रकार, सामग्री नहीं –

उत्तर

36

is_int हमेशा झूठी क्यों लौटता है?

क्योंकि $_GET["id"] एक स्ट्रिंग है, भले ही इसमें कोई संख्या हो।

आपके विकल्प:

  • filter एक्सटेंशन का उपयोग करें। filter_input(INPUT_GET, "id", FILTER_VALIDATE_INT) एक पूर्णांक टाइप किए गए चर को वापस कर देगा यदि चर मौजूद है, एक सरणी नहीं है, एक पूर्णांक का प्रतिनिधित्व करता है और वह पूर्णांक मान्य सीमाओं के भीतर होता है। अन्यथा यह false लौटाएगा।

  • फोर्स (int)$_GET["id"] पूर्णांक यह डाली - आप शायद क्या नहीं चाहते हैं, क्योंकि आप ठीक ढंग से त्रुटियों को संभाल नहीं सकता (यानी "आईडी" एक नंबर नहीं किया जा रहा)

  • उपयोग ctype_digit() यकीन है कि स्ट्रिंग केवल के होते हैं बनाने के लिए संख्याएं, और इसलिए एक पूर्णांक है - तकनीकी रूप से, यह true पर भी बहुत बड़ी संख्या के साथ int के दायरे से अधिक है, लेकिन मुझे संदेह है कि यह एक समस्या होगी। हालांकि, ध्यान दें कि यह विधि नकारात्मक संख्याओं को पहचान नहीं पाएगी।

उपयोग न करें:

  • is_numeric() क्योंकि यह भी, नाव मूल्यों (1,23132)
+1

ध्यान रखें कि उदा। 'is_numeric ('47 .11e5 ')' सत्य लौटाता है। अर्थात। is_numeric() न केवल दशमलव प्रतिनिधित्व में पूर्णांक के लिए परीक्षण करता है। – VolkerK

+0

@ वोल्कर यूप, मुझे बस यही विचार था। अपडेट किया गया। –

+0

@Atetefacto अच्छी नौकरी, उस फ़िल्टर से अवगत नहीं था! धन्यवाद। –

0

क्योंकि $_GET['id'] एक स्ट्रिंग क्वेरी स्ट्रिंग के अन्य भागों की तरह है। आप इसे कहीं भी पूर्णांक में परिवर्तित नहीं कर रहे हैं इसलिए is_int झूठी वापसी।

+0

'inval()' हमेशा एक पूर्णांक वापस नहीं करता है की जाँच, इसलिए 'is_int()' अनावश्यक जांच नहीं है? –

+0

@ टॉम हाई: यह सिर्फ एक उदाहरण है, बस कोड डालें ताकि स्थिति सच हो जाए, ओपी द्वारा उत्पन्न एक समस्या। और हाँ यह अनावश्यक है; या तो इस्तेमाल किया जाना चाहिए, लेकिन मुझे आश्चर्य है कि ओपी क्या कर रहा है। – Sarfraz

+0

ओमग, वह समाधान कितना बेवकूफ है? क्षमा करें, लेकिन इसका कोई मतलब नहीं है। 'Is_int()' फ़ंक्शन के भीतर 'int' पर कास्टिंग करना शायद सबसे खराब उदाहरण है जो आपको यहां मिलेगा। –

0

यह शायद $ _GET में एक स्ट्रिंग के रूप में जमा है पहचान लेंगे किसी पूर्णांक पर यह डाली ।

2

क्योंकि HTTP चर हमेशा स्ट्रिंग या सरणी होते हैं। और सरणी के तत्व हमेशा तार या सरणी होते हैं।

आप is_numeric फ़ंक्शन चाहते हैं, जो "4" के लिए सत्य वापस आ जाएगा। या तो, या चर को एक int $foo = (int) $_GET['id'] पर डालें ...

0

क्योंकि $ _GET तारों की एक सरणी है।

यह जांचने के लिए प्राप्त पैरामीटर एक पूर्णांक होता है आप is_numeric()

0

का उपयोग करना चाहिए गंदा समाधान मैं उपयोग कर रहा हूँ यह है:

$val = trim($_GET['id']); 
$cnd = ($val == (int)$val); 
echo $cnd ? "It's an int" : "Not an int"; 
अलावा स्पष्ट (बदसूरत कोड है कि अपने कामकाज के पीछे छुपाता से

PHP इंजन के विनिर्देश), क्या कोई ऐसे मामलों को जानता है जहां यह गलत हो जाता है?

0

is_int($value) का उपयोग कर पूर्णांक के लिए जांच स्ट्रिंग के लिए झूठी वापसी होगी।

मूल्य कास्टिंग - is_int((int) $value) - इससे मदद नहीं मिलेगी क्योंकि स्ट्रिंग्स और फ्लोट्स के परिणामस्वरूप झूठी सकारात्मक होगी।

is_numeric($value) गैर संख्यात्मक तारों को अस्वीकार कर देगा, लेकिन अभी भी तैरता है।

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

$isInt = (is_numeric($value) && (int) $value == $value); 

यह पूर्णांकों और तार ... और कुछ चल संख्या के लिए ठीक काम करता है: तो मैं कुछ इस तरह के साथ आया था।

लेकिन दुर्भाग्यवश, यह कुछ फ्लोट पूर्णांक के लिए काम नहीं करेगा।

$number = pow(125, 1/3); // float(5) -- cube root of 125 
var_dump((int) $number == $number); // bool(false) 

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

0

Prabably सबसे अच्छा तरीका है preg_match

if(preg_match('/^[0-9]+$/', $_GET['id']){ 
    echo "is int"; 
} 
+0

ऐसा मत सोचो। – dachi

0

द्वारा जाँच आप संभवतः intval() जो अपने वर का मूल्य परीक्षण करने के लिए इस्तेमाल किया जा सकता की कोशिश कर सकते हैं। जैसे

If(intval($_GET['ID']==0) 

यदि वर पूर्णांक है समारोह की जाँच करें और वापस आ जाएगी TRUE नहीं करता है, तो FALSE

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