// 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 дня все еще застрял.
Ответы:
Присвойте результат
explode
переменной и передайте эту переменнуюend
:Проблема в том, что
end
требуется ссылка, потому что она изменяет внутреннее представление массива (т. Е. Делает текущий указатель элемента на последний элемент).Результат
explode('.', $file_name)
не может быть превращен в ссылку. Это ограничение в языке PHP, которое, вероятно, существует по причинам простоты.источник
error_reporting
. Насколько это безопасно?error_reporting
. Небезопасно слепо игнорировать ошибки. Отключениеerror_reporting
- это важный шаг к слепому игнорированию ошибок. В производственной средеdisplay_errors
вместо этого отключите и запишите ошибки в файл журнала.Php 7-совместимое правильное использование:
источник
@
делает префикс?Все остальные уже сообщили вам причину, по которой вы получаете ошибку, но вот лучший способ сделать то, что вы хотите сделать:
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
источник
сохранить массив из explode () в переменную, а затем вызвать end () для этой переменной:
кстати: я использую этот код, чтобы получить расширение файла:
где
strrchr
извлекает строку после последней.
иsubstr
обрезает.
источник
Попробуй это:
Причина в том, что аргумент для
end
передается по ссылке, так какend
модифицирует массив путем перемещения его внутреннего указателя на последний элемент. Если вы не передаете переменную, нет ничего для ссылки, на которую можно указать.Смотрите
end
в руководстве PHP для получения дополнительной информации.источник
PHP жалуется, потому что
end()
ожидает ссылку на что-то, что он хочет изменить (который может быть только переменной). Однако вы передаете результатexplode()
напрямую,end()
не сохраняя его сначала в переменной. В тот момент, когдаexplode()
возвращается ваше значение, оно существует только в памяти и ни одна переменная не указывает на него. Вы не можете создать ссылку на что-то (или что-то неизвестное в памяти), которое не существует.Или другими словами: PHP не знает, является ли значение, которое вы ему даете, является прямым значением или просто указателем на значение (указатель также является переменной (целым числом), в которой хранится смещение памяти, где находится фактическое значение проживает). Так что PHP ожидает здесь указатель (ссылку) всегда.
Но поскольку в PHP 7 это все еще просто уведомление (даже не рекомендуется), вы можете спокойно игнорировать уведомления и использовать оператор игнорирования вместо полной деактивации отчетов об ошибках для уведомлений:
источник
explode
во временной переменной, как написали здесь другие. Но опять же: это не ошибка, поэтому можно использовать этот оператор. PHP обычно плохо обрабатывает ошибки. Поэтому я бы предложил использоватьset_error_handler
иset_exception_handler
для обработки ошибок и как самое чистое решение.Так же, как вы не можете сразу индексировать массив, вы также не можете вызвать end для него. Сначала назначьте его переменной, затем вызовите end.
источник
end(...[explode('.', $file_name)])
работает с PHP 5.6. Это задокументировано в RFC, но не в самих документах PHP.источник
Поскольку он поднимает флаг более 10 лет, но работает просто отлично и возвращает ожидаемое значение, маленький оператор stfu - это самая плохая практика, которую вы все ищете:
источник
Официальное руководство по PHP: end ()
параметры
Массив. Этот массив передается по ссылке, потому что он модифицируется функцией. Это означает, что вы должны передавать ей реальную переменную, а не функцию, возвращающую массив, потому что только реальные переменные могут быть переданы по ссылке.
источник
Во-первых, вам нужно будет сохранить значение в такой переменной, как эта
Затем вы можете использовать функцию конца, чтобы получить последний индекс из массива, как это
Я надеюсь, что это будет работать для вас.
источник
источник