केवल चर संदर्भ द्वारा पारित किया जाना चाहिए


246
// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
    0=>'There is no error, the file uploaded with success',
    1=>'The uploaded file exceeds the upload max filesize allowed.',
    2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
    3=>'The uploaded file was only partially uploaded',
    4=>'No file was uploaded',
    6=>'Missing a temporary folder'
);

कोई विचार? 2 दिन बाद भी फंसे रहे।


जवाबों:


515

explodeएक चर के परिणाम को असाइन करें और उस चर को endनिम्न में पास करें :

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

समस्या यह है कि endएक संदर्भ की आवश्यकता है, क्योंकि यह सरणी के आंतरिक प्रतिनिधित्व को संशोधित करता है (अर्थात यह वर्तमान तत्व सूचक को अंतिम तत्व बनाता है )।

परिणाम को explode('.', $file_name)संदर्भ में नहीं बदला जा सकता है। यह PHP भाषा में एक प्रतिबंध है, जो संभवतः सादगी कारणों से मौजूद है।


12
बहुत - बहुत धन्यवाद। मेरी समस्या का समाधान किया।
फ्रैंक नमोको

1
@Oswald, हम चेतावनी को बंद कर सकते हैं error_reporting। क्या ऐसा करना सुरक्षित है?
पचेरियर

9
इसे बंद करना सुरक्षित है error_reporting। त्रुटियों को आँख बंद करके अनदेखा करना सुरक्षित नहीं है। बंद करने से error_reportingआँख बंद करके त्रुटियों अनदेखी की दिशा में एक बड़ा कदम है। उत्पादन परिवेश में, display_errorsइसके बजाय बंद करें , और लॉग फ़ाइल में त्रुटियां लिखें।
ओसवाल्ड

काम नहीं कर रहा। नीचे दिए गए उत्तर - डबल कोष्ठक - काम करता है।
bbe

धन्यवाद, मुझे बहुत समय बचाओ!
सिमोन

52

Php 7 संगत उचित उपयोग:

$fileName      = 'long.file.name.jpg';
$tmp           = explode('.', $fileName);
$fileExtension = end($tmp);

echo $fileExtension;
// jpg

3
अजीब। वह काम करता है लेकिन कैसे? क्या यह चेतावनी को दबाता है, @उपसर्ग के समान है?
निगेल एल्डर्टन

6
तो एक अतिरिक्त कोष्ठक जोड़ने से त्रुटि क्यों दूर होती है?
निगेल एल्डर्टन

8
मैंने इस विचित्रता पर शोध किया और यह एक बग लगता है ? साथ php पार्सर जहां डबल कोष्ठक "(())" संदर्भ का कारण बनता है एक सादे मूल्य के लिए परिवर्तित किया। इस पर अधिक लिंक
कालिस्टिनो

26
मुझे यह पसंद है .. लेकिन मुझे यह पसंद नहीं है। मेरे दिन को बर्बाद करने के लिए धन्यवाद :-)
बिल्लोन्हा

4
Php7 में चेतावनी अभी भी जारी की जाएगी। php.net/manual/en/…
kosta

49

अन्य सभी ने आपको पहले ही कारण बता दिया है कि आपको एक त्रुटि मिल रही है, लेकिन यहाँ वह करने का सबसे अच्छा तरीका है जो आप करना चाहते हैं: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);


1
मैं सहमत हूँ। जब आप ऐसा करने के लिए उपयुक्त एपीआई रखते हैं, तो फ़ाइल पथ पार्स करने के लिए स्ट्रिंग हेरफेर का उपयोग करने का कोई मतलब नहीं है।
gd1

18

सरणी को एक चर में विस्फोट () से बचाएं, और फिर इस चर पर अंत () कॉल करें:

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

btw: मैं फाइल एक्सटेंशन पाने के लिए इस कोड का उपयोग करता हूं:

$ext = substr( strrchr($file_name, '.'), 1);

जहां strrchrपिछले के बाद स्ट्रिंग निकालता है .और substrकाट देता है.


9

इसे इस्तेमाल करे:

$parts = explode('.', $file_name);
$file_extension = end($parts);

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

endअधिक जानकारी के लिए PHP मैनुअल में देखें ।


8

PHP शिकायत करती है क्योंकि end()किसी चीज के संदर्भ की अपेक्षा करती है जिसे वह बदलना चाहती है (जो केवल एक परिवर्तनशील हो सकती है)। हालाँकि आप इसे explode()सीधे end()पहले एक चर में सहेजे बिना परिणाम देते हैं । फिलहाल जब आप explode()अपना मूल्य लौटाते हैं, तो यह केवल मेमोरी में मौजूद होता है और इसका कोई चर नहीं होता है। आप किसी चीज़ (या स्मृति में कुछ अज्ञात) का संदर्भ नहीं बना सकते, जो मौजूद नहीं है।

