কেবল পরিবর্তনগুলি রেফারেন্স দ্বারা পাস করা উচিত should


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)একটি রেফারেন্সে রূপান্তরিত করা যায় না। এটি পিএইচপি ভাষায় একটি বিধিনিষেধ, এটি সম্ভবত সরলতার কারণে বিদ্যমান।


12
অনেক অনেক ধন্যবাদ। আমার সমস্যার সমাধান।
ফ্র্যাঙ্ক নভো 21

1
@ ওসওয়াল্ড, আমরা সতর্কতাটি ব্যবহার করে বন্ধ করতে পারি error_reporting। এটা কি নিরাপদ?
পেসারিয়ার

9
এটি বন্ধ করা নিরাপদ error_reporting। অন্ধভাবে ত্রুটিগুলি উপেক্ষা করা নিরাপদ নয়। বন্ধ error_reportingকরা ত্রুটি অন্ধভাবে উপেক্ষা করার দিকে একটি বড় পদক্ষেপ। উত্পাদনের পরিবেশে display_errorsপরিবর্তে বন্ধ করুন এবং লগ ফাইলে ত্রুটিগুলি লিখুন।
ওসওয়াল্ড

কাজ করছে না. নীচের উত্তর - ডাবল বন্ধনী - কাজ করে।
bbe

ধন্যবাদ, আমাকে অনেক সময় বাঁচাতে!
সাইমন

52

পিএইচপি 7 সুসংগত যথাযথ ব্যবহার:

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

echo $fileExtension;
// jpg

3
রহস্যময়। যে কাজ কিন্তু কিভাবে? @উপসর্গের মতো এটি কি সতর্কতা দমন করে?
নাইজেল অ্যাল্ডারটন

6
তাহলে কেন একটি অতিরিক্ত বন্ধনী যুক্ত করা ত্রুটিটি সরিয়ে দেয়?
নাইজেল অল্ডার্টন

8
আমি এই কৌতুক গবেষণা করেছি এবং এটি একটি বাগ হতে পারে বলে মনে হচ্ছে ? সঙ্গে পিএইচপি পার্সার যেখানে ডবল প্রথম বন্ধনী "(())" রেফারেন্স ঘটায় একটি প্লেইন মান রূপান্তরিত করবে। এই লিঙ্কে আরও
কলিস্টিনো

26
আমি এটি পছন্দ করি .. তবে একই সাথে আমি এটি পছন্দ করি না। আমার দিনটি নষ্ট করার জন্য ধন্যবাদ :-)
বিলিএনও

4
পিএইচপি 7 তে সতর্কতা জারি করা হবে। php.net/manual/en/…
কোস্টা

49

আপনার ত্রুটি হওয়ার কারণ অন্য সবাই ইতিমধ্যে আপনাকে জানিয়ে দিয়েছে তবে আপনি যা করতে চান তা করার এখানে সেরা উপায়: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);


1
আমি রাজী. আপনার যখন উপযুক্ত এপিআই আছে তখন ফাইল পাথ পার্স করার জন্য স্ট্রিং ম্যানিপুলেশন ব্যবহার করার কোনও অর্থ নেই।
gd1

18

বিস্ফোরিত () থেকে একটি ভেরিয়েবল এ অ্যারে সংরক্ষণ করুন, এবং তারপরে এই ভেরিয়েবল এ শেষ () কল করুন:

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

বিটিডব্লিউ: ফাইল এক্সটেনশান পেতে আমি এই কোডটি ব্যবহার করি:

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

যেখানে strrchrসর্বশেষের পরে স্ট্রিংটি বের করে .এবং substrবন্ধ করে দেয়.


9

এটা চেষ্টা কর:

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

কারণটি হ'ল আর্গুমেন্টটি endরেফারেন্স দ্বারা পাস হয়, যেহেতু endচূড়ান্ত উপাদানটির অভ্যন্তরীণ পয়েন্টারটিকে অগ্রসর করে অ্যারেটিকে সংশোধন করে। আপনি যদি কোনও ভেরিয়েবলটি পাস না করে থাকেন তবে নির্দেশ করার জন্য এখানে কিছুই নেই nothing

দেখুন endআরও তথ্যের জন্য পিএইচপি ম্যানুয়াল।


8

পিএইচপি অভিযোগ করে কারণ end()এটি এমন কোনও কিছুর একটি রেফারেন্স আশা করে যা এটি পরিবর্তন করতে চায় (যা কেবলমাত্র পরিবর্তনশীল হতে পারে)। তবে আপনি প্রথমে কোনও ভেরিয়েবল এ সংরক্ষণ না করে explode()সরাসরি ফলাফলটি পাস করেন end()। এই মুহুর্তে যখন explode()আপনার মানটি ফিরিয়ে দেয়, এটি কেবল স্মৃতিতে উপস্থিত থাকে এবং এটিতে কোনও পরিবর্তনশীল পয়েন্ট নেই। আপনি কোনও কিছুর (বা স্মৃতিতে কোনও অজানা) রেফারেন্স তৈরি করতে পারবেন না, এটি বিদ্যমান নেই।

