Заголовок страницы

Массив $_FILES

В PHP-скрипте обработка загруженных через форму происходит через глобальный массив $_FILES , рассмотрим его содержимое:

Загрузка одного файла

Чтобы форма отправила файл, необходимо использовать только метод POST для отправки данных и добавить к тегу атрибут enctype=»multipart/form-data» , который определяет способ кодирования данных формы при их отправке на сервер.

Код скрипта index.php:

Результат:

Array( [name] => image.jpg [type] => image/jpeg [tmp_name] => /home/user/temp/phpjX2YXo [error] => 0 [size] => 119303 )

Описание значений массива $_FILES :

$_FILES[‘file-1’][‘name’] Оригинальное имя файла на компьютере клиента.
$_FILES[‘file-1’][‘type’] Mime-тип файла, в случае, если браузер предоставил такую информацию. Этот mime-тип не проверяется на стороне PHP, так что не полагайтесь на его значение без проверки.
$_FILES[‘file-1’][‘size’] Размер принятого файла в байтах .
$_FILES[‘file-1’][‘tmp_name’] Временное имя, с которым принятый файл был сохранен на сервере.
$_FILES[‘file-1’][‘error’] Код ошибки, которая может возникнуть при загрузке файла.

Загрузка несколько файлов

Для загрузки сразу нескольких файлов к нужно добавить атрибут multiple , а к имени поля – [] .

Код скрипта index.php

Результат:

Array( [name] => Array( [0] => image.jpg [1] => arhive.zip ) [type] => Array( [0] => image/jpeg [1] => application/zip ) [tmp_name] => Array( [0] => /home/user/temp/phpK3h32F [1] => /home/user/temp/phpBrGxus ) [error] => Array( [0] => 0 [1] => 0 ) [size] => Array( [0] => 119303 [1] => 6792 ) )

Как видно, структура массива разделена по свойствам, а не по файлам. Для удобства работы с циклом foreach массив $_FILES можно преобразовать:

 $l) < foreach($l as $i =>$v) < $files[$i][$k] = $v; >> $_FILES['file-2'] = $files; print_r($_FILES);

Результат:

Array( [0] => Array( [name] => image.jpg [type] => image/jpeg [tmp_name] => /home/user/temp/phpKgSQbo [error] => 0 [size] => 119303 ) [1] => Array( [name] => arhive.zip [type] => application/zip [tmp_name] => /home/user/temp/phpVht8LS [error] => 0 [size] => 6792 ) )

Максимальный размер загружаемого файла

Размер загружаемого файла можно ограничить, добавив в форму скрытое поле с максимальным размером файла :

Читайте также:  Php как открыть xml

В случае превышения размера файла в переменной $_FILES[‘file-1’][‘error’] будет ошибка с кодом « 2 ».

Коды ошибок загрузки файлов

В случаи, если при загрузке файла произошла ошибка, в переменной $_FILES[‘file’][‘error’] будет содержатся её код. Возможны следующие значения:

Код Константа Описание
0 UPLOAD_ERR_OK Ошибок не возникло, файл успешно загружен на сервер.
1 UPLOAD_ERR_INI_SIZE Размер файла превысил максимально допустимый размер, который задан директивой upload_max_filesize
2 UPLOAD_ERR_FORM_SIZE Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
3 UPLOAD_ERR_PARTIAL Загружаемый файл был получен только частично.
4 UPLOAD_ERR_NO_FILE Файл не был загружен.
6 UPLOAD_ERR_NO_TMP_DIR Отсутствует временная папка.
7 UPLOAD_ERR_CANT_WRITE Не удалось записать файл на диск (возникает, когда на хостинге закончилось место).
8 UPLOAD_ERR_EXTENSION PHP-расширение остановило загрузку файла.

Настройки PHP

