2009-11-25 11 views
5

मैं अपने PHP dev सेटअप पर त्रुटि दमन ऑपरेटर का खुशी से उपयोग कर रहा हूं। 35त्रुटि दमन @ काम नहीं कर रहा

Notice: Uninitialized string offset: 0 in C:\websites\xxx\htdocs\includes\myscript.php on line 35

पंक्ति:: लेकिन हाल ही में तो जैसे नोटिस से मारा है मिल गया

$file_name = @$File['file_name'];

मैं पर display_errors है, और 6143 (E_ALL) के लिए सेट error_reporting।

क्या मुझे कुछ याद आ रही है? त्रुटि को दबाया नहीं जाना चाहिए?

संपादित करें:

कुंवारी लिपि में परीक्षण किया गया:

 
$a = array(); 
$b = @$a['f5']; 

त्रुटि को दबा दिया। तो मुझे लगता है कि हम किसी भी तरह त्रुटि_ रिपोर्टिंग मूल्य बदल रहे हैं। (11 पर फिल्म)

यार सहायता के लिए Thx।

+1

क्या आप लाइन 35 पोस्ट कर सकते हैं? –

+0

ऐसा लगता है कि आप गलत कथन दबा रहे हैं। कृपया कोड –

+0

प्रदान करें सभी कोड दिखाएं, किसी भी लाइन में हो सकते हैं। – Cesar

उत्तर

5

फेंकने वाली स्क्रिप्ट या उदाहरणों को छोड़कर त्रुटि दमन का एक बड़ा प्रशंसक नहीं है जहां वास्तव में कोई त्रुटि पकड़ने का कोई अच्छा तरीका नहीं है।

मुझे Uninitialized string offset त्रुटि के व्यवहार की व्याख्या करने दें।यह एक बग नहीं है:

उदाहरण # 1

$a = 0; 
$b = $a['f5']; 

$a एक अंकीय अदिश मूल्य है। दूसरी पंक्ति में PHP अंतर्निहित रूप से इस संख्यात्मक मान को एक स्ट्रिंग में कास्टिंग कर रहा है। स्ट्रिंग '0' की लंबाई 1.

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

$s= 'abcd'; 
print_r($s[1]); 

इस कोड के उत्पादन में b हो जाएगा के रूप में यह स्ट्रिंग में दूसरा चरित्र है। उदाहरण में # 1 लुकअप 'f5' को किसी संख्या में परिवर्तित किया जा रहा है क्योंकि तारों को केवल वर्ण की स्थिति द्वारा अनुक्रमित किया जा सकता है। echo intval('f5'); हमें दिखाता है कि PHP 'f5' स्ट्रिंग को 0 के रूप में एक संख्यात्मक संदर्भ में व्याख्या करता है।

मेरे साथ अब तक? यहाँ 2

$a = ''; 
$b = $a['f5']; 

$a शून्य लंबाई स्ट्रिंग है जब हम उदाहरण # 2

उदाहरण # करने के लिए इस पर लागू क्या होता है। दूसरी पंक्ति $b= $a[0]; के समान है - यानी, दूसरी पंक्ति शून्य-लंबाई स्ट्रिंग के पहले वर्ण के लिए पूछ रही है, लेकिन स्ट्रिंग में कोई वर्ण नहीं है। तो पीएचपी निम्न त्रुटि फेंकता है, जिससे आप जान सकेंगे सूचकांक बस मौजूद नहीं है:

Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 

ये एक शिथिल टाइप किया भाषा में प्रोग्रामिंग के कठिन दस्तक देता है।

+0

एक स्पष्ट और संक्षिप्त स्पष्टीकरण के लिए Thx, pygorex1। – NotoriousWebmaster

-3

नहीं, @ सप्रेसर फ़ंक्शन कॉल से चेतावनियां दिखाता है, परिवर्तनीय पहुंच और घोषणा नहीं करता है। Notice आपको बता रहा है कि आप एक स्ट्रिंग तत्व [0] तक पहुंच रहे हैं जिसे परिभाषित नहीं किया गया है, इस प्रकार प्रारंभ नहीं किया गया है। यदि आप इन्हें दबाना चाहते हैं, तो सभी अनियमित वैरिएबल की जांच करने का प्रयास करें और उन्हें एक मान दें, क्योंकि आप इसे सी

+2

मैनुअल आपके साथ असहमत है, डेरेक: http://ca.php.net/manual/en/language.operators.errorcontrol.php – NotoriousWebmaster

1

से जोड़ सकते हैं क्योंकि त्रुटि में 0 की स्ट्रिंग ऑफसेट शामिल है, यह लाइन पर लागू नहीं होना चाहिए प्रदान किए गए कोड का। कोई पूर्णांक ऑफ़सेट नहीं है; आप वहाँ 'file_name' स्ट्रिंग का उपयोग कर रहे हैं।

इसके अलावा, '@' का उपयोग करना वास्तव में एक भयानक विचार है। कार्य विफल हो सकते हैं, जिससे स्क्रिप्ट को बिल्कुल संकेत नहीं मिलता है कि कहां या क्यों। एक बेहतर तरीका कोड आप चिपकाया है की लाइन को संभालने के लिए यह है:

if (isset($File['file_name'])) { 
    $file_name = $File['file_name']; 
} else { 
    // throw exception, return FALSE, print an error and exit, whatever 
} 
+0

मैं आमतौर पर उपयोग करता हूं ($ isset ($ file [' file_name '])? $ फ़ाइल [' file_name ']:' ')। लेकिन मुझे इंडेक्स इश्यू पर आपके साथ असहमत होना पड़ेगा: ऐसा लगता है कि मैं PHP का संस्करण (5.2.2) का उपयोग कर रहा हूं। मैंने जो उत्तर दिया है उसे देखें। – NotoriousWebmaster

+0

विचित्र। सर उठाने के लिए धन्यवाद। –

0

ठीक है, यहाँ बात है: पीएचपी गैर सरणी वार्स के लिए सबस्क्रिप्ट साथ अच्छी तरह से निपटने के नहीं है। उदाहरण के लिए:

 
$a = 0; 
$b = $a['f5']; 

कोई त्रुटि उत्पन्न नहीं करता है।

जबकि:

 
$a = ''; 
$b = $a['f5']; 

इस त्रुटि उत्पन्न करता है:

 
Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 

और वह समस्या मैं हो रही थी है। अगर मैं इसे एरे() के साथ $ a प्रारंभ करने के लिए चारों ओर स्विच करता हूं, तो त्रुटि दमन काम करता है। इसके अलावा, त्रुटि दमन के बिना यह त्रुटि में उचित सूचकांक देता है।

मुझे संदेह है कि यह PHP 5.2.2 में एक बग है। क्या कोई इसे अधिक अद्यतित संस्करण में जांच सकता है?

आपकी मदद के लिए Thx।

+0

जब आप "PHP में एक बग" कहते हैं ... आप कोड के पहले बिट के बारे में बात कर रहे हैं जो त्रुटि उत्पन्न नहीं कर रहा है, है ना? आपको अन्य कोड से प्राप्त त्रुटि पूरी तरह मान्य है। – DisgruntledGoat

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