При передаче данных из одного файла PHP далее для обработки, передается массив вида имя_элемента - значение. Но есть некоторые элементы (например SELECT с опцией множественного выбора MULTIPLE), где в качестве значения фигурирует не одно, а группа (коллекция). Что делать в этом случае?
Такие элементы передаются в виде коллекции. В HTML коде подобного элемента в названии элемента следует указать [] Например:
В этом случае, в качестве значения в принимающий PHP скрипт попадет массив под именем $collect и размерности, равной числу выбранных элементов! Более того! Подобный прием можно использовать для объединения в коллекцию и других параметров формы:
‹? // php скрипт, демонстрирующий получение коллекций ?› <html> <head><title>Get Collection</title></head> <body> <form method="post" enctype="multipart/form-data" action="collection.php3"> <!-- элементы типа checkbox объединяются в коллекцию $collect1 --> <input type=checkbox name=collect1[] value="chk1"> one<br> <input type=checkbox name=collect1[] value="chk2"> two<br> <input type=checkbox name=collect1[] value="chk3"> три
<p> <!-- коллекция $collect2 служит для передачи значения SELECT с множественным выбором -->
‹? $data = fread(fopen($form_data, "r"), filesize($form_data)); // если надо класть файл в БД, то нужна предварительная операция: // $data = addslashes(fread(fopen($form_data, "r"), filesize($form_data))); // путь к директории, в которую будут сохраняться файлы $path = "/repository/"; $fpwrite = fopen("$path$form_data_name", 'wb'); if(!$fpwrite) { echo "$errstr ($errno)<br>\n"; exit; } else { fwrite($fpwrite, $data, filesize($form_data)); fclose($fpwrite); echo "download file: $form_data_name - PASS!"; } ?›
Примечание: ======== Достаточно частой ошибкой является перекодирование http-сервером принимаемых данных. Если у Вас русский Apache, то эта проблема "лечиться" выставлением директивы:
CharsetRecodeMultipartForms off
Эта директива может быть выставлена как в файле httpd.conf, так и в .htaccess
-q Quiet-mode. Подавление заголовка HTTP. -s Подсветка синтаксиса . -f <file> Parse . Implies `-q' -v Номер версии -p Pretokenize a script (creates a .php3p file) -e Execute a pretokenized (.php3p) script -c <path> Искать файл php3.ini в -i PHP information -h Это справка
В PHP (и не только) существуют предопределенные переменные окружения веб-сервера. Ниже - список для сервера Apache... Как сказано в руководстве: "если Вы используете другой веб-сервер, мы не гарантируем наличия всех, нижеприведенных переменных...."
Вот некоторые из таких переменных:
$HTTP_REFERER Адрес страницы (если имеется), c которой агент пользователя был направлен на текущую страницу. Устанавливается агентом рользователя; не все агенты пользователя установливат это значение!
$SERVER_NAME имя сервера, на котором выполняется скрипт, например: 'www.webclub.ru'
$REQUEST_URI URI вызавемого скрипта, пример: /vars.php3. $GATEWAY_INTERFACE Какая версия спецификации CGI используется сервером, например: 'CGI/1.1'.
$SERVER_SOFTWARE Строка идентификации Сервера, указываемая в заголовках при ответе на запросы.
$SERVER_PROTOCOL Название и версия протокола обращения к странице, например: 'HTTP/1.0';
$REQUEST_METHOD Метод обращения к странице: 'GET', 'HEAD', 'POST', 'PUT'.
$QUERY_STRING строка запрашиваемых в URL параметров при обращении к странице (если есть). Комметарий: надежнее использовать функцию getenv: $query=getenv("QUERY_STRING");
$DOCUMENT_ROOT корневая директория сервера $REMOTE_ADDR IP адрес, с которого обратились к странице.
$REMOTE_PORT Порт, используемый в машине пользователя, чтобы связаться с сервером сети
$SCRIPT_FILENAME Абсолютный путь к скрипту.
$PATH_TRANSLATED путь для файловой системы (не root!) к вызванному скрипту.
$SCRIPT_NAME имя скрипта.
Так же список всех переменыых окружения и настроек PHP выводится функцией phpinfo(). Рекомендуется запускать ее для проверки на каждом новом для Вас хостинге. Встречаются некоторые коварные хостинги, на которых переменные окружения Апача могут определяться не совсем так, как мы того ожидаем...
Дело в том, что Cookie явлается частью HTTP-заголовка документа. Указание SetCookie() должно происходить до окончания вывода HTTP-заголовка.
На практике это означает, что если перед вызовом SetCookie() есть какой-либо вывод: echo, HTML-текст вне PHP-кода или PHP-скрипт, устанавливаюший Cookie, вызывается включением через <!--#include ... -->, то SetCookie выдает ошибку или (в последнем случае) cookie не установится.
Если Вы не можете вызвать SetCookie() в начале, то придется воспользоваться выставлением cookie через JavaScript или <META ..>-тэги.
Для сведения: в PHP4 и выше, есть возвожность кеширования вывода, т.е. cookie можно выставить в любом месте скрипта, а интерпретатор PHP выдаст страницу клиенту после выполнения.
Не мешало бы также ссылаться на скрипт как http://.../download.php?file.dat, иначе браузеры, основанные на Mozilla, могут попытаться записать файл как file.dat.php.
Примечание: Не используйте заголовок header("Cache-Control: no-cache") в таких скриптах, большинство версий Internet Explorer не смогут скачать файл.
Если Вы хотите поместить прозрачное PNG-изображение на другое изображение, необходимо использовать ImageAlphaBlending, а также все использующиеся PNG-изображения должны быть сохранены в формате PNG-24 (опция Save for Web в Фотошопе). например Вы хотите поместить прозрачный логотип на свою фотографию. Тогда нужно сделать так: