2012-05-30 15 views
31

के साथ अपरिभाषित सूचकांक मैं एक साधारण लॉगिन स्क्रिप्ट बनाने के लिए कुछ PHP मूलभूत बातें जारी करने की कोशिश कर रहा हूं, हालांकि मुझे एक त्रुटि मिली है जो मुझे पहले प्राप्त नहीं हुई है (मैंने एक साल पहले एक ही स्क्रिप्ट बनाई थी और कभी भी यह त्रुटि नहीं थी । मैं कोड को सरल बनाया के रूप में ज्यादा मैं देखना चाहता है जो क्षेत्र समस्याग्रस्त था परीक्षण करने और यहां के लिए कर सकता मुद्दा है:

<?php 
$user = $_POST["username"]; 
if($user != null) 
{ 
    echo $user; 
    echo " is your username"; 
} 
else 
{ 
    echo "no username supplied"; 
} 
?> 

अब इस कोड ठीक काम करता है जब मैं स्क्रिप्ट के एक चर भेजने के लिए, लेकिन जब कोई चर रहा है आपूर्ति की गई यह एक त्रुटि को थूकती है। सिद्धांत में यह ठीक रहेगा क्योंकि यदि कोई उपयोगकर्ता नाम/पास प्रदान नहीं किया जाता है तो एक त्रुटि की उम्मीद है। मैं स्क्रिप्ट को कोड भेजने से पहले यह सुनिश्चित करने के लिए जांच करूँगा, हालांकि मुझे डर है कि किसी भी तरह एक खाली स्ट्रिंग कुछ un un के माध्यम से रिसाव और थूक सकता है ज्ञात त्रुटि यहाँ है त्रुटि मैं:

(!) Notice: Undefined index: username in C:\wamp\www\verify_login.php on line 2 

Call Stack 

    Time Memory Function Location 
1 0.0003 668576 {main}() ..\verify_login.php:0 

कोई उपयोगकर्ता नाम

आपूर्ति के रूप में आप कोड पंजीकृत करता है कि कोई भी चर आपूर्ति की गई थी देख सकते हैं, लेकिन यह पता और त्रुटि है कि मुझे लगता है इसका मतलब है कि एक चर नहीं मिला था देता है एक की उम्मीद थी या ऐसा कुछ था। क्या कोई इसे मेरे लिए स्पष्ट कर सकता है?

+0

फॉर्म के लिए अपना कोड पोस्ट करें। ऐसा लगता है कि _POST [उपयोगकर्ता नाम] –

+0

सेट नहीं है क्योंकि यदि आप सभी सही कर रहे हैं तो आपने HTML पृष्ठ विधि में 'get' के रूप में नाम दिया है और आप '$ _POST' के साथ पैरामीटर को पकड़ रहे हैं। आपको इसकी बजाय $ _GET का नाम बदलने की आवश्यकता है। बस इतना ही। – CodeToLife

उत्तर

39

PHP में, एक वेरिएबल या सरणी तत्व जिसे कभी सेट नहीं किया गया है, उस मूल्य से अलग है जिसका मूल्य null है; अनसेट मान को चलाने का प्रयास रनटाइम त्रुटि है।

यही वह है जो आप चल रहे हैं: सरणी $_POST इंडेक्स "username" पर कोई तत्व नहीं है, इसलिए दुभाषिया आपके प्रोग्राम को कभी भी शून्यता परीक्षण में आने से पहले बंद कर देता है।

सौभाग्य से, आप वास्तव में इसे एक्सेस करने की कोशिश किए बिना एक चर या सरणी तत्व के अस्तित्व के लिए परीक्षण कर सकते हैं; कि क्या विशेष ऑपरेटर isset करता है:

if (isset($_POST["username"])) 
{ 
    $user = $_POST["username"]; 
    echo $user; 
    echo " is your username"; 
} 
else 
{ 
    $user = null; 
    echo "no username supplied"; 
} 

यह लगता है कि यह आपके कोड के रूप में बिल्कुल उसी तरह उड़ा देगा, जब पीएचपी समारोह isset() लिए एक तर्क के रूप पारित करने के लिए $_POST["username"] का मूल्य प्राप्त करने के लिए प्रयास करता है।हालांकि, isset() वास्तव में एक समारोह नहीं है, लेकिन मूल्यांकन चरण से पहले विशेष वाक्यविन्यास पहचाना जाता है, इसलिए PHP दुभाषिया वास्तव में इसे पुनर्प्राप्त करने की कोशिश किए बिना मूल्य के अस्तित्व की जांच करता है।

यह भी उल्लेखनीय है कि रनटाइम त्रुटियों के रूप में, एक लापता सरणी सूचकांक को मामूली माना जाता है (E_NOTICE स्तर असाइन किया गया है)। यदि आप error_reporting स्तर को बदलते हैं ताकि नोटिस को अनदेखा किया जा सके, तो आपका मूल कोड वास्तव में लिखित रूप में काम करेगा, प्रयास किए गए सरणी पहुंच null लौटाए गए प्रयासों के साथ। लेकिन इसे विशेष रूप से उत्पादन कोड के लिए बुरी आदत माना जाता है।

साइड नोट: पीएचपी स्ट्रिंग प्रक्षेप करता है, तो if ब्लॉक में echo बयान एक में जोड़ा जा सकता:

echo "$user is your username"; 
+5

धन्यवाद। मुझे यह त्रुटि क्यों मिलती है और इसे हल करने के तरीके के बारे में बहुत ही सरल लेकिन सरल उत्तर। मैं सिर्फ "इस त्रुटि से कैसे ठीक/छुटकारा पा सकता हूं" जवाब नहीं चाहता था, मैं इसे समझना चाहता था और यही वह है जो आपने मेरे लिए किया था, धन्यवाद। –

+0

@ViperCode आपके '$ _POST [" उपयोगकर्ता नाम "]' चर सेट नहीं किया गया था – Bender

6

उपयोग:

if (isset($_POST['user'])) { 
    //do something 
} 

लेकिन आप शायद कुछ और उचित सत्यापन का उपयोग करना चाहिए। ज़ेंड फ्रेमवर्क या सिम्फनी से एक साधारण रेगेक्स या रॉक-ठोस कार्यान्वयन का प्रयास करें।

http://framework.zend.com/manual/en/zend.validate.introduction.html

http://symfony.com/doc/current/book/validation.html

या यहां तक ​​कि निर्मित फ़िल्टर एक्सटेंशन:

http://php.net/manual/en/function.filter-var.php

कभी विश्वास उपयोगकर्ता इनपुट, स्मार्ट हो। कुछ भी भरोसा मत करो। हमेशा सुनिश्चित करें कि आपको जो मिलता है वह वास्तव में आप क्या उम्मीद करते हैं। यदि यह एक संख्या होनी चाहिए, तो सुनिश्चित करें कि यह एक संख्या है।

बहुत सुधार कोड:

$user = filter_var($_POST['user'], FILTER_SANITIZE_STRING); 
$isValid = filter_var($user, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => "/^[a-zA-Z0-9]+$/"))); 

