2011-01-08 3 views
146
// 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 дня все еще застрялиТолько переменные должны быть переданы по ссылке

ответ

306

Присвоить результат explode переменной и передать эту переменную end:

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

Проблема заключается в том, что end требует ссылки, потому что он изменяет внутреннее представление массива (т.е. он делает указатель текущего элемента указывает на последний элемент).

Результат explode('.', $file_name) не может быть заменен ссылкой. Это ограничение на языке PHP, которое, вероятно, существует по причинам простоты.

+10

Спасибо так очень много. Решила мою проблему. –

+0

@Oswald. Мы можем отключить предупреждение, используя 'error_reporting'. Безопасно ли это? – Pacerier

+3

Безопасно отключить 'error_reporting'. Нельзя слепо игнорировать ошибки. Отключение 'error_reporting' является важным шагом к слепому игнорированию ошибок. В рабочей среде вместо этого отключите 'display_errors' и напишите ошибки в файл журнала. – Oswald

13

сохранить массив из взрываются() переменной, а затем вызвать конец() этой переменной:

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

BTW: Я использую этот код, чтобы получить расширение файла:

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

где strrchr извлекает строку после последнего . и substr отсекает .

6

Попробуйте это:

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

Причина заключается в том, что аргумент end передается по ссылке, поскольку end изменяет массив, выдвигая его внутренний указатель на конечный элемент. Если вы не передаете переменную, нет ничего, на что ссылаться.

См. end в руководстве по PHP для получения дополнительной информации.

3

Так же, как вы не можете сразу индексировать массив, вы также не можете называть его. Сначала назначьте его переменной, а затем вызовите конец.

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

Все остальные уже дал вам причину, вы получаете сообщение об ошибке, но вот лучший способ сделать то, что вы хотите сделать: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);

+0

yup, что сработало отлично. –

+1

Согласен. Нет смысла использовать строковые манипуляции для анализа путей к файлам, когда у вас есть соответствующие API-интерфейсы для этого. – gd1

46

Php 7 совместимую надлежащего использования:

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

echo $fileExtension; 
// jpg 
+2

Странно. Это работает, но как? Предотвращает ли это предупреждение, аналогичное тому, что делает префикс '@'? –

+1

@NigelAlderton Нет, он не подавляет ошибки, такие как '@'. Попробуйте '$ test = end ((explode ('.', Array ('Error!'))));' [Example] (http://sandbox.onlinephpfunctions.com/code/3ed64996b6456710ba03e6af60d5b8d658eec76c) –

+6

Итак, почему добавление дополнительная скобка удаляет ошибку? –

-1

PHP Offical Руководство: конец()

Параметры

array 

Массив. Этот массив передается по ссылке, потому что он модифицируется функцией. Это означает, что вы должны передать ему реальную переменную, а не функцию, возвращающую массив, потому что только фактические переменные могут передаваться по ссылке.

+2

Сделайте цитату из официального руководства, не переписывайте своими руками. Также подумайте, чтобы ваш ответ был лучше, чем существующий. –

-1

$ file_extension = end (explode ('.', $ file_name)); // ОШИБКА НА ЭТОЙ

изменение этой линии, как,

$ file_extension = конец ((взрываются (, $ file_name)) ''); // нет ошибок

Техника проста пожалуйста положил еще одну скобки для взрываются,

(взрываются()), то только он может выполнять самостоятельно ..

+3

Это не работает в PHP 7 –

1

PHP жалуется, потому что end() ожидает ссылка на то, что она хочет изменить (которая может быть только переменной). Однако вы передаете результат explode() непосредственно на end(), не сохраняя его сначала. В тот момент, когда explode() возвращает ваше значение, оно существует только в памяти и без переменных указывает на него. Вы не можете создать ссылку на что-то (или на что-то неизвестное в памяти), которое не существует.

Или другими словами: PHP не знает, если значение, которое вы ему даете, является прямым значением или просто указателем на значение (указатель также является переменной (integer), которая хранит смещение памяти, где находится фактическое значение). Поэтому PHP всегда ожидает указатель (ссылку).

Но поскольку это все еще только уведомление (даже не рекомендуется) в PHP 7, вы можете Савелию игнорировать уведомления и использовать игнорирования-оператор вместо полного отключения отчета об ошибках для уведомлений:

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

Вы не должны скрывать ошибку. –

+1

@ OskarCalvo Это тоже моя философия. Но это не ошибка. PHP рассматривает это как «уведомление».И это было альтернативное «решение» других ответов здесь, о которых никто не упоминал. Лучше всего было бы сохранить значение 'explode' во временную переменную, как и другие. Но опять же: это не ошибка, поэтому вполне нормально использовать этот оператор. Обычно PHP плохо справляется с обработкой ошибок. Поэтому я бы предложил использовать 'set_error_handler' и' set_exception_handler' для обработки ошибок и как самое чистое решение. – wizard

Смежные вопросы