Обычно настройки загрузки файлов на хостинге вполне нормальные и не вызывают проблем, но есть исключения. Если не загружаются большие файлы, то скорее всего установлен лимит на размер загружаемого файла, ограничено время загрузки файла или ограничено количество одновременных загрузок.

Посмотреть установленные значения можно с помощью функции phpinfo() , в разделе «Core».

Раздел «Core» в phpinfo

В php.ini:

; Разрешение на загрузку файлов file_uploads = On ; Максимальное время выполнения скрипта в секундах max_execution_time = 60 ; Максимальное потребление памяти одним скриптом memory_limit = 64M ; Максимально допустимый размер данных отправляемых методом POST post_max_size = 50M ; Папка для хранения файлов во время загрузки upload_tmp_dir = home/user/temp ; Максимальный размер загружаемого файла upload_max_filesize = 5M ; Максимально разрешённое количество одновременно загружаемых файлов max_file_uploads = 10

В .htaccess:

# Разрешение на загрузку файлов php_value file_uploads On # Максимальное время выполнения скрипта в секундах php_value max_execution_time 60 # Максимальное потребление памяти одним скриптом php_value memory_limit 64M # Максимально допустимый размер данных отправляемых методом POST php_value post_max_size 50M # Папка для хранения файлов во время загрузки php_value upload_tmp_dir home/user/temp # Максимальный размер загружаемого файла php_value upload_max_filesize 5M # Максимально разрешённое количество одновременно загружаемых файлов php_value max_file_uploads 10

Источник

Форма php html post одним файлом

PHP: сервис одним файлом

Иногда удобнее не писать классы или процедурные модули, а сделать небольшое законченное решение в единственном файле, который выведет форму, отправит, получит и проверит параметры и выдаст результат работы в виде текстового контента или картинки. Рассмотрим эти 2 основных случая (результат-текст и результат-картинка), приведя по каждому из них законченный пример.

1. Форма + текст

Если речь идёт о Web-приложении, которое должно выдавать результаты «текстом» и на ту же страницу, с которой вводились данные формы, удобной представляется следующая организация скрипта (листинг):

       function magic ($path) < @ini_set('magic_quotes_runtime', '0'); @ini_set('magic_quotes_sybase', '0'); if (@get_magic_quotes_gpc()=='1') $path=stripslashes($path); //magic_quotes_gpc не меняется программно - см. доки return $path; >//Блок 1 - обработка разрешённых скрипту параметров $params = array ('name','gender','education','php','cpp','java','text','action'); //список разрешенных в скрипте параметров, все переменные создадутся автоматически из данных $_POST/$_GET или пустыми foreach ($params as $num=>$var) < if (!empty($_POST[$var])) $$var = trimall(htmlspecialchars(magic($_POST[$var]))); else if (!empty($_GET[$var])) $$var = trimall(htmlspecialchars(magic($_GET[$var]))); else $$var = ''; >//Блок 2 - вывод и заполнение формы echo ' 
Пример формы с обработкой и сохранением ввода после отправки Имя: Пол: Мужской Женский Образование: Какие языки программирования Вы знаете: '; $checkbox_values = array ('php'=>'PHP','cpp'=>'C++','java'=>'Java'); //Переменные флажков => подписи foreach ($checkbox_values as $key=>$value) < echo ''.$value; > echo ' Ваш комментарий (до 1 Кб):  
'; //Блок 3 - расчёт и вывод результатов if (!empty($action)) < //Здесь обаботка данных и вывод результатов обработки echo 'Имя="'.$name.'"
'. 'Пол="'.$gender.'"
'. 'Образование="'.$education.'"
'. 'PHP="'.$php.'"
'. 'C++="'.$cpp.'"
'. 'Java="'.$java.'"
'. 'Текст=
'.nl2br($text); > ?>

Здесь я сознательно использовал все основные интерфейсные элементы классического HTML4, чтобы показать, как в них передавать данные «с сохранением» предыдущего ввода.

Этот код сохраняет заполненную часть формы, «чистит» данные от лишних разделителей (функция trimall ), убирает внедрённую в данные разметку ( htmlspecialchars ) и решает php-шные проблемы с кавычками ( magic , актуально для версий PHP ниже 5.4, в современных версиях эту функцию и её вызов можно удалить).

При работе с кириллицей в кодировке Юникода UTF-8 имеет смысл один раз вызвать в начале скрипта

Обработчиком формы назначен текущий файл, как бы он ни назывался (указание $_SERVER[‘PHP_SELF’] )

Форма выводится операторами echo . Так как эти операторы используют одинарные кавычки-апострофы, их не должно быть в формируемой разметке HTML.

Мне кажется, это в данном случае лучше, чем писать просто HTML вне тега и потом делать кучу PHP-вставок для подстановки значений в форму.

Разрешены и GET , и POST . Также обратите внимание, как выглядят списки $select_values и $checkbox_values , применяемые для программного создания нескольких элементов списка и группы радиокнопок.

Если на странице результатов не должна отображаться форма, возьмите блоки 2 и 3 в единый условный оператор, например, так:

В этом случае в блок 3 имеет смысл встроить ссылочку (а лучше кнопку) для возврата к странице с формой. Почему лучше кнопку? Потому что тогда можно через скрытые поля вернуть ранее введённые данные обратно скрипту, вот код:

echo '
'; foreach ($params as $p) if ($p!='action') echo ''; echo ' '; echo '
';

Здесь не возвращается параметр action (от кнопки), так как именно по его наличию в данных мы судим, нужно выводить форму или результат.

Если результаты должны открываться в новом окне (вкладке) браузера, просто добавьте в открывающей части тега первой формы стандартный атрибут target :

Разумеется, есть и другие альтернативы, например, вывести текст с помощью яваскрипта (или яваскрипт-библиотеки вроде JQuery) в заранее созданный раздел . Но для этого надо быть уверенным, что яваскрипт у пользователя включён 🙂

Ну и PHP-фреймворков тоже хватает, только вот и скорость приложения, и скорость разработки окажутся ниже.

2. Форма + графика

При работе с графикой принцип организации скрипта меняется не сильно. Основное отличие — заголовки HTML-документа надо создавать только для страницы с формой, а результат выдаётся в виде картинки, так что там применяется директива header (‘Content-Type: image/gif’);

Точно так же скрипт может выводить картинку-результат в текущее окно или в новое. Но для случая текущего окна мы не сможем добавить кнопку-форму для возврата к набранным данным, ведь мы передаём другой тип содержимого (картинку GIF).

  • n — число шагов рекурсии, целое число от 1 до 9 включительно, по умолчанию 3;
  • r — радиус первой окружности в пикселах, целое число от 10 до 500 включительно, по умолчанию 100;
  • back — цвет фона рисунка, должен быть передан в виде RRGGBB , где RR , GG , BB — 16-ричные интенсивности красного, зелёного и синего со значениями от 00 до FF включительно (в десятичных числах от 0 до 255), то есть, применяется типовая система записи цвета RGB. Если передано любое значение back меньше 0 , фон будет прозрачным. По умолчанию белый;
  • lines — цвет линий, также в виде RRGGBB , по умолчанию красный.

Размер картинки определяется автоматически, но не может превышать 1000 пикселов. Картинка всегда квадратная.

Полный листинг скрипта приводится ниже:

       

Порядок рекурсии

Начальный радиус, пикселов

Цвет фона RRGGBB (-1 = прозрачный)

Цвет линий RRGGBB

Сторона картинки - до 1000 пикселов, время выполнения - до 15 сек.

