Sadece değişkenler referans ile geçilmelidir


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'
);

Herhangi bir fikir? 2 gün sonra hala sıkışmış.


Yanıtlar:


515

Sonucunu explodebir değişkene atayın ve bu değişkeni şuraya iletin end:

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

Sorun, endbaşvuru gerektiren bir dizidir, çünkü dizinin iç temsilini değiştirir (yani, geçerli öğe işaretçisini yapar noktasını son öğeye çevirir).

Sonucu explode('.', $file_name)kutu değil referans dönüştürülebilir. Bu, PHP dilinde, muhtemelen basitlik nedeniyle var olan bir kısıtlamadır.


12
Çok teşekkürler. Sorunumu çözdüm.
Frank Nwoko

1
@ Oswald, kullanarak uyarıyı kapatabiliriz error_reporting. Bunu yapmak güvenli mi?
Pacerier

9
Kapatmak güvenlidir error_reporting. Hataları körü körüne göz ardı etmek güvenli değildir. Kapatmak error_reportinghataları körü körüne görmezden gelmek için önemli bir adımdır. Üretim ortamında, display_errorsbunun yerine kapatın ve hataları bir günlük dosyasına yazın.
Oswald

Çalışmıyor. Aşağıdaki cevap - çift parantez - işe yarıyor.
bbe

Teşekkür ederim, bana çok zaman kazandırın!
simon

52

Php 7 uyumlu uygun kullanım:

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

echo $fileExtension;
// jpg

3
Tuhaf. İşe yarıyor ama nasıl? Ön ekin yaptığı gibi uyarıyı bastırıyor mu @?
Nigel Alderton

6
Peki fazladan bir parantez eklemek hatayı neden kaldırıyor?
Nigel Alderton

8
Bu tuhaflığı araştırdım ve bir hata gibi görünüyor ? ile php ayrıştırıcı çift parantez "(())" referansı neden olan bir düz değerine dönüştürülüp. Bu bağlantı hakkında daha fazla bilgi .
Callistino

26
Bunu beğendim .. ama aynı zamanda hoşlanmıyorum. Benim gün mahvettiğin için teşekkürler :-)
billynoah

4
Php7 uyarı hala verilecektir. php.net/manual/tr/…
kosta

49

Diğer herkes size bir hata alma nedeninizi zaten verdi, ancak yapmak istediğinizi yapmanın en iyi yolu: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);


1
Katılıyorum. Uygun API'lara sahip olduğunuzda dosya yollarını ayrıştırmak için dize manipülasyonunu kullanmanın bir anlamı yoktur.
gd1

18

diziyi explode () öğesinden bir değişkene kaydedin ve sonra bu değişken üzerinde end () öğesini çağırın:

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

btw: Dosya uzantısını almak için bu kodu kullanıyorum:

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

nerede strrchrson sonra dize ayıklar .ve substrkapalı kesikler.


9

Bunu dene:

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

Bunun nedeni, argümanının endreferans olarak geçmesidir, çünküend iç işaretçisini son öğeye ilerleterek diziyi değiştirdiğinden, . Bir değişkeni içeri aktarmıyorsanız, referans gösterilecek hiçbir şey yoktur.

Daha endfazla bilgi için PHP kılavuzuna bakın .


8

PHP end(), değiştirmek istediği bir şeye (yalnızca değişken olabilir) bir başvuru beklediğinden şikayet ediyor. Ancak, sonucu explode()doğrudan end()bir değişkene kaydetmeden iletirsiniz . Şu andaexplode()Değerinizi döndürdüğünüz , yalnızca bellekte bulunur ve değişkene işaret etmez. Var olmayan bir şeye (veya bellekte bilinmeyen bir şeye) başvuru oluşturamazsınız.

Veya başka bir deyişle: PHP, verdiğiniz değer doğrudan değer veya değerin yalnızca bir işaretçisi ise (işaretçi de belleğin ofsetini depolayan bir değişken (tamsayı) olup, gerçek değerin bulunduğu). PHP burada her zaman bir işaretçi (referans) bekliyor.

Ancak bu hala PHP 7'de bir bildirim (kullanımdan kaldırılmamış) olduğundan, bildirimleri göz ardı edebilir ve bildirimler için hata raporlamasını tamamen devre dışı bırakmak yerine ignore-operatörünü kullanabilirsiniz:

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

3
@OskarCalvo Bu da benim felsefem. Ancak bu bir hata değildir - PHP bunu bir "uyarı" olarak kabul eder. Ve buradaki diğer cevaplara alternatif bir "çözüm" idi, kimsenin doğrudan bahsetmediği. explodeDiğerlerinin burada yazdığı gibi, geçici bir değişkenin değerini kaydetmek daha iyi bir yol olabilir . Ama yine: Bu bir hata değil, bu yüzden bu operatörü kullanmakta sorun yok. PHP hata işleme konusunda genellikle kötüdür. Bu yüzden kullanımına öneririm set_error_handlerve set_exception_handlerhata işleme için ve en temiz çözüm olarak.
sihirbaz

4

Diziyi hemen dizine ekleyemediğiniz gibi, diziyi de sonlandıramazsınız. Öncelikle bir değişkene atayın, sonra sonlandırın.

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

4

end(...[explode('.', $file_name)])PHP 5.6'dan beri çalışmaktadır. PHP belgelerinde değil RFC'de belgelenmiştir .


2

10 yıldan fazla bir bayrak kaldırdığı için, ama gayet iyi çalışıyor ve beklenen değeri döndürdüğü için, biraz stfu operatörü stfu , aradığınız en iyi kötü uygulamadır:

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

0

PHP resmi Kılavuzu: end ()

Parametreler

array

Dizi. Bu dizi, işlev tarafından değiştirildiği için başvuru ile iletilir. Diğer bir deyişle, gerçek bir değişkeni, bir dizi döndüren bir işlevi değil, gerçek değişkeni iletmeniz gerekir, çünkü yalnızca gerçek değişkenler referans olarak iletilebilir.


3
Resmi el kitabından bir teklif yapın, kendi ellerinizle yeniden yazmayın. Ayrıca, cevabınızı mevcut olandan daha iyi yapmayı düşünün.
Victor Polevoy

-1

İlk olarak, değeri böyle bir değişkende saklamanız gerekecektir.

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

Sonra böyle bir diziden son dizini almak için end işlevini kullanabilirsiniz.

echo end($value);

Umarım senin için çalışır.


-3

$ file_extension = end (patla ('.', $ dosya_adı)); // BU HATTA HATA

bu satırı şu şekilde değiştir:

$ file_extension = end ( (patlayabilir ('.', $ dosya_adı)) ); //hata yok

Teknik basittir lütfen patlamak için bir tane daha parantez koyun,

(patlayabilir ()) , o zaman sadece bağımsız olarak çalışabilir ..

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.