Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вывод переменной на экран
Форумы портала PHP.SU » » Вопросы новичков » Вывод переменной на экран

Страниц (1): [1]
 

1. Perun - 08 Мая, 2019 - 08:15:40 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  if(0==$_FILES['picture']['error']){
  2.  
  3.         $fileext = substr(strrchr($_FILES['picture']['name'], "."), 1);
  4.         if('jpg'!= $fileext&&'gif'!= $fileext&&'png'!= $fileext){
  5.             $err = 'The file extention is not allowed.<br>';
  6.         }
  7.         else
  8.             move_uploaded_file($_FILES['picture']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].$path.$_FILES['picture']['name']);
  9.         header("Location: ".$_SERVER['REQUEST_URI']);
  10.     }

Далее, в разметке вывод переменной:


Если через сессионную переменную - работает, если через обычную переменную $err - не выводится на экран. Почему? Обычный echo в этом месте работал, но я добавил переадресацию, а перед отправкой заголовков выводить на экран ничего нельзя.. Попробовал записывать в обычную переменную $-err - не выводится на экран. Попробовал через сессионную переменную - работает.
Ну и попутно вопросы - как более адекватно(коротко, просто) записать конструкцию if(isset($_err)) echo $_err;? Через тернарный оператор есть варианты? NULL объединение тут вроде не подходит?

Ну и я так понимаю, что так проверять тип файлов не совсем корректно, Есть стандартные средства проверить какого типа файл? gif, txt, jpg и т.п.
2. Строитель - 08 Мая, 2019 - 08:31:37 - перейти к сообщению
Perun пишет:
Если через сессионную переменную - работает, если через обычную переменную $err - не выводится на экран. Почему? Обычный echo в этом месте работал, но я добавил переадресацию, а перед отправкой заголовков выводить на экран ничего нельзя..

$err и $_err - разные переменные, но причина даже не в этом, а именно в редиректе. Если использовать header("Location: ".$_SERVER['REQUEST_URI']);, и хотеть видеть текст ошибки, то без сессий не обойтись, т.к. после переадресации скрипт обнуляет post-переменные, а сессионные переменные будут сохранены до принудительного удаления (или до закрытия браузера).
Perun пишет:
Ну и попутно вопросы - как более адекватно(коротко, просто) записать конструкцию if(isset($_err)) echo $_err;? Через тернарный оператор есть варианты? NULL объединение тут вроде не подходит?
Если только для вывода значения переменной, то можно так
Но если в зависимости от значения переменной $_err нужно выполнять какие-то действия (код в несколько строк), то оператор if () {} тут как раз и нужен.
(Добавление)
И ещё - для определения расширения есть штатные инструменты:
PHP:
скопировать код в буфер обмена
  1. $fileExt = pathinfo($_FILES['picture']['name'], PATHINFO_EXTENSION);
3. Perun - 08 Мая, 2019 - 08:44:09 - перейти к сообщению
С подчеркиванием-опечатки. Действительно, проблема не в этом. И ведь рассматривал же вариант обнуления переменных. Опять по невнимательности упустил из виду..

Про запись в тернарном операторе пустых кавычек, помню где то ругали за такую запись, что это типа не корректно. Я так делал раньше.
4. Perun - 08 Мая, 2019 - 15:52:18 - перейти к сообщению
Строитель пишет:
для определения расширения

Да, это проще, чем разбирать имя/расширение через строковые функции, но кроме этого, больше вопрос в том, чтобы проверить, реально ли допустим файл с расширением jpg - картинка. Можно же любому файлу дать любое расширение.
5. Строитель - 08 Мая, 2019 - 17:59:22 - перейти к сообщению
Perun пишет:
вопрос в том, чтобы проверить, реально ли допустим файл с расширением jpg - картинка. Можно же любому файлу дать любое расширение.
Кроме расширения нужно проверять mime-тип файла. В штатном наборе есть пара (а может и больше) функций:
mime_content_type()
finfo_open

 

Powered by ExBB FM 1.0 RC1