if ($isValid) { 
    // do something 
} 

स्वच्छता और मान्यता।

+1

वैकल्पिक रूप से, आप 'array_key_exists ($ _ POST,' user ') ' – mpen

+0

का उपयोग कर सकते हैं, मुझे यह सुनिश्चित करने के बारे में आपने जो कहा है उसे पसंद है। यह मूल रूप से एक लॉगिन स्क्रिप्ट होने जा रहा है और मैं mysql_real_escape() का उपयोग करने की योजना बना रहा हूं; मेरा मानना ​​है कि इसे क्या कहा जाता है। उपयोगकर्ता नाम चीजों का कोई संयोजन होगा और पासवर्ड केवल एमडी 5 होना चाहिए, स्क्रिप्ट में भेजे जाने से पहले प्रोग्राम में धोया गया था।मुझे यह भी ध्यान रखना चाहिए कि यह किसी साइट के लिए नहीं, एक साइट के लिए मान्य है। –

+0

कभी नहीं, कभी भी mysql_real_escape() का उपयोग करें। तैयार वक्तव्य के बारे में जानें और पीडीओ का उपयोग शुरू करें। http://php.net/manual/pdo.prepared-statements.php – vinnylinux

1

जब आप कहते हैं:

$user = $_POST["username"]; 

आप पीएचपी पूछ रहे हैं $user असाइन करने के लिए दुभाषिया $_POST सरणी का मान जिसमें username का एक प्रमुख (या अनुक्रमणिका) है। यदि यह अस्तित्व में नहीं है, तो PHP फिट बैठता है।