'; exit(0); > set_time_limit (15); //Лимит времени выполнения function Circle($img,$color,$x,$y,$r,$n) < if ($n>=0) < imageellipse ($img,$x,$y,$r<<1,$r<<1,$color); Circle($img,$color,$x+$r,$y,round($r/2),$n-1); Circle($img,$color,$x,$y-$r,round($r/2),$n-1); Circle($img,$color,$x-$r,$y,round($r/2),$n-1); Circle($img,$color,$x,$y+$r,round($r/2),$n-1); >> //Обработка параметров function get_rgb_from_hex ($hex) < //Цвет RRGGBB (Hex) в массив (r,g,b) десятичные $rgb=array(); for ($i=0; $i$params = array ('n','r','back','lines'); foreach ($params as $num=>$var) < if (!empty($_GET[$var])) $$var = intval($_GET[$var]); else $$var=0; >if ($n9) $n=3; // Порядок рекурсии if ($r500) $r=100; // Начальный радиус 10-500 $width = 0; $pow2n = 1; for ($i=0; $i $width=$width*2+8; if ($width>1000) $width=1000; // Размер стороны картинки обрезается до 1000 пикселов $transparent=false; //Прозрачность $rback=$gback=$bback=255; if (isset($_GET['back'])) < //Цвет фона RRGGBB, если меньше 0 - прозрачный $back=htmlspecialchars(trim($_GET['back'])); if (preg_match("#^[0-9A-Fa-f]$#",$back)) list ($rback,$gback,$bback) = get_rgb_from_hex ($back); else if (intval($back) <0) $transparent=true; >$rlines=255; $glines=$blines=0; if (isset($_GET['lines'])) < //Цвет линий RRGGBB $lines=htmlspecialchars(trim($_GET['lines'])); if (preg_match("#^[0-9A-Fa-f]$#",$lines)) list ($rlines,$glines,$blines) = get_rgb_from_hex ($lines); > //Отрисовка if (!extension_loaded('gd')) die('Cannot initialize GD library'); $img = @imagecreatetruecolor($width, $width) or die ('Cannot initialize new GD image stream'); $back = imagecolorallocate($img,$rback,$gback,$bback); $lines = imagecolorallocate($img,$rlines,$glines,$blines); imagefilledrectangle ($img, 0, 0, $width, $width, $back); if ($transparent) imagecolortransparent($img, $back); Circle($img,$lines,round($width/2),round($width/2),$r,$n); //Вывод header ('Content-Type: image/gif'); imagepng ($img); imagedestroy($img); ?>

В тексте скрипта видно, что все ограничения на значения входных данных обязательно проверяются на стороне сервера. Это нужно делать всегда, ведь нетрудно написать «альтернативную» клиентскую форму, в которой ваших ограничений не будет и которая «положит» сервер, например, попытавшись создать сверхогромную картинку.

07.06.2013, 16:31 [14025 просмотров]

Источник

PHP :: Использование php-скрипта и html-формы в одном файле

Во всех предыдущих примерах мы использовали по отдельности файл с формой и с обработчиком формы. Однако довольно часто в ходе разработки сайта бывает полезным совмещать в одном файле коды сразу нескольких языков (и не обязательно только HTML и PHP ). Рассмотрим такую ситуацию на примере №1 .

      
Введите имя  

Введите фамилию  

Предпочитаете   овощи   фрукты

HD; //Если форма была уже отправлена, то в массиве есть элемент $_POST["submit"] if(isset($_POST["submit"]))< //Чтобы не усложнять пример, будем считать, что все данные были введены //Достаем полученные данные из суперглобального массива $_POST //и присваиваем их переменным для удобства использования $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; $user_choice_0 = $_POST["choice"][0]; $user_choice_1 = $_POST["choice"][1]; //Выводим сообщение echo $first_name.' '.$last_name.' любит '.$user_choice_0.' и '.$user_choice_1; >else < //Если же форма еще не была отправлена выводим ее echo $a; >?>

Пример №1. Код формы, которая ссылается сама на себя

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

Быстрый переход к другим страницам

html.okpython.net Copyright © 2016-2023.

Источник

Оцените статью