বা অন্য কথায়: পিএইচপি জানে না, আপনি তাকে যে মূল্য দিয়েছেন তা হ'ল প্রত্যক্ষ মান বা মানটির জন্য কেবল একটি পয়েন্টার (পয়েন্টারটিও একটি পরিবর্তনশীল (পূর্ণসংখ্যা), যা মেমরির অফসেট সংরক্ষণ করে, যেখানে আসল মান বসবাস)। সুতরাং পিএইচপি সর্বদা এখানে একটি পয়েন্টার (রেফারেন্স) আশা করে।

তবে যেহেতু এটি এখনও পিএইচপি 7 এ কেবল একটি নোটিশ (এমনকি অবমানিতও নয়), আপনি বিজ্ঞপ্তিগুলি সংরক্ষণ করে অগ্রাহ্য করতে পারেন এবং নোটিশের জন্য সম্পূর্ণরূপে ত্রুটি প্রতিবেদন করার পরিবর্তে উপেক্ষা-অপারেটরটি ব্যবহার করতে পারেন:

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

3
@ অস্কারক্যালভো এটিও আমার দর্শন। তবে এটি কোনও ত্রুটি নয় - পিএইচপি এটি "বিজ্ঞপ্তি" হিসাবে বিবেচনা করে। এবং এটি এখানে অন্যান্য উত্তরের একটি বিকল্প "সমাধান" ছিল, যার প্রত্যক্ষভাবে এটি কেউ উল্লেখ করেনি। আরও ভাল উপায় explodeহ'ল অন্যেরা এখানে লেখার মতো একটি অস্থায়ী ভেরিয়েবলের মান সংরক্ষণ করা । তবে আবার: এটি কোনও ত্রুটি নয়, সুতরাং এই অপারেটরটি ব্যবহার করা ঠিক। পিএইচপি সাধারণত ত্রুটি পরিচালনার ক্ষেত্রে খারাপ। অতএব, আমি ব্যবহার সুপারিশ করবে set_error_handlerএবং set_exception_handlerত্রুটি পরিচালনা এবং পরিষ্কার সমাধান হিসেবে।
উইজার্ড

4

আপনি যেমন তাত্ক্ষণিকভাবে অ্যারেটিকে সূচক করতে পারেন না, আপনি এটিতে আর কল করতে পারবেন না। প্রথমে এটি একটি ভেরিয়েবলকে বরাদ্দ করুন, তারপরে শেষের দিকে কল করুন।

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

4

end(...[explode('.', $file_name)])পিএইচপি 5.6 থেকে কাজ করেছে worked এটি আরএফসিতে নথিভুক্ত করা হয়েছে যদিও তারা পিএইচপি ডক্সে নেই।


2

যেহেতু এটি 10 ​​বছরেরও বেশি সময় ধরে পতাকা উত্থাপন করে, তবে এটি ঠিক কাজ করে এবং প্রত্যাশিত মানটি ফিরিয়ে দেয়, একটি সামান্য স্টাফু অপারেটর হ'ল আপনি যা খুঁজছেন তার মধ্যে সবচেয়ে ভাল খারাপ অভ্যাস:

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

0

পিএইচপি অফিক্যাল ম্যানুয়াল: শেষ ()

পরামিতি

array

অ্যারে। এই অ্যারেটি রেফারেন্স দ্বারা পাস করা হয়েছে কারণ এটি ফাংশনটির মাধ্যমে সংশোধিত হয়েছে। এর অর্থ আপনাকে এটিকে একটি আসল পরিবর্তনশীলটি অবশ্যই পাস করতে হবে এবং কোনও অ্যারে ফেরত দেওয়ার কোনও ফাংশন নয় কারণ কেবলমাত্র আসল ভেরিয়েবলগুলি রেফারেন্স দ্বারা পাস হতে পারে।


3
অফিসিয়াল ম্যানুয়াল থেকে একটি উদ্ধৃতি তৈরি করুন, নিজের হাতে নতুন করে লিখুন না। এছাড়াও, আপনার উত্তরটি বিদ্যমান উত্তরগুলির চেয়ে আরও ভাল করার বিষয়ে বিবেচনা করুন।
ভিক্টর পোলেভয়

-1

প্রথমত, আপনাকে এই জাতীয় ভেরিয়েবলে সংরক্ষণ করতে হবে

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

তারপরে আপনি শেষ ফাংশনটি ব্যবহার করতে পারেন এর মতো অ্যারে থেকে শেষ সূচকটি পেতে

echo end($value);

আমি আশা করি এটি আপনার পক্ষে কাজ করবে।


-3

_ ফাইল_ এক্সটেনশন = শেষ (বিস্ফোরিত ('।', $ ফাইল_নাম)); // এই লাইনে ত্রুটি

এই লাইনটি হিসাবে পরিবর্তন করুন

_ ফাইল_ এক্সটেনশন = শেষ ( (বিস্ফোরণ ('।', $ ফাইল_নাম)) ); // কোনও ত্রুটি নেই

প্রযুক্তি সহজ, দয়া করে বিস্ফোরণের জন্য আরও একটি বন্ধনী রাখুন,

(বিস্ফোরিত ()) , তবে কেবলমাত্র এটি স্বাধীনভাবে সম্পাদন করতে পারে ..

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.