या दूसरे शब्दों में: PHP नहीं जानता है, यदि आप उसे जो मूल्य देते हैं, वह प्रत्यक्ष मूल्य है या मूल्य के लिए सिर्फ एक संकेतक है (एक सूचक भी एक चर (पूर्णांक) है, जो मेमोरी की ऑफसेट को संग्रहीत करता है, जहां वास्तविक मूल्य है बसता था)। तो PHP यहाँ एक सूचक (संदर्भ) हमेशा की उम्मीद है।

लेकिन चूंकि यह अभी भी PHP 7 में सिर्फ एक सूचना है (पदावनत भी नहीं), आप नोटिस को अनदेखा कर सकते हैं और नोटिस के लिए पूरी तरह से त्रुटि रिपोर्टिंग को निष्क्रिय करने के बजाय इग्नोर-ऑपरेटर का उपयोग कर सकते हैं:

$file_extension = @end(explode('.', $file_name));

3
@OskarCalvo यही मेरा दर्शन भी है। लेकिन यह एक त्रुटि नहीं है - PHP इसे "नोटिस" के रूप में मानता है। और यह यहां अन्य उत्तरों के लिए एक वैकल्पिक "समाधान" था, जिसका किसी ने सीधे उल्लेख नहीं किया। एक बेहतर तरीका explodeएक अस्थायी चर के मूल्य को बचाने के लिए होगा , जैसे अन्य लोगों ने यहां लिखा है। लेकिन फिर से: यह एक त्रुटि नहीं है, इसलिए इस ऑपरेटर का उपयोग करना ठीक है। PHP आमतौर पर एरर हैंडलिंग में खराब है। इसलिए मैं उपयोग करने set_error_handlerऔर set_exception_handlerत्रुटि से निपटने और सबसे साफ समाधान के रूप में उपयोग करने का सुझाव दूंगा।
विज़ार्ड

4

जैसे आप सरणी को तुरंत अनुक्रमित नहीं कर सकते, वैसे ही आप इस पर अंत भी नहीं कह सकते। इसे पहले एक वैरिएबल पर असाइन करें, फिर एंड को कॉल करें।

$basenameAndExtension = explode('.', $file_name);
$ext = end($basenameAndExtension);

4

end(...[explode('.', $file_name)])PHP 5.6 के बाद से काम किया है। यह RFC में प्रलेखित है, हालाँकि PHP डॉक्स में नहीं।


2

चूंकि यह 10 वर्षों के लिए एक झंडा उठाता है, लेकिन ठीक काम करता है और अपेक्षित मूल्य वापस करता है, एक छोटा सा स्टफ ऑपरेटर सबसे अच्छा बुरा अभ्यास है जिसे आप सभी के लिए देख रहे हैं:

$file_extension = @end(explode('.', $file_name));

0

PHP आधिकारिक मैनुअल: अंत ()

पैरामीटर

array

सरणी। इस सरणी को संदर्भ द्वारा पारित किया गया है क्योंकि यह फ़ंक्शन द्वारा संशोधित है। इसका मतलब यह है कि आपको इसे एक वास्तविक चर पास करना होगा न कि किसी सरणी को लौटाने वाला फ़ंक्शन क्योंकि केवल वास्तविक चर संदर्भ द्वारा पारित किए जा सकते हैं।


3
आधिकारिक मैनुअल से एक उद्धरण बनाएं, अपने हाथों से फिर से न लिखें। इसके अलावा, अपने उत्तर को मौजूदा से बेहतर बनाने के लिए विचार करें।
विक्टर पोल्वॉय

-1

सबसे पहले, आपको इस तरह से एक चर में मूल्य को स्टोर करना होगा

$value = explode("/", $string);

फिर आप अंतिम फ़ंक्शन का उपयोग इस तरह से एक सरणी से अंतिम सूचकांक प्राप्त करने के लिए कर सकते हैं

echo end($value);

मुझे उम्मीद है कि यह आपके लिए काम करेगा।


-3

$ file_extension = अंत (विस्फोट ('।, $ file_name)); // इस लाइन पर त्रुटि

इस पंक्ति को इस रूप में बदलें,

$ file_extension = end ( (विस्फोट। (।, $ file_name)) ); //त्रुटियाँ नहीं

तकनीक सरल है कृपया विस्फोट के लिए एक और कोष्ठक लगाएं,

(विस्फोट) () , तो केवल यह स्वतंत्र रूप से प्रदर्शन कर सकते हैं ..

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.