// 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'
);
Ada ide? Setelah 2 hari masih macet.
Jawaban:
Tetapkan hasil dari
explode
ke variabel dan meneruskan variabel itu keend
:Masalahnya adalah, yang
end
memerlukan referensi, karena memodifikasi representasi internal array (yaitu membuat pointer point elemen saat ini ke elemen terakhir).Hasil dari
explode('.', $file_name)
tidak dapat diubah menjadi referensi. Ini adalah batasan dalam bahasa PHP, yang mungkin ada karena alasan kesederhanaan.sumber
error_reporting
. Apakah aman untuk melakukannya?error_reporting
. Tidak aman untuk mengabaikan kesalahan secara membabi buta. Mematikanerror_reporting
adalah langkah besar menuju mengabaikan kesalahan secara membabi buta. Di lingkungan produksi, matikandisplay_errors
saja, dan tulis kesalahan ke file log.Php 7 penggunaan yang tepat dan kompatibel:
sumber
@
awalan lakukan?Semua orang telah memberi Anda alasan Anda mendapatkan kesalahan, tetapi inilah cara terbaik untuk melakukan apa yang ingin Anda lakukan:
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
sumber
simpan array dari explode () ke variabel, lalu panggil end () pada variabel ini:
btw: Saya menggunakan kode ini untuk mendapatkan ekstensi file:
di mana
strrchr
mengekstraksi string setelah yang terakhir.
dansubstr
memotong.
sumber
Coba ini:
Alasannya adalah bahwa argumen untuk
end
dilewatkan dengan referensi, karenaend
memodifikasi array dengan memajukan pointer internal ke elemen terakhir. Jika Anda tidak meneruskan variabel, tidak ada referensi untuk menunjuk ke.Lihat
end
di manual PHP untuk info lebih lanjut.sumber
PHP mengeluh karena
end()
mengharapkan referensi ke sesuatu yang ingin diubah (yang bisa menjadi variabel saja). Namun Anda meneruskan hasilexplode()
langsung keend()
tanpa menyimpannya ke variabel terlebih dahulu. Saatexplode()
mengembalikan nilai Anda, nilai itu hanya ada di memori dan tidak ada titik variabel yang menunjukkannya. Anda tidak dapat membuat referensi ke sesuatu (atau ke sesuatu yang tidak dikenal dalam memori), yang tidak ada.Atau dengan kata lain: PHP tidak tahu, apakah nilai yang Anda berikan kepadanya adalah nilai langsung atau hanya sebuah penunjuk ke nilai (sebuah penunjuk juga merupakan variabel (integer), yang menyimpan offset memori, di mana nilai aktualnya berada). Jadi PHP selalu mengharapkan pointer (referensi) di sini.
Tetapi karena ini masih hanya pemberitahuan (bahkan tidak ditinggalkan) di PHP 7, Anda dapat mengabaikan pemberitahuan dan menggunakan operator pengabaian alih-alih menonaktifkan pelaporan kesalahan untuk pemberitahuan:
sumber
explode
ke variabel sementara, seperti yang lain-lain tulis di sini. Tetapi sekali lagi: Ini bukan kesalahan, jadi tidak apa-apa menggunakan operator ini. PHP umumnya buruk dalam penanganan kesalahan. Karena itu saya akan menyarankan untuk menggunakanset_error_handler
danset_exception_handler
untuk penanganan kesalahan dan sebagai solusi terbersih.Sama seperti Anda tidak dapat segera mengindeks array, Anda juga tidak dapat memanggilnya. Tetapkan itu ke variabel terlebih dahulu, lalu panggil akhir.
sumber
end(...[explode('.', $file_name)])
telah bekerja sejak PHP 5.6. Ini didokumentasikan dalam RFC meskipun tidak dalam dokumen PHP sendiri.sumber
Karena mengibarkan bendera selama lebih dari 10 tahun, tetapi berfungsi dengan baik dan mengembalikan nilai yang diharapkan, operator stfu kecil adalah praktik buruk terbaik yang Anda semua cari:
sumber
Manual resmi PHP: end ()
Parameter
Array. Array ini dilewatkan oleh referensi karena dimodifikasi oleh fungsi. Ini berarti Anda harus memberikannya variabel nyata dan bukan fungsi yang mengembalikan array karena hanya variabel aktual yang dapat dilewatkan oleh referensi.
sumber
Pertama, Anda harus menyimpan nilai dalam variabel seperti ini
Kemudian Anda bisa menggunakan fungsi akhir untuk mendapatkan indeks terakhir dari array seperti ini
Saya harap ini akan berhasil untuk Anda.
sumber
sumber