"सूचना: अपरिभाषित चर", "सूचना: अपरिभाषित सूचकांक", और "सूचना: अपरिभाषित ऑफसेट" PHP का उपयोग कर


1173

मैं एक PHP स्क्रिप्ट चला रहा हूं और त्रुटियों को प्राप्त करना जारी रखता हूं:

सूचना: अपरिभाषित चर: my_variable_name C में: \ wamp \ www \ mypath \ index.php 10 पर

सूचना: अनिर्धारित सूचकांक: my_index C: \ wamp \ www \ mypath \ index.php 11 पंक्ति पर

लाइन 10 और 11 इस तरह दिखता है:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

इन त्रुटि संदेशों का अर्थ क्या है?

वे अचानक क्यों दिखाई देते हैं? मैं सालों से इस स्क्रिप्ट का उपयोग करता था और मुझे कभी कोई समस्या नहीं हुई।

मैं उन्हें कैसे ठीक करूं?


लोगों को बार-बार मुद्दे को समझाने के बजाय, डुप्लिकेट के रूप में लिंक करने के लिए यह एक सामान्य संदर्भ प्रश्न है । मुझे लगता है कि यह आवश्यक है क्योंकि इस मुद्दे पर अधिकांश वास्तविक दुनिया के जवाब बहुत विशिष्ट हैं।

संबंधित मेटा चर्चा:



3
चर को प्रारंभ नहीं किया जा सकता है। क्या आप किसी पोस्ट से वेरिएबल को इनिशियलाइज़ कर रहे हैं या किसी एरे को प्राप्त कर रहे हैं? अगर ऐसा है तो आपके पास उस ऐरे में फ़ील्ड नहीं हो सकता है। कि तुम्हारी पहुँच।
अनीश सिलवाल

3
@Pekka P - मैंने "और" सूचना: अपरिभाषित ऑफ़सेट "को जोड़ते हुए देखा - यह" PHP: "अपरिभाषित चर", "अपरिभाषित सूचकांक", "अपरिभाषित ऑफसेट" नोटिस (यहां तक ​​कि ले) का उपयोग करके अधिक अर्थ नहीं देगा। । बाहर पीएचपी, क्योंकि यह के रूप में "php" प्लस टैग है, यूआरएल बंद पर काटा जाता है and-notice-undef, केवल एक सुझाव ताकि यूआरएल काट नहीं प्राप्त करता है हो सकता है कि यहां तक कि (बहुत) उद्धरण चिह्न निकाल कर PHP: “Undefined variable/index/offset” notices
फंक चालीस

2
@ मुझे लगता है कि दोनों भिन्नताओं के लिए एक तर्क दिया जा सकता है। एक मौका है कि newbies पूरी पंक्ति में "नोटिस:" सहित उनकी खोज क्वेरी में प्रवेश करेगा, जो मुझे यकीन है कि इस प्रश्न के लिए मुख्य ट्रैफ़िक जनरेटर है। यदि संदेश पूर्ण हैं, तो खोज इंजन में दृश्यता में सुधार होने की संभावना है
Pekka

2
@Pekka 웃 मैं समझता हूं। मैंने केवल यह कहा था कि क्योंकि URL पहले कट नहीं गया था और अब वह ऐसा करता है and-notice-undef। यह सिर्फ (कुछ) सुझाव था। यह सिर्फ खुद को भी दोहराता है Notice: Undefined
फंक

जवाबों:


1066

सूचना: अपरिभाषित चर

PHP मैनुअल के विशाल ज्ञान से :

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

से पीएचपी प्रलेखन :

यदि चर मौजूद नहीं है, तो कोई चेतावनी उत्पन्न नहीं होती है। इसका मतलब है कि खाली () अनिवार्य रूप से संक्षिप्त (isset ($ var)) के बराबर है || $ वर == असत्य

इसका मतलब है कि आप केवल इस्तेमाल कर सकते हैं empty()निर्धारित करने के लिए चर सेट किया गया है, और इसके अलावा में यह निम्नलिखित के खिलाफ चर की जाँच करता है, 0, 0.0, "", "0", null, falseया []

उदाहरण:

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});

3v4l.org ऑनलाइन PHP संपादक में उपरोक्त स्निपेट का परीक्षण करें

हालांकि PHP को एक चर घोषणा की आवश्यकता नहीं है, यह कुछ सुरक्षा भेद्यता या बग से बचने के लिए इसे सुझाता है जहां कोई उस चर का मान देना भूल जाएगा जिसे बाद में स्क्रिप्ट में उपयोग किया जाएगा। अघोषित चरों के मामले में PHP क्या करता है, यह बहुत ही निम्न स्तर की त्रुटि है E_NOTICE, एक, जिसे डिफ़ॉल्ट रूप से रिपोर्ट भी नहीं किया जाता है, लेकिन मैनुअल विकास के दौरान अनुमति देने की सलाह देता है

समस्या से निपटने के तरीके:

  1. अनुशंसित: अपने चर की घोषणा करें, उदाहरण के लिए जब आप एक स्ट्रिंग को एक अपरिभाषित चर में जोड़ने की कोशिश करते हैं। या उपयोग isset()/ !empty() जाँच करने के लिए कि क्या उन्हें संदर्भित करने से पहले घोषित किया गया है, जैसे:

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';
    

    यह PHP 7.0 के रूप में बहुत साफ हो गया है, अब आप अशक्त कोलेसस ऑपरेटर का उपयोग कर सकते हैं :

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. E_NOTICE के लिए एक कस्टम त्रुटि हैंडलर सेट करें और मानक आउटपुट (शायद एक लॉग फ़ाइल में) से संदेशों को पुनर्निर्देशित करें:

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  3. रिपोर्टिंग से E_NOTICE अक्षम करें। सिर्फ बाहर करने का एक त्वरित तरीका E_NOTICEहै:

    error_reporting( error_reporting() & ~E_NOTICE )
  4. @ ऑपरेटर के साथ त्रुटि को दबाएं ।

नोट: यह दृढ़ता से सिर्फ 1 बिंदु को लागू करने के लिए अनुशंसित है।

सूचना: अनिर्धारित सूचकांक / अपरिभाषित ऑफसेट

यह सूचना तब दिखाई देती है जब आप (या PHP) किसी सरणी के अपरिभाषित सूचकांक तक पहुँचने की कोशिश करते हैं।

समस्या से निपटने के तरीके:

  1. यदि आप इसे एक्सेस करने से पहले इंडेक्स मौजूद हैं, तो जांचें। इसके लिए आप उपयोग कर सकते हैं isset()या array_key_exists():

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. भाषा निर्माण list()यह तब उत्पन्न हो सकता है जब यह उस सरणी इंडेक्स तक पहुंचने का प्रयास करता है जो मौजूद नहीं है:

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

दो चर तत्वों का उपयोग करने के लिए दो चर का उपयोग किया जाता है, हालांकि केवल एक ही सरणी तत्व, सूचकांक है 0, इसलिए यह उत्पन्न करेगा:

सूचना: अपरिभाषित ऑफ़सेट: १

$_POST/ $_GET/ $_SESSIONचर

ऊपर दिए गए नोटिस अक्सर साथ काम करते समय दिखाई देते हैं $_POST, $_GETया $_SESSION। इसके लिए $_POSTऔर $_GETआपको बस यह जांचना होगा कि क्या आप इनका उपयोग करने से पहले सूचकांक मौजूद हैं या नहीं। इसके लिए $_SESSIONआपको यह सुनिश्चित करना होगा कि आपके पास सत्र की शुरुआत हो session_start()और सूचकांक भी मौजूद हो।

यह भी ध्यान दें कि सभी 3 चर सुपरग्लोब हैं और अपरकेस हैं।

सम्बंधित:


7
@ Dieselpower44 विचारों के एक जोड़े: "शट-अप ऑपरेटर" ( @) में कुछ प्रदर्शन मुद्दे हैं। इसके अलावा, चूंकि यह एक विशेष दायरे के भीतर सभी त्रुटियों को दबा देता है , बिना देखभाल के इसका उपयोग करने से आप जो संदेश चाहते हैं वह मुखौटा हो सकता है।
IMSoP

6
मुद्दों को छुपाना मुद्दों से निपटने का तरीका नहीं है। आइटम # 2 ... # 4 का उपयोग केवल उत्पादन सर्वर पर किया जा सकता है, सामान्य रूप से नहीं।
सलमान ए

1
क्या कस्टम त्रुटि हैंडलर का उपयोग करने पर संदेश इनलाइन (हैंडलर में नहीं) को बंद करना संभव है? $var = @$_GET['nonexisting'];अभी भी नोटिस का कारण बनता है ..
अल्फ.डेव

18
1. $value = isset($_POST['value']) ? $_POST['value'] : '';का उपयोग करने के बजाय 1. का उपयोग करने की अनुशंसा क्यों की जाती है $value = @$_POST['value'];?
forvvunnet

@twistedpixel वे 4 तरीके स्वतंत्र हैं, यह एक 4-चरण मार्गदर्शिका नहीं है। इसलिए यदि आपने रास्ता 4 का उपयोग करने के लिए चुना है, तो इसका मतलब है कि आपने पहले 3 तरीकों को लागू नहीं किया है, इसलिए आपने अभी तक कोई त्रुटि नहीं दी है।
ऐकान यासात

141

इन्हें कोशिश करें

Q1: इस नोटिस का मतलब है कि स्क्रिप्ट के मौजूदा दायरे में $ varname परिभाषित नहीं है।

Q2: किसी भी संदिग्ध चर का उपयोग करने से पहले isset (), खाली () स्थितियों का उपयोग अच्छी तरह से काम करता है।

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';

// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

या, एक त्वरित और गंदे समाधान के रूप में:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

सत्र के बारे में ध्यान दें:

  • सत्र का उपयोग करते समय, सत्र का उपयोग करके session_start();सभी फ़ाइलों के अंदर रखा जाना आवश्यक है।

  • http://php.net/manual/en/features.sessions.php


यदि कॉन्फ़िगरेशन फ़ाइल E_NOTICEसे उपयोग किया जाता php.iniहै, तोerror_reporting = (E_ALL & ~E_NOTICE)
ahmd0


उपरोक्त उत्तर से, मैंने isset, array_key_exists की कोशिश की है, लेकिन उन लोगों ने काम नहीं किया। मैंने आपके उत्तर की कोशिश की, .empty (), और यह काम करता है। आपका बहुत बहुत धन्यवाद!
20

63

त्रुटि प्रदर्शन @ऑपरेटर

अवांछित और निरर्थक सूचनाओं के लिए, कोई व्यक्ति समर्पित @ऑपरेटर का उपयोग "अप्रभावित चर / सूचकांक संदेशों को छिपाने " के लिए कर सकता है ।

$var = @($_GET["optional_param"]);
  • यह आमतौर पर हतोत्साहित किया जाता है। नए लोगों ने इसका अत्यधिक उपयोग किया है।
  • यह एप्लिकेशन लॉजिक के भीतर कोड डीप के लिए बहुत अनुचित है (जहां आप नहीं होना चाहिए, अघोषित चर को अनदेखा करना), जैसे फ़ंक्शन मापदंडों के लिए, या लूप में।
  • हालाँकि isset?:या ??सुपर-सुपरशन पर एक उल्टा है । नोटिस अभी भी लॉग इन कर सकते हैं। और एक पुनर्जीवित हो सकता है के @साथ-साथ नोटिस:set_error_handler("var_dump");
    • Additonally आपको if (isset($_POST["shubmit"]))अपने प्रारंभिक कोड में आदतन उपयोग / अनुशंसा नहीं करनी चाहिए ।
    • नवागंतुक ऐसे टाइपोस को स्पॉट नहीं करेंगे। यह सिर्फ उन्हीं मामलों के लिए आपको PHPs नोटिस से वंचित करता है। कार्यक्षमता को सत्यापित करने के बाद ही जोड़ें @या ।isset
    • पहले कारण को ठीक करें। नोटिस नहीं।

  • @विशेष रूप से वैकल्पिक होने पर $_GET/ $_POSTइनपुट मापदंडों के लिए मुख्य रूप से स्वीकार्य है ।

और चूंकि यह अधिकांश ऐसे प्रश्नों को कवर करता है, आइए सबसे सामान्य कारणों पर विस्तार करें:

$_GET/ $_POST/ $_REQUESTअपरिभाषित इनपुट

  • अपरिभाषित सूचकांक / ऑफसेट का सामना करते समय सबसे पहले आप टाइपो की जांच करते हैं:
    $count = $_GET["whatnow?"];

    • क्या यह प्रत्येक पृष्ठ अनुरोध पर एक अपेक्षित कुंजी नाम और वर्तमान है ?
    • परिवर्तनीय नाम और सरणी संकेत PHP में केस-संवेदी हैं।
  • दूसरी बात, अगर नोटिस में स्पष्ट कारण नहीं है, तो अपनी क्यूरेंट सामग्री के लिए सभी इनपुट सरणियों का उपयोग var_dumpया print_rसत्यापन करें :

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);

    दोनों यह बताएंगे कि क्या आपकी स्क्रिप्ट को सही या किसी भी पैरामीटर के साथ लागू किया गया था।

  • वैकल्पिक रूप से या इसके अतिरिक्त अपने ब्राउज़र devtools काF12 उपयोग करें ( ) अनुरोधों और मापदंडों के लिए नेटवर्क टैब का निरीक्षण करें:

    ब्राउज़र डेवलपर टूल / नेटवर्क टैब

    POST पैरामीटर और GET इनपुट को अलग-अलग दिखाया जाएगा।

  • के लिए $_GETमानकों को आप भी पर झांकना कर सकते QUERY_STRINGमें

    print_r($_SERVER);

    सुपरग्लोबल्स में गैर-मानक पैरामीटर नामों को समेटने के लिए PHP के कुछ नियम हैं । अपाचे कुछ पुनर्लेखन भी कर सकता है। आप इस तरह से कच्चे $_COOKIESऔर अन्य HTTP अनुरोध हेडर को भी देख सकते हैं ।

  • अधिक स्पष्ट रूप से GET मापदंडों के लिए अपने ब्राउज़र पता बार को देखें :

    http://example.org/script.php?id=5&sort=desc

    name=valueके बाद जोड़े ?प्रश्न चिह्न आपकी क्वेरी (जीईटी) मानकों हैं। इस प्रकार यह URL केवल उपज दे सकता है $_GET["id"]और $_GET["sort"]

  • अंत में अपने <form>और<input> घोषणाओं की जांच करें , यदि आप एक पैरामीटर की उम्मीद करते हैं, लेकिन कोई भी प्राप्त नहीं करता है।

    • सुनिश्चित करें कि प्रत्येक आवश्यक इनपुट में ए है <input name=FOO>
    • id=या title=विशेषता पर्याप्त नहीं है।
    • एक method=POSTफॉर्म को आबाद करना चाहिए $_POST
    • जबकि method=GET(या इसे छोड़ना) $_GETचर होगा ।
    • action=script.php?get=param$ _GET के माध्यम से और method=POST$ _POST में शेष क्षेत्रों के साथ आपूर्ति करना भी संभव है ।
    • आधुनिक PHP कॉन्फ़िगरेशन () 5.6) के साथ यह फिर से उपयोग करने के लिए संभव नहीं (फैशनेबल नहीं) हो $_REQUEST['vars']गया है, जो GET और POST पैरामेस को पिघला देता है।
  • यदि आप mod_rewrite को नियोजित कर रहे हैं, तो आपको दोनों के access.logसाथ-साथ RewriteLogअनुपस्थित मापदंडों का पता लगाने में सक्षम होना चाहिए ।

$_FILES

  • अपलोड करने और फ़ाइल अपलोड करने के लिए एक ही पवित्रता जांच लागू होती है $_FILES["formname"]
  • इसके अलावा जाँच करें enctype=multipart/form-data
  • साथ ही method=POSTअपने <form>घोषणा पत्र में।
  • यह भी देखें: PHP अपरिभाषित सूचकांक त्रुटि $ _FILES?

$_COOKIE

  • $_COOKIEसरणी सही होने के बाद आबादी वाले कभी नहीं किया गया है setcookie(), लेकिन केवल किसी भी फॉलोअप HTTP अनुरोध पर।
  • इसके अतिरिक्त उनकी वैधता के समय, वे उप-डोमेन या अलग-अलग रास्तों के लिए बाधा बन सकते हैं, और उपयोगकर्ता और ब्राउज़र उन्हें केवल अस्वीकार या हटा सकते हैं।

2
यदि आप उत्सुक हैं कि प्रदर्शन प्रभाव क्या है, तो यह लेख इसे अच्छी तरह से सारांशित करता है, derickrethans.nl/…
गजस

@GajusKuizinas 2009 के बाद से कुछ बदलाव हुए हैं, विशेष रूप से php.net/ChangeLog-5.php#5.4.0 के परिणामों में भारी बदलाव ("ज़ेंड इंजन, प्रदर्शन" और "(मौन) ऑपरेटर") देखें।
मारिओ

धन्यवाद @ उमरियो, दिलचस्प। अब, यदि कोई व्यक्ति दोनों को बेंचमार्क करने के लिए काफी अच्छा था ... 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabs इस परीक्षण के अनुसार, समान प्रतीत होते हैं (नोटिस: पैमाने में परिवर्तन)।
गजस

47

आम तौर पर "खराब प्रोग्रामिंग" के कारण, और अभी या बाद में गलतियों की संभावना है।

  1. यदि यह एक गलती है, तो पहले चर को एक उचित असाइनमेंट बनाएं: $ varname = 0;
  2. यदि यह वास्तव में केवल कभी-कभी परिभाषित किया गया है, तो इसका if (isset($varname))उपयोग करने से पहले, इसके लिए परीक्षण करें:
  3. यदि ऐसा है क्योंकि आपने इसे गलत बताया है, तो इसे ठीक करें
  4. हो सकता है कि आपके द्वारा दी गई चेतावनियों में भी PHP- सेटिंग हो

5
कृपया चेतावनियों को बंद न करें। कठोर भाषाओं में, उनका अक्सर अर्थ होता है "एक बग हो सकता है, आप इस लाइन को दो बार बेहतर तरीके से जांचते हैं" - भाषा में PHP के रूप में अनुमेय के रूप में, उनका अक्सर अर्थ होता है "यह कोड बकवास है और कीड़े के साथ भविष्यवाणी की गई है; मैं इसे बनाने की कोशिश करूंगा।" इसके बारे में कुछ समझ में आता है लेकिन आप इस ASAP को ठीक कर लेते हैं ”।

5
हालाँकि मैं पहले तीन बिंदुओं से सहमत हूँ, # 4 केवल गलत है। किसी समस्या को छिपाने से वह दूर नहीं होगी, और इससे सड़क पर समस्याएँ भी बढ़ सकती हैं।
वैलेंटाइन फ्लैचेल

1
@ पूरी तरह से सच है, लेकिन कुछ परिदृश्यों में (खरीदी गई स्क्रिप्ट, शून्य तकनीकी ज्ञान, कल तक इसे चलाने की आवश्यकता है ...) यह डक्ट-टेप समाधान है - वास्तव में बुरा है, जिसे हमेशा जोर देने की आवश्यकता होती है, लेकिन एक विकल्प
पेक्का

डक्ट-टेप अच्छा है ... कभी-कभी। ऐतिहासिक रूप से चेतावनी को मानक PHP-सेटिंग्स में बदल दिया गया है, लेकिन डिफॉल्ट सेटिंग्स अधिक सख्त हो गई हैं। बहुत बुरा कई पुरानी सेटिंग्स पर वापस जाता है, ताकि ग्राहकों को नाराज न करें।
एरिक

41

इसका मतलब है कि आप एक ऐसे वेरिएबल का परीक्षण, मूल्यांकन या मुद्रण कर रहे हैं, जिसे आपने अभी तक कुछ भी नहीं सौंपा है। इसका मतलब है कि आपके पास या तो एक टाइपो है, या आपको यह जांचने की आवश्यकता है कि पहले चर को किसी चीज़ से शुरू किया गया था। अपने तर्क पथों की जाँच करें, यह एक पथ में सेट किया जा सकता है लेकिन दूसरे में नहीं।


34

मैं नोटिस को अक्षम नहीं करना चाहता था क्योंकि यह मददगार है, लेकिन बहुत टाइपिंग से बचना चाहता था।

मेरा समाधान इस समारोह था:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

इसलिए अगर मैं मौजूद है तो $ नाम और प्रतिध्वनि का संदर्भ देना चाहता हूं, मैं बस लिखता हूं:

<?=ifexists('name')?>

सरणी तत्वों के लिए:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

अगर मैं $ _REQUEST ['नाम'] का संदर्भ देना चाहता / चाहती हूं:

<?=ifexistsidx($_REQUEST,'name')?>

2
आपके ifexists () फ़ंक्शन PHP 5.3 में मेरे लिए काम नहीं करता है। फोन करने वाले का चर समारोह के स्थानीय क्षेत्र में उपलब्ध नहीं हैं (देखें चर गुंजाइश जब तक वे कर रहे हैं,) superglobals या आप के साथ बेला $ वैश्विक है, तो $foo = "BABAR"; ifexists('foo');सामान्य वापसी अशक्त में होगा। (इटैलिक php.net अध्याय हैं।)
स्केरपेज

अब आपको "हैलो से" मिलेगा ... क्या बात है? बस मान की जाँच करेंif( !empty($user) and !empty($location) ) echo "hello $user ..."
gcb

27

इनपुट स्ट्रिंग प्राप्त करने का सबसे अच्छा तरीका है:

$value = filter_input(INPUT_POST, 'value');

यह वन-लाइनर लगभग बराबर है:

if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}

यदि आप पूरी तरह से स्ट्रिंग मान चाहते हैं , जैसे:

$value = (string)filter_input(INPUT_POST, 'value');

25

इसका कारण चर '$ user_location' को परिभाषित नहीं किया जा रहा है। यदि आप किसी भी लूप का उपयोग कर रहे हैं जिसके अंदर आप '$ user_location' चर घोषित कर रहे हैं तो आपके पास एक और लूप होना चाहिए और उसी को परिभाषित करना चाहिए। उदाहरण के लिए:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;

उपरोक्त कोड त्रुटि पैदा करेगा क्योंकि यदि लूप संतुष्ट नहीं है और दूसरे लूप में '$ user_location' को परिभाषित नहीं किया गया है। फिर भी PHP को चर को प्रतिध्वनित करने के लिए कहा गया था। तो कोड को संशोधित करने के लिए आपको निम्नलिखित कार्य करने होंगे:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;

25

"" के जवाब में वे अचानक क्यों दिखाई देते हैं? मैं सालों से इस स्क्रिप्ट का उपयोग करता था और मुझे कभी कोई समस्या नहीं हुई। ”