if (isset($_POST['user'])) { 
    $user = $_POST["username"]; 
    ... 
+0

धन्यवाद, जैसे मार्क रीड ने इसे समझाया। –

3

आपका कोड मान लिया गया कुछ के अस्तित्व:

$user = $_POST["username"]; 

पीएचपी दे रहा है जैसा कि आप जानते है कि वहाँ कोई "उपयोगकर्ता नाम

उपयोग isset($_POST['user']) कि चर के होने की जाँच करने के लिए "$_POST सरणी में। इस उदाहरण में, आप सुरक्षित मूल्य isset() अगर यह उपयोग करने के लिए प्रयास करने से पहले देखने के लिए जाँच होगी: वैकल्पिक रूप से

if (isset($_POST["username"])) { 
    /* ... proceed ... */ 
} 

, तो आप उच्च जैक || ऑपरेटर एक डिफ़ॉल्ट आवंटित करने के लिए कर सकते हैं:

$user = $_POST["username"] || "visitor" ; 

जब तक उपयोगकर्ता का नाम falsy मान नहीं है, तो आप इस विधि को बहुत विश्वसनीय मान सकते हैं। डिफ़ॉल्ट-असाइनमेंट एक ज्यादा सुरक्षित मार्ग को त्रिगुट ऑपरेटर का उपयोग करने के लिए होगा:

$user = isset($_POST["username"]) ? $_POST["username"] : "visitor" ; 
0

कोशिश

if(isset($_POST['username'])) 
    echo $_POST['username']." is your username"; 
else 
    echo "no username supplied"; 
+1

धन्यवाद। मैंने पहले इस त्रुटि में भाग नहीं लिया था और अब मैं इसे समझता हूं। –

-2

संबंधित प्रश्न:What is the best way to access unknown array elements without generating PHP notice?

ऊपर सवाल से जवाब का उपयोग करके आप यदि कुंजी मौजूद नहीं है तो PHP नोटिस उत्पन्न किए बिना सुरक्षित रूप से $ _POST से मूल्य प्राप्त कर सकते हैं।

echo _arr($_POST, 'username', 'no username supplied'); 
// will print $_POST['username'] or 'no username supplied' 
+0

यह कई स्तरों में गलत है ... – vinnylinux

+0

डाउनवॉटर और @ विनिलीनिनक्स: यह गलत क्यों है? – flowfree

+0

शायद क्योंकि यह आउटपुट का उत्पादन नहीं करता है ओपी चाहता है कि '[उपयोगकर्ता नाम] आपका उपयोगकर्ता नाम है' (मैं वह नहीं हूं जो डाउनवॉटेड है, अगर यह मायने रखता है, तो कारण अलग हो सकता है)? – tigrang

1

isset() के बजाय आप हो रही त्रुटियों को मौन कुछ कम उपयोग कर सकते हैं, यह @$_POST['field'] है। फिर, यदि फ़ील्ड सेट नहीं है, तो आपको किसी पृष्ठ पर कोई त्रुटि मुद्रित नहीं होगी।

1

इस प्रयास करें:

मैं इस हर जगह का उपयोग जहां एक $ _POST अनुरोध है।यदि isset यह, $ _POST [ 'उपयोगकर्ता नाम'] के लिए सेट नहीं है, तो फिर यह एक रिक्त स्ट्रिंग पर यह सेट हो जाएगा

$username=isset($_POST['username']) ? $_POST['username'] : ""; 

यह, बस एक छोटी हाथ बूलियन है।

प्रयोग उदाहरण:

if($username===""){ echo "Field is blank" } else { echo "Success" }; 
1

पीएचपी 5.2.0 से पहले और आप filter_input() जो विशेष रूप से उस के लिए बनाई गई है का उपयोग करना चाहिए इस तरह के नाम से मिलता है, पद या कुकी चर के रूप में एक विशिष्ट बाहरी उपयोगकर्ता इनपुट प्राप्त करने के लिए ऊपर और वैकल्पिक रूप से इसे आपकी साइट पर किसी भी XSS/इंजेक्शन हमलों से बचने के लिए फ़िल्टर करें। उदाहरण के लिए:

$user = filter_input(INPUT_POST, 'username'); 

आप INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, या INPUT_ENV से एक का उपयोग कर सकते हैं।

वैकल्पिक 3 तर्क का उपयोग करके आप यह filters (validating, sanitizing, filtering या other के लिए), उदा की विविधता से विस्तार कर सकते हैं FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_ENCODED, आदि

उदाहरण के लिए:

<?php 
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS); 
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED); 
echo "You have searched for $search_html.\n"; 
echo "<a href='?search=$search_url'>Search again.</a>"; 
?> 

वाक्य रचना है:

मिश्रित filter_input (पूर्णांक $ प्रकार, स्ट्रिंग $ variable_name [, पूर्णांक $ फिल्टर = FILTER_DEFAULT [, मिश्रित $ विकल्पों]])

(PHP 5> = 5.2.0, पीएचपी 7)

यह भी देखें: Why is better to use filter_input()?

0

मुझे पता है कि यह पुराने पोस्ट है, लेकिन किसी की मदद कर सकते हैं:

function POST($index, $default=NULL){ 
     if(isset($_POST[$index])) 
     { 
      if(!empty(trim($_POST[$index])))  
       return $_POST[$index]; 
     } 
     return $default; 
    } 

यह ऊपर कोड मेरी बुनियादी पोस्ट समारोह मैं कहीं भी क्या उपयोग कर रहे हैं। यहां आप फिल्टर, नियमित अभिव्यक्ति आदि डाल सकते हैं। तेज और साफ है। मेरा उन्नत पोस्ट फ़ंक्शन एरे, स्ट्रिंग प्रकार, डिफ़ॉल्ट मान इत्यादि को स्वीकार करने और जांचने के लिए अधिक जटिल है। आइए आपकी कल्पना यहां काम करें।

आप आसानी से इस तरह उपयोगकर्ता की जांच कर सकते हैं:

$username = POST("username"); 
if($username!==null){ 
    echo "{$username} is in the house."; 
} 

इसके अलावा, मैं $default स्ट्रिंग अगर पोस्ट सक्रिय नहीं है या सामग्री मौजूद नहीं है कि आप कुछ डिफ़ॉल्ट मान परिभाषित कर सकते हैं जोड़ा।

echo "<h1>".POST("title", "Stack Overflow")."</h1>"; 

इसके साथ खेलो।

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