Четверг, 16.05.2024, 06:37
DigitalBox
Приветствую Вас Гость
Главная FAQ Регистрация Вход
Меню сайта

Главная » FAQ [ Добавить вопрос ]

Программирование на PHP [16]
Различные нюансы программирования на PHP

При передаче данных из одного файла PHP далее для обработки, передается массив вида имя_элемента - значение. Но есть некоторые элементы (например SELECT с опцией множественного выбора MULTIPLE), где в качестве значения фигурирует не одно, а группа (коллекция). Что делать в этом случае?
Такие элементы передаются в виде коллекции. В HTML коде подобного элемента в названии элемента следует указать []
Например:
<select name=collect[] multiple>
<option value="one">one</option>
<option value="two">two</option>
<option value="three">three</option>
<option value="next">next</option>
</select>

В этом случае, в качестве значения в принимающий 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 с множественным выбором 
-->

<select name=collect2[] multiple>
<option value="one">one</option>
<option value="two">two</option>
<option value="three">three</option>
<option value="next">next</option>
</select>
<p>
<input type="submit" name="Submit" value="post">
</form>
</body>
</html>

‹?
if(count($collect1) > 0) {
  echo "<b>Checkboxes:</b><br>";
  for ($i=0; $i<count($collect1); $i++) {
  echo $collect1[$i], "<br>";
  }

if(count($collect2) > 0) {
  echo "<p><b>Selected:</b><br>";
  for ($i=0; $i<count($collect2); $i++) {
  echo $collect2[$i], "<br>";
  }
}
?›


Простой HTML-код для организации закачки файла с машины пользователя выглядит так:

<html>
<head></head>
<body>
<!-- указание enctype="multipart/form-data" является обязательным!!! -->
<form method="post" action="upload.php3"
enctype="multipart/form-data">
<b>Файл</b><br><input type="file" name="form_data" size=40
maxlength=255>
<br>
<input type="submit" name="sibmit" value="upload">
</form>
</body></html>

Принимающий скрипт, выглядит примерно так:

‹? $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


Помимо использования функция fgetc() fgets() fgetss(), Вы можете использовать:

$file = file($filename). Она читает $filename в массив($file).

Пример:

$file=file($filename);
for ($i=0; $i<=count($file); $i++) {
  echo $file[$i], "

";
}



Просто вывести их как ‹?echo somephpvar?›

Пример:

‹? $somephpvar = "http://$SERVER_NAME$REQUEST_URI"; ?›

<script language="JavaScript">
  var somejsvar = "";
  alert(somejsvar);
</script>

<form action="" method=post>
<input type=submit name="submit" value="ok">
</form>



Воспользоваться функцией:

Header("Location: $URL");


вызов: php [-q] [-h] [-s] [-v] [-i] [-f ] | { [args...]}

  -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             Это справка


Шифрование - одностороннее, это означает, что вы не можете декодировать зашифрованный пароль, вы можете только сравнить два зашифрованных пароля.
Например:
if (crypt($InputPassword) == $StoredPassword) {
  echo "Pasword PASS...";
} else {
  echo "Password FAIL...";
}


В 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 выдаст страницу клиенту после выполнения.

СКРИПТ отрисовывает форму и посылает данные ПОСТом самому себе. 

Если все правильно - добавляем запись и делаем ПЕРЕНАПРАВЛЕНИЕ Status: 301 Moved Permanently\n Location: $relocation\n

Если нет - опять рисуем форму и выдаем сообщение об ошибке


header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0,pre-check=0", false);
header("Cache-Control: max-age=0", false);
header("Pragma: no-cache");


Прокси-сервер: IP: 192.165.0.10 PORT: 3128

// так выглядит запрос 
$head="GET http://www.rambler.ru HTTP/1.1\r\n\r\n"; 

// соединяемся с прокси сервером 
$fp = fsockopen("192.165.0.10", 3128); 

if($fp) {// если все cool, то... 

  // передаем запрос 
  fputs($fp,$head); 
  // читаем 65000 байт 
  $returndata= fread($fp,65000); 
  // закрываем соединение 
  fclose($fp); 



// выводим результат 
print $returndata; 



Чтобы в браузере открылся диалог "Сохранить файл" с названием файла file.dat, скрипт, перед отдачей файла, должен послать такие заголовки:
header("Content-Disposition: attachment; filename=file.dat");
header("Content-Type: application/x-force-download; name=\"file.dat\"");
Не мешало бы также ссылаться на скрипт как http://.../download.php?file.dat, иначе браузеры, основанные на Mozilla, могут попытаться записать файл как file.dat.php.
Примечание: Не используйте заголовок header("Cache-Control: no-cache") в таких скриптах, большинство версий Internet Explorer не смогут скачать файл.

Варианты решения: 1. Выдавать заголовки, отключающие кеширование

// Date in the past

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");

2.Добавлять в конец сылки, выводящей кртинку, какую-то случайную величину: function ShowPic()

{

document.images["pic"].src="http://127.0.0.1/php/echo_test.php?"+Math.random();

}

или так:

srand ((double) microtime() * 1000000);
$rnd=rand();
echo "<img src='http://127.0.0.1/php/echo_test.php?смысловые_параметры&rnd=$rnd'>";



Никак. РНР исполняется на сервере и ничего о компьютере клиента не знает.

Если Вы хотите поместить прозрачное PNG-изображение на другое изображение, необходимо использовать ImageAlphaBlending, а также все использующиеся PNG-изображения должны быть сохранены в формате PNG-24 (опция Save for Web в Фотошопе). например Вы хотите поместить прозрачный логотип на свою фотографию. Тогда нужно сделать так:
 
‹?php
$photoImage=ImageCreateFromJPEG("photo.jpg");
ImageAlphaBlending($photoImage, true);

$logoImage=ImageCreateFromPNG("logo.png");
$logoW=ImageSX($logoImage);
$logoH=ImageSY($logoImage);
ImageCopy($photoImage, $logoImage, 0, 0, 0, 0, $logoW, $logoH);

ImageJPEG($photoImage); // вывод в браузер 

ImageDestroy($photoImage);
ImageDestroy($logoImage);
?›


Форма входа

Мини-чат

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz