ये क्यों हो रहा है?
समय के साथ, PHP एक अधिक सुरक्षा-केंद्रित भाषा बन गई है। डिफ़ॉल्ट रूप से बंद की जाने वाली सेटिंग अब डिफ़ॉल्ट रूप से चालू हो जाती हैं। इसका एक आदर्श उदाहरण है E_STRICT
, जो PHP 5.4.0 के रूप में डिफ़ॉल्ट रूप से चालू हो गया है ।
इसके अलावा, PHP प्रलेखन के अनुसार, डिफ़ॉल्ट रूप से, E_NOTICE
php.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 के बाहर प्रलेखित नहीं है, इसलिए मैंने अन्य वितरणों पर इसे मान्य नहीं किया है।
हालाँकि, आपके प्रश्न का उत्तर देने के लिए, यह त्रुटि तब सामने आती है जब यह पहले से पॉप अप नहीं होती थी:
आपने PHP स्थापित किया है और नई डिफ़ॉल्ट सेटिंग्स कुछ हद तक खराब दस्तावेज हैं, लेकिन बाहर न करें E_NOTICE
।
E_NOTICE
अपरिभाषित चर और अपरिभाषित अनुक्रमित जैसे चेतावनी वास्तव में आपके कोड को क्लीनर और सुरक्षित बनाने में मदद करते हैं। मैं आपको बता सकता हूं कि, वर्षों पहले, E_NOTICE
सक्षम रखने से मुझे अपने चर घोषित करने के लिए मजबूर होना पड़ा। इसने C को सीखना बहुत आसान बना दिया, घोषित नहीं किया गया कि चर एक उपद्रव से बहुत बड़ा है।
मैं इसमें क्या कर सकता हूँ?
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, आदि चला रहा है। यह अनुशंसित तरीका नहीं है, लेकिन यदि आपके पास विरासत कोड है जो कि जा रहा है। संपादित करना अत्यधिक कठिन हो सकता है, फिर यह आपकी सबसे अच्छी शर्त हो सकती है।
E_NOTICE
फ़ाइल या फ़ोल्डर स्तर को बंद करें । यदि आप कुछ विरासत कोड रखते हैं तो यह बेहतर हो सकता है लेकिन अन्यथा "सही" तरीके से काम करना चाहते हैं। ऐसा करने के लिए, आपको Apache2, Nginx, या जो भी आपकी पसंद का सर्वर है, से परामर्श करना चाहिए। अपाचे में, आप php_value
अंदर का उपयोग करेंगे <Directory>
।
क्लीनर होने के लिए अपने कोड को फिर से लिखें। यदि आप ऐसा करने की जरूरत है, जबकि एक उत्पादन वातावरण में जाने या आपके त्रुटियों को देखने के लिए किसी को नहीं करना चाहता, सुनिश्चित करें कि आप त्रुटियों के किसी भी प्रदर्शन अक्षम कर रहे हैं, और केवल बनाने के प्रवेश करने के लिए अपने त्रुटियों (देखें 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
इन दिनों एक व्यक्ति से अधिक हूं :)।