अधिकांश साइटों के लिए "डिफ़ॉल्ट" त्रुटि रिपोर्टिंग के तहत संचालित करना बहुत आम है "सभी त्रुटियों को दिखाएं, लेकिन 'नोटिस' और 'पदावनत" नहीं। यह php.ini में सेट किया जाएगा और सर्वर पर सभी साइटों पर लागू होगा। इसका मतलब यह है कि उदाहरणों में उपयोग की जाने वाली "नोटिस" को दबा दिया जाएगा (छिपा हुआ), जबकि अन्य त्रुटियों, जिन्हें अधिक महत्वपूर्ण माना जाता है, को दिखाया / रिकॉर्ड किया जाएगा।

अन्य महत्वपूर्ण सेटिंग है त्रुटियों को छिपाया जा सकता है (यानी display_errors"बंद" या "syslog" पर सेट)।

इस मामले में क्या हुआ है कि या तो error_reportingनोटिस (उदाहरण के अनुसार) और / या कि सेटिंग्स को display_errorsस्क्रीन पर बदल दिया गया था (जैसा कि उन्हें दबाने / उन्हें लॉग करने के विपरीत) में बदल दिया गया था।

वे क्यों बदल गए हैं?

स्पष्ट / सरल उत्तर है कि किसी ने php.ini में इन सेटिंग्स में से किसी एक को समायोजित किया है, या PHP का उन्नत संस्करण अब पहले से एक अलग php.ini का उपयोग कर रहा है। यह देखने के लिए पहली जगह है।

हालाँकि इन सेटिंग्स को ओवरराइड करना भी संभव है

  • .htconf (वेबसर्वर कॉन्फ़िगरेशन, vhosts और उप-विन्यास सहित) *
  • .htaccess
  • php कोड में ही

और इनमें से किसी को भी बदला जा सकता था।

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

(.htconf / .htaccess मान लें कि आप अपाचे के रूप में चल रहे हैं। यदि कमांड लाइन चल रही है तो यह लागू नहीं होगी; यदि IIS या अन्य वेबसर्वर चल रहा है, तो आपको तदनुसार कॉन्फ़िगर करने की आवश्यकता होगी।

सारांश

  • Php.ini में चेक error_reportingऔर display_errorsphp डाइरेक्टिव नहीं बदले हैं, या आप पहले से अलग php.ini का उपयोग नहीं कर रहे हैं।
  • .Htconf (या vhosts आदि) में जाँच error_reportingऔर display_errorsphp निर्देश नहीं बदले हैं
  • .Htaccess में चेक error_reportingऔर display_errorsphp निर्देश नहीं बदले हैं
  • यदि आपके पास .htaccess में निर्देश हैं, तो देखें कि क्या उन्हें अभी भी .htconf फ़ाइल में अनुमति है
  • अंत में अपना कोड जांचें; संभवतः एक असंबंधित पुस्तकालय; यह देखने के लिए कि क्या error_reportingऔर display_errorsphp निर्देश वहां स्थापित किए गए हैं।


16

मैं इस त्रुटि को शाप देता था, लेकिन यह आपको उपयोगकर्ता इनपुट से बचने के लिए याद दिलाने में मददगार हो सकता है।

उदाहरण के लिए, यदि आपको लगता है कि यह चतुर था, तो शॉर्टहैंड कोड:

// Echo whatever the hell this is
<?=$_POST['something']?>

...फिर से विचार करना! एक बेहतर समाधान है:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

(मैं html()पात्रों से बचने के लिए एक कस्टम फ़ंक्शन का उपयोग करता हूं , आपका लाभ भिन्न हो सकता है)


15

PHP 7.0 में अब Null coalescing ऑपरेटर का उपयोग करना संभव है:

echo "My index value is: " . ($my_array["my_index"] ?? '');

बराबर है:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHP मैनुअल PHP 7.0


यह भी अगर बयान में ठीक काम करता है। if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
एक कोडर

आपका कोड वास्तव में एक अच्छा अनदेखा बग है: ?? - केवल जांच करता है isset(), यदि आप पास करते हैं is_array()- जो एक बूलियन है, तो अप्रत्याशित व्यवहार का पालन होगा।
elpiel

14

मैं हर समय स्वयं उपयोगी फ़ंक्शन एक्सस्ट () का उपयोग करता हूं जो स्वचालित रूप से चर घोषित करते हैं।

आपका कोड होगा -

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}

14

बहुत ही सरल भाषा में
गलती यह है कि आप एक चर का उपयोग कर रहे हैं $user_locationजो आपके द्वारा पहले परिभाषित नहीं किया गया है और इसका कोई मूल्य नहीं है इसलिए मैं आपको सलाह देता हूं कि कृपया इस चर को उपयोग करने से पहले घोषित करें , उदाहरण के लिए:


$user_location = '';
या
$user_location = 'Los Angles';
यह एक बहुत ही सामान्य त्रुटि है जिसका आप सामना कर सकते हैं। चिंता न करें बस चर घोषित करें और कोडिंग का आनंद लें


8

चीजों को सरल क्यों नहीं रखते?

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']);         // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>

8

ये क्यों हो रहा है?

समय के साथ, PHP एक अधिक सुरक्षा-केंद्रित भाषा बन गई है। डिफ़ॉल्ट रूप से बंद की जाने वाली सेटिंग अब डिफ़ॉल्ट रूप से चालू हो जाती हैं। इसका एक आदर्श उदाहरण है E_STRICT, जो PHP 5.4.0 के रूप में डिफ़ॉल्ट रूप से चालू हो गया है ।

इसके अलावा, PHP प्रलेखन के अनुसार, डिफ़ॉल्ट रूप से, E_NOTICEphp.ini में अक्षम है। PHP डॉक्स डीबगिंग उद्देश्यों के लिए इसे चालू करने की सलाह देते हैं । हालाँकि, जब मैं उबंटू रिपॉजिटरी से PHP डाउनलोड करता हूं - और BitNami के विंडोज स्टैक से - मुझे कुछ और दिखाई देता है।

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

सूचना जो error_reportingवास्तव में डिफ़ॉल्ट रूप से "डिफ़ॉल्ट" मान के लिए नहीं, डिफ़ॉल्ट रूप से उत्पादन मान पर सेट है। यह कुछ भ्रामक है और php.ini के बाहर प्रलेखित नहीं है, इसलिए मैंने अन्य वितरणों पर इसे मान्य नहीं किया है।

हालाँकि, आपके प्रश्न का उत्तर देने के लिए, यह त्रुटि तब सामने आती है जब यह पहले से पॉप अप नहीं होती थी:

  1. आपने PHP स्थापित किया है और नई डिफ़ॉल्ट सेटिंग्स कुछ हद तक खराब दस्तावेज हैं, लेकिन बाहर न करें E_NOTICE

  2. E_NOTICEअपरिभाषित चर और अपरिभाषित अनुक्रमित जैसे चेतावनी वास्तव में आपके कोड को क्लीनर और सुरक्षित बनाने में मदद करते हैं। मैं आपको बता सकता हूं कि, वर्षों पहले, E_NOTICEसक्षम रखने से मुझे अपने चर घोषित करने के लिए मजबूर होना पड़ा। इसने C को सीखना बहुत आसान बना दिया, घोषित नहीं किया गया कि चर एक उपद्रव से बहुत बड़ा है।

मैं इसमें क्या कर सकता हूँ?

  1. E_NOTICE"डिफ़ॉल्ट मान" की प्रतिलिपि बनाकर बंद करें E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATEDऔर इसके साथ बराबरी पर हस्ताक्षर करने के बाद वर्तमान में जो कुछ भी अपूर्ण है उसे बदल दें error_reporting =। यदि CGI या FPM का उपयोग कर Apache या PHP को पुनरारंभ करें। सुनिश्चित करें कि आप "सही" php.ini का संपादन कर रहे हैं। अगर आप PHP के साथ PHP चला रहे हैं तो सही है Apache, fpm या php-fpm अगर PHP-FPM, cgi चला रहा है तो PHP-CGI, आदि चला रहा है। यह अनुशंसित तरीका नहीं है, लेकिन यदि आपके पास विरासत कोड है जो कि जा रहा है। संपादित करना अत्यधिक कठिन हो सकता है, फिर यह आपकी सबसे अच्छी शर्त हो सकती है।

  2. E_NOTICEफ़ाइल या फ़ोल्डर स्तर को बंद करें । यदि आप कुछ विरासत कोड रखते हैं तो यह बेहतर हो सकता है लेकिन अन्यथा "सही" तरीके से काम करना चाहते हैं। ऐसा करने के लिए, आपको Apache2, Nginx, या जो भी आपकी पसंद का सर्वर है, से परामर्श करना चाहिए। अपाचे में, आप php_valueअंदर का उपयोग करेंगे <Directory>

  3. क्लीनर होने के लिए अपने कोड को फिर से लिखें। यदि आप ऐसा करने की जरूरत है, जबकि एक उत्पादन वातावरण में जाने या आपके त्रुटियों को देखने के लिए किसी को नहीं करना चाहता, सुनिश्चित करें कि आप त्रुटियों के किसी भी प्रदर्शन अक्षम कर रहे हैं, और केवल बनाने के प्रवेश करने के लिए अपने त्रुटियों (देखें display_errorsऔर log_errorsआपकी सर्वर सेटिंग php.ini में और) ।

विकल्प 3 पर विस्तार करने के लिए: यह आदर्श है। यदि आप इस मार्ग पर जा सकते हैं, तो आपको चाहिए। यदि आप शुरू में इस मार्ग पर नहीं जा रहे हैं, तो विकास के माहौल में अपने कोड का परीक्षण करके अंततः इस मार्ग को आगे बढ़ाने पर विचार करें। जब आप इस पर हों, तो इससे छुटकारा पाएं ~E_STRICTऔर ~E_DEPRECATEDदेखें कि भविष्य में क्या गलत हो सकता है। आप अपरिचित त्रुटियों का एक बहुत कुछ देखने जा रहे हैं, लेकिन जब आप भविष्य में PHP को अपग्रेड करने की आवश्यकता होती है, तो यह आपको किसी भी अप्रिय समस्या होने से रोकने वाला है।

त्रुटि क्या है?

Undefined variable: my_variable_name- यह तब होता है जब उपयोग करने से पहले एक चर को परिभाषित नहीं किया गया है। जब PHP स्क्रिप्ट निष्पादित होती है, तो यह आंतरिक रूप से केवल एक शून्य मान मानती है। हालाँकि, किस परिदृश्य में आपको परिभाषित होने से पहले एक चर की जांच करने की आवश्यकता होगी? अंततः, यह "मैला कोड" के लिए एक तर्क है। एक डेवलपर के रूप में, मैं आपको बता सकता हूं कि मैं इसे प्यार करता हूं जब मैं एक ओपन सोर्स प्रोजेक्ट देखता हूं जहां चर को उनके स्कॉप्स में उच्च के रूप में परिभाषित किया जाता है क्योंकि उन्हें परिभाषित किया जा सकता है। यह बताना आसान बनाता है कि भविष्य में कौन से चर पॉप अप करने जा रहे हैं और कोड को पढ़ना / सीखना आसान बनाता है।

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: my_index- यह तब होता है जब आप किसी सरणी में मान तक पहुँचने का प्रयास करते हैं और इसका अस्तित्व नहीं होता है। इस त्रुटि को रोकने के लिए, एक सशर्त जाँच करें।

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   

एक अन्य विकल्प अपने फ़ंक्शन के शीर्ष पर एक खाली सरणी घोषित करना है। यह हमेशा संभव नहीं है।

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(अतिरिक्त टिप)

  • जब मैं इन और अन्य मुद्दों का सामना कर रहा था, तो मैंने नेटबीन्स आईडीई (फ्री) का इस्तेमाल किया और इसने मुझे चेतावनी और नोटिस की मेजबानी दी। उनमें से कुछ बहुत उपयोगी सुझाव प्रदान करते हैं। यह एक आवश्यकता नहीं है, और मैं बड़ी परियोजनाओं को छोड़कर अब आईडीई का उपयोग नहीं करता हूं। मैं vimइन दिनों एक व्यक्ति से अधिक हूं :)।

6

अपरिभाषित सूचकांक का मतलब उस सरणी में होता है जिसका आपने उदाहरण के लिए अनुपलब्ध सरणी सूचकांक के लिए अनुरोध किया था

<?php 

$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);

?>

अपरिभाषित चर का मतलब है कि आपने मौजूदा चर का पूरी तरह से उपयोग नहीं किया है या जो उदाहरण के लिए उस नाम से परिभाषित या आरंभिक नहीं है

<?php print_r($myvar); ?>

अपरिभाषित ऑफसेट का मतलब है कि आपने गैर-मौजूदा कुंजी के लिए कहा है। और इसका समाधान उपयोग से पहले जांचना है

php> echo array_key_exists(1, $myarray);

4

प्रश्न के इस भाग के बारे में:

वे अचानक क्यों दिखाई देते हैं? मैं सालों से इस स्क्रिप्ट का उपयोग करता था और मुझे कभी कोई समस्या नहीं हुई।

कोई निश्चित उत्तर नहीं, लेकिन यहां कुछ संभावित स्पष्टीकरण दिए गए हैं कि सेटिंग्स 'अचानक' क्यों बदल सकती हैं:

  1. आपने PHP को एक नए संस्करण में अपग्रेड किया है जिसमें error_reporting, display_errors या अन्य प्रासंगिक सेटिंग्स के लिए अन्य डिफॉल्ट हो सकते हैं।

  2. आपने कुछ कोड निकाले हैं (संभवतः एक निर्भरता में) जो रनटाइम के समय प्रासंगिक सेटिंग्स सेट करते हैं ( ini_set()या error_reporting()कोड में इनकी खोज करें)

  3. आपने वेबसर्वर कॉन्फ़िगरेशन (यहां एपाचे को संभालने) को बदल दिया: .htaccessफाइलें और vhost कॉन्फ़िगरेशन भी php सेटिंग्स में फेरबदल कर सकते हैं।

  4. आमतौर पर नोटिस प्रदर्शित नहीं होते हैं / रिपोर्ट ( PHP मैनुअल देखें ) इसलिए यह संभव है कि सर्वर सेट करते समय, php.ini फ़ाइल को किसी कारण से लोड नहीं किया जा सके (फ़ाइल अनुमतियाँ ??) और आप डिफ़ॉल्ट सेटिंग्स पर थे । बाद में, 'बग' को हल कर दिया गया है (दुर्घटना से) और अब यह नोटिस दिखाने के लिए error_reporting सेट के साथ सही php.ini फ़ाइल को लोड कर सकता है।


3

यदि आप वर्गों के साथ काम कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि आप सदस्य चर का उपयोग कर संदर्भ लें $this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}

3

एक अपरिभाषित सूचकांक नोटिस क्यों फेंका जाएगा, इसका एक और कारण यह होगा कि डेटाबेस क्वेरी से एक कॉलम छोड़ा गया था।

अर्थात:

$query = "SELECT col1 FROM table WHERE col_x = ?";

फिर एक लूप के अंदर अधिक कॉलम / पंक्तियों तक पहुंचने की कोशिश कर रहा है।

अर्थात:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

या एक whileलूप में:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

कुछ और जिन पर ध्यान देने की आवश्यकता है, वह यह है कि * NIX OS और Mac OS X, चीजें केस-संवेदी हैं।

स्टैक पर फोलोइंग क्यू एंड ए से परामर्श करें:


3

टर्नरी का उपयोग करना सरल, पठनीय और साफ है:

Pre PHP 7
यदि यह सेट है, तो किसी अन्य चर के मान के लिए एक चर असाइन करें, अन्य असाइन करेंnull(या जो भी डिफ़ॉल्ट मान आपकी आवश्यकता है):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

PHP 7+ Null Coalescing Operator
का उपयोग करने के अलावा । अब इसमें कॉल करने की आवश्यकता नहीं है क्योंकि इसे बनाया गया है, और वेरिएबल प्रदान करने की आवश्यकता नहीं है क्योंकि यह चेक किए जा रहे वेरिएबल का मान लौटाने के लिए मान्य है: isset()

$newVariable = $thePotentialData ?? null;

दोनों ओपी प्रश्न से नोटिस को रोक देंगे, और दोनों इसके बराबर हैं:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

 
यदि आपको एक नया चर सेट करने की आवश्यकता नहीं है, तो आप सीधे टेनेरी के दिए गए मान का उपयोग कर सकते हैं, जैसे कि echo, फ़ंक्शन तर्क, आदि।

इको:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

समारोह:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

उपरोक्त केवल सरणियों के साथ ही काम करेगा, जिसमें सत्र आदि शामिल हैं, उदाहरण के लिए जाँच की जा रही चर की जगह:
$_SESSION['checkMe']
या फिर कई स्तरों पर आपकी आवश्यकता है, जैसे:
$clients['personal']['address']['postcode']


 

दमन:

@आपकी सूचना रिपोर्टिंग स्तर के साथ PHP नोटिस को दबाने या कम करने के लिए संभव है, लेकिन यह समस्या को ठीक नहीं करता है , यह बस इसे त्रुटि लॉग में रिपोर्ट किए जाने से रोकता है। इसका मतलब है कि आपके कोड ने अभी भी एक चर का उपयोग करने की कोशिश की है जो सेट नहीं किया गया था, जिसका मतलब यह हो सकता है कि कुछ काम नहीं करता है या नहीं - यह इस बात पर निर्भर करता है कि लापता मूल्य कितना महत्वपूर्ण है।

आपको वास्तव में इस मुद्दे की जाँच करनी चाहिए और इसे उचित रूप से संभालना चाहिए, या तो एक अलग संदेश परोसना चाहिए, या यहां तक ​​कि सटीक स्थिति की पहचान करने के लिए बाकी सब चीजों के लिए एक शून्य मान लौटा देना चाहिए।

यदि आप केवल नोटिस में त्रुटि लॉग में नहीं होने की परवाह करते हैं, तो एक विकल्प के रूप में आप बस त्रुटि लॉग को अनदेखा कर सकते हैं।


1

एक HTML फॉर्म सबमिट होने के बाद मौजूद वैरिएबल का एक सामान्य कारण यह नहीं है कि फॉर्म एलिमेंट एक <form>टैग के भीतर समाहित नहीं है :

उदाहरण: तत्व में निहित नहीं है <form>

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

उदाहरण: तत्व अब भीतर निहित है <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

0

संभवत: आप पुराने PHP संस्करण का उपयोग कर रहे थे और अब तक PHP के उन्नयन का कारण यह है कि यह वर्षों से अब तक किसी भी त्रुटि के बिना काम कर रहा था। PHP4 तक कोई त्रुटि नहीं थी यदि आप इसे परिभाषित किए बिना चर का उपयोग कर रहे हैं, लेकिन PHP5 के रूप में यह प्रश्न में वर्णित कोड की तरह त्रुटियों को फेंकता है।


0

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

मैनुअल निम्नलिखित मूल वाक्यविन्यास बताता है:

एचटीएमएल

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

पीएचपी

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

संदर्भ:


0

मैंने इस बारे में एक प्रश्न पूछा और मुझे इस पोस्ट को संदेश के साथ भेजा गया:

इस सवाल का पहले से ही यहाँ एक जवाब है:

"सूचना: अपरिभाषित चर", "सूचना: अपरिभाषित सूचकांक", और "सूचना: अपरिभाषित ऑफसेट" PHP का उपयोग कर

मैं यहां अपना प्रश्न और समाधान साझा कर रहा हूं:

यह त्रुटि है:

यहां छवि विवरण दर्ज करें

लाइन 154 की समस्या है। यह वही है जो मेरे पास 154 है:

153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

मुझे लगता है कि समस्या यह है कि मैं चर के लिए शर्तें लिख रहा हूं $city , जो कुंजी नहीं है, लेकिन मूल्य है $key => $city। पहले, क्या आप पुष्टि कर सकते हैं कि चेतावनी का कारण क्या है? दूसरा, अगर यह समस्या है, तो ऐसा क्यों है कि मैं मूल्य के आधार पर एक शर्त नहीं लिख सकता हूं? क्या यह उस कुंजी के साथ होना चाहिए जिसे मुझे शर्त लिखने की आवश्यकता है?

अद्यतन 1: समस्या यह है कि निष्पादित करते समय $citiesCounterArray[$key], कभी-कभी$key एक कुंजी मेल खाती है जो $citiesCounterArrayसरणी में मौजूद नहीं है , लेकिन यह हमेशा मेरे लूप के डेटा के आधार पर मामला नहीं है। मुझे एक शर्त सेट करने की आवश्यकता है ताकि यदि $keyसरणी में मौजूद हो, तो कोड चलाएं, अन्यथा, इसे छोड़ दें।

अद्यतन 2: यह है कि मैंने इसे कैसे उपयोग करके तय किया array_key_exists():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

0

जब भी हम उस चर का उपयोग कर रहे होते हैं जो सेट नहीं होता है।

इनसे निपटने का सबसे अच्छा तरीका विकास के दौरान त्रुटि रिपोर्टिंग है।

त्रुटि रिपोर्टिंग सेट करने के लिए:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

उत्पादन सर्वर पर, त्रुटि रिपोर्टिंग बंद है, इसलिए, हमें ये त्रुटियां नहीं मिलती हैं।

हालांकि, विकास सर्वर पर, हम त्रुटि रिपोर्टिंग सेट कर सकते हैं।

इस त्रुटि से छुटकारा पाने के लिए, हम निम्नलिखित उदाहरण देखते हैं:

if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

हम चर को इनिशियलाइज़ कर सकते हैं NULL उनके मूल्यों को निर्दिष्ट करने या उनका उपयोग से पहले हैं।

इसलिए, हम कोड को संशोधित कर सकते हैं:

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

यह किसी भी प्रोग्राम तर्क को परेशान नहीं करेगा और नोटिस का उत्पादन नहीं करेगा भले ही $test मूल्य नहीं होने पर ।

इसलिए, मूल रूप से, यह हमेशा विकास के लिए त्रुटि रिपोर्टिंग को सेट करने के लिए बेहतर है।

और सभी त्रुटियों को ठीक करें।

और उत्पादन पर, त्रुटि रिपोर्टिंग बंद की जानी चाहिए।


-1

वे नोटिस इसलिए हैं क्योंकि आपके पास उपयोग किए गए चर नहीं हैं definedऔर my_indexकुंजी मौजूद नहीं थी$my_array चर ।

उन नोटिसों को हर बार ट्रिगर किया गया था, क्योंकि आपके code सही नहीं है, लेकिन शायद आपके पास नोटिसों की रिपोर्टिंग नहीं थी।

बग को हल करें:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

इसे बाहर निकालने का दूसरा तरीका:

ini_set("error_reporting", false)

-2

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

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

सरल व्याख्या

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.