Last active
June 2, 2017 15:45
-
-
Save alex28742/80760fc462b6e142c9b2dd6be7179912 to your computer and use it in GitHub Desktop.
PHP&MySql Специалист
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
День 1, файл htaccess, php.ini, модули, настройка, переменные и ссылки. | |
Почему отказались от полной обратной совместимости версий? | |
В 5.3 отказались от этой идеи. Т.к. приходиться тянуть "мусор". | |
Теперь сначала некоторые устаревающие версии помечаются как "деприкейтед", в дальнейшем этот устаревший функционал удаляется. | |
Настройка htaccess | |
Сервер сначала просматривает собственные настройки, затем когда обращается к папке сайта ищет там файл htaccess и переопределяет настройки, если нужно, или добавляет к своим. Эти настройки распространяются только к данной папке. | |
С помощью этого файла можем также настраивать конфигурацию PHP | |
# Комментарий | |
дальше директивы сервера apache .. из более нескольких десятков | |
Options Indexes FollowSymlinks | |
DirectoryIndex index.php - все через пробел.. задается файл директории по умолчанию. Если не указываем файл. | |
У apache свои настройки на эти случаи жизни.. здесь только можем переопределить. | |
Можно по очереди указывать через пробел несколько вариантов | |
Если файла по умолчанию не будет? | |
Смотрит на Options и ее значение Indexes которое говорит что нужно показать содержимое папки в случае если не найден файл для загрузки по умолчанию. | |
Если не хотим чтобы показывалась папка, то ставим -Indexes | |
Теперь сервер ответит статусом 403 access forbidden (у вас нет доступа к файлам и папкам..) | |
В глобальных настройках это должно быть настроено, но лучше не полагаться, настройки сервера могут изменить или специально злоумышленники, или по ошибке, лучше перестраховаться локально. | |
PHP живет по адресу http://php.net | |
Из чего состоит php.. архив с файлами.. | |
Ядро самого php это php5ts.dll изменять этот файл крайне не рекомендутся. это сам интерпритатор. | |
php поддерживает более 4 000 штатных функций. Основные функции.. ядро.. зашиты в dll, а остольные функции зашиты в "расширениях" папка ext. Те функции которые отвечают за работу графического ядра в файле php_gd2.dll, эти файлы можно при необходимости отключать или подключать. | |
php прикручивается как модуль к апачь, сам модуль назвается php5apache2_2.dll | |
У Apache есть свой глобальный конфигурационный файл conf/httpd.conf в котором глобальные настойки.. | |
в т.ч. директива loadmodule. | |
LoadModule php5_module "путь-к-php/php5apache2_2dll" | |
AddType application/x-httpd-php .php (здесь указываются через пробел расширения файлов, которые будут отдаваться на обработку php интерпретотору на исполнение) | |
У php тоже есть конфигурационный файл свой php.ini | |
Здесь тоже подключаются расширения, вкл и выкл. различный доп. функционал. Свой синтаксис. | |
Комментарий ; , разделитель = | |
extention - дирректива подключения модуля | |
При изменении надо перезагрузить сервер, чтобы настройки вступили в силу. | |
Как проверить работоспособность php? | |
Маленький скрипт. <?php phpinfo(); ?> | |
Все что пришлось бы собирать по разным файлам.., инфа о сервере и php, все собрано вместе. | |
После подзаголовка Core перечисляются основные настройки php | |
Периодически будем изменять эти настройки. В зависимости от настроек хостинга. | |
Некоторые настройки можно менять прямо в коде (run time) | |
Некоторые настройки можно изменить в файле htaccess | |
asp_tags off как включить не залезая в php.ini? | |
В htaccess: | |
#Настройки PHP | |
php_flag asp_tags on переопределили настройку. | |
При перезапуске php.ini увидим что изменения применились только в local value, master value глобальные не изменились. Переопределили только локально. | |
Интерпретатор обрабатывает только код заключенный в теги php: <?php ?>, все остальное пропускает и отдает серверу apache без изменений. | |
Теги всегда доступные : <?php ?> | |
Короткие тэги, (доступны с директивой short_open_tag в php.ini) и всегда доступен с PHP 5.4 <? ?> | |
Однострочные комментарии двух видов: однострочные: // и #, и многострочные /**/ интерпретатор не обрабатывает | |
Не рекомендуется использовать вложенные многострочные комментарии | |
Каждая инструкция php заканчивается ; т.е. <?php инструкция 1; инструкция 2; ?> | |
Отличие echo от print, в echo можно через запятую вывести параметры | |
echo 'эта','строка', 'должна быть выведена'; | |
Вывод даты <?php echo strftime('Сегодня %d-%m-%Y'); ?> | |
Удаление переменной: unset($x); | |
Если нужно сделать вывод по-русски, в начале файла пишем | |
<?php | |
setlocale(LC_ALL "russian"); - используется встроенная константа | |
?> | |
Обработка ошибок. | |
В PHP две директивы в php.ini отвечающие за ошибки | |
первая display_errors = on - банально отключает вывод ошибок (не будет показывать); | |
вторая: error_reporting = E_ALL & ~E_NOTICE - какой уровень ошибок показывать. (показыв. все кроме уровня E_NOTICE (легких предупреждений)) | |
Прямо в коде (run time) можно переопределить установки. | |
так: ini_set('display_errors',1); - директива, значение. | |
Если напишем error_reporting(E_ALL); - покажет все ошибки всех уровней. | |
Отключить вывод всех ошибок (кроме ошибок парсинга): error_reporting(0); | |
Ошибки парсинга сработают, так как парсинг до исполнения кода проходит. | |
error_reporting(E_ERROR | E_WARNING); показывать только этих уровней | |
error_reporting(E_ALL & ~E_DEPRECATED); все кроме вывода нежелательных функций устаревших, начиная с PHP 5.4 | |
Уровни ошибок: | |
E_PARSE - ошибки до начала выполнения кода, в основном видит только синтаксические | |
E_ERROR - уже на этапе исполнения (рантайм), напр. пытаемся открыть файл которого нет.. прерывает обработку. | |
E_WARNING - выбрасывает ошибку но исполнение кода продолжается | |
E_NOTICE - легкое предупреждение, | |
ошибки выводимые интерпретатором.. подсказывают на какой строчке уже была ошибка (если 12, то как-правило искать надо на 11-й). | |
Если пропустили тег, например не закрыли, попытается "догадаться и подсказать": expecting ';' | |
syntax error, unexpected 'echo', expecting ';' | |
синт. ошибка, неожиданно эко, пропущено ';' | |
Иногда из-за одной ошибки выскакивает десяток "ошибок". Поэтому надо начинать фиксить с первой. Она может вызвать все остальные. | |
Особенности работы ссылок - переменных. | |
Динамическое создание переменных - переменная переменных. | |
$a = 'hello'; | |
$$a = 'world'; - здесь создасться переменная $hello со значением 'world' | |
День 2. Типы | |
Данные делятся на типы. Типы - сугубо внутреннее устройство конкретного языка. Даже булев тип реализован и работает по разному. PHP - динамически типизированный. В ячейке может быть данные любого типа. | |
Сейчас в PHP 8 типов. | |
Скалярные: boolean, integer, float, string. | |
Смешанные: array, object. | |
Два специальных: resource, null; | |
Приведение типов. | |
Браузер понимает только строки. Поэтому php отдавая браузеру все приводит к строке. | |
$x = true; echo $x; браузер получит строку '1' | |
если $x = false, echo $x отдаст пустую сроку (Не ноль!) | |
любое целое число это integer. | |
$i = 123; // десятичное | |
$i = -123; // отрицательное | |
$i = 0123; // 83 в восьмеричной системе | |
$i = 0x1A; // 26 в шестнадцатиричной | |
$i = 0b101; // 5 в двоичной (PHP 5.4) | |
все с плавающей точкой это float | |
строки. двойные и одинарные кавычки. В двойных кавычках значение переменной подставляется. | |
двойные кавычки позволяют внутри использовать спец.символы (\n, \r , \t). | |
Браузер эти спец символы не понимает (понимает только тэги) и текст "hello\n world" выведет на одной линии. | |
Но в исходном коде перенос будет выполнен. Это может быть полезно при работе с файлами. | |
"\" - это управляющий символ экранирующий специальный символ. | |
HEREDOC: | |
echo <<<"LABEL" | |
Меня зовут "$name". Переводим на новую строку. | |
Перед строкой стоит символ табуляции. | |
Это должно вывести заглавную букву 'A': \x41 | |
LABEL; | |
Как форматируем, так и выведет сам подставит переносы строк, табуляции, ненадо экранировать. | |
LABEL - это всего лишь метка. Можно использовать произвольное слово. | |
Подводные камни с использованием этих тегов... | |
Строки: дотягивается до символа по позиции $str{4} | |
Длина строки: strlen($str); | |
Позиция последнего символа: $pos = $len -1; | |
Арифметические операторы в php | |
Если в JS '+' служит для сложения и для склеивания строк, то в php этот оператор сугубо арифметический | |
В JS '2' + 2 = '22' - будет преобразовано к строке | |
В PHP '2' + 2 = 4 - PHP попытается увидев арифметический оператор привести к цифре. | |
Если PHP не смог преобразовать строку в число, то приведет ее к нулю | |
$x = 'hello'; echo $x * 10; - x будет преобразован в 0 | |
$x = '5hello' - будет преобразовано к 5 | |
Побитовые операторы | |
0110101010 | |
& (и) только при совпадении двух единиц будет единица | |
1001010110 | |
---------- | |
0000000010 | |
0110101010 | |
| (или) | |
1001010110 | |
---------- | |
1111111110 | |
0110101010 | |
^ (ксор) только один должен быть единицей, 1 и 1 тоже дадут 0 и два нуля 0 | |
1001010110 | |
---------- | |
1111111100 | |
~ (отрицание) 0 становится 1, 1 становится 0 | |
<< сдвиг влево все биты переменной а сдвигаются на b позиций влево, каждая позиция подразумевает умножение на 2 | |
$result = 4 << 1; // $result = 8 (умножилось на 2) | |
>> сдвиг вправо здесь сдвиг а на b позиций вправо, каждая позиция подразумевает деление на 2 | |
$result = 4 >> 1; // $result = 2 (поделилось на 2) | |
$result = 1 & 5; // $result = 1 | |
$result = 1 | 5; // $result = 5 | |
$result = 1 ^ 5; // $result = 4 | |
День 2 1,51 | |
Дальше урок 3. | |
Конструкция switch.. | |
Ограничение размера данных передаваемых в форме | |
В php.ini настройка post_max_size | |
Как вытащить значение из дерективы в код php? | |
ini_get("post_max_size"); - вернет строку со значением ('50M') | |
Может лежать число + буква M, G, K, или число без буквы что значит байты | |
Решение задачи вытягивания и проверки этого параметра: | |
$size = ini_get("post_max_size");// 50M | |
$letter = $size{strlin($size) - 1} // M | |
$size = (int)$size;// 50 явно привели к int хороший тон | |
// когда сравниваем строки, желательно приводить к одному регистру | |
strtoupper($letter); - приводим строку к верхнему регистру | |
switch(strtoupper($letter){ | |
case 'G': $size *= 1024; | |
case 'M': $size *= 1024; | |
case 'K': $size *= 1024; | |
} | |
Массивы: | |
$arr = array(); // пустой массив со знаением false | |
Сразу инициализируем: $user = array('john','root', true, '1234'); | |
Обращаемся по индексу к элементу массива | |
echo $user[0];// John | |
Добавляем значение в массив | |
$user[] = '[email protected]'; // пустым скобкам задается индекс следующий за наибольшим | |
Самые основные функции для работы с массивом: | |
count($arr) - количество элементов в массиве, или количество свойств | |
Для просмотра содержимого можно использовать print_r() | |
print_r() - выведет в строчку | |
<pre>print_r() - форматируем вывод | |
недостаток этого метода - не увидим типы элементов, все как строки.. | |
var_dump() - покажет все, включая тип элементов и общее количество элементов (размер массива) | |
Индексы не имеют отношения ни к количеству элементов, ни к их порядку | |
$user[] = 'john'; | |
$user[22] = '123'; | |
$user[55] = 'root'; | |
$user[] = '[email protected]'; | |
В итоге в массиве будет: | |
Array | |
( | |
[0] => john | |
[22] => 123 | |
[55] => root | |
[1] => [email protected] | |
) | |
Использование в качестве ключей строки позволяет работать с ассоциативным массивом. | |
'name' => john | |
'login' => 123 | |
'pass' => root | |
'email' => [email protected] | |
Обращение к элементу, пример: <?= $menu['home'] ?> | |
Многомерный, echo $arr[0]['login']; | |
$arr[0] = array( | |
'login' => 'vasya' | |
); | |
$leftMenu = array( | |
array('link' => 'Домой', 'href' => 'index.php'), | |
array('link' => 'О нас', 'href' => 'about.php'), | |
array('link' => 'Контакты', 'href' => 'conact.php'), | |
array('link' => 'Калькулятор', 'href' => 'calc.php') | |
); | |
<li><a href='<?= $leftMenu[0]['href'] ?>'> </a></li> | |
Функции для работы с массивами: | |
current($array); = возвращает значение текущего элемента, у массива есть внутренний указатель, вначале стоит на первом элементе. | |
next($array); - передвигает на указатель на сделующую позицию и возвращает значение. | |
end($array); - установит указатель на последний элемент массива и вернет значение. | |
prev($array); - предыдущий... | |
reset($array); - сброс указателя к первому элементу... | |
key($array); - получение ключа текущего элемента | |
Подводные камни... | |
echo "Ваше имя: $user["name"]"; выдаст ошибку.. использование вложенных скобок? | |
echo "Ваше имя: $user['name']"; так тоже ошибка.. | |
Выход? | |
1. Вообще не указыавть ключ в ковычках: | |
echo "Ваше имя: $user[name]"; | |
2. Экранировать переменную {}: | |
echo "Ваше имя: {$user['name']}"; | |
День 4-й. | |
Функции. В php нельзя одно имя использовать для двух и более функций, в некоторых языках это возможно и называется перегрузка функции. | |
Для того, чтобы избежать ошибки повторного использования функции, можно использовать встроенную функцию проверки: | |
if(function_exists('function_name')){} - проверка функции на существование | |
В PHP не обязательно описывать функцию ДО ее вызова. PHP, ее кэширует до исполнения. | |
Если функция должна принимать параметр, а мы обращаемся к ней без передачи параметра, PHP выдаст ошибку warning, и продолжит работать. Заставить PHP проигнорировать ошибку в этой строке можно используя "подавитель ошибок @", например при вызове так: | |
@function_name(); | |
Можно вызывать функцию динамически: | |
$str = 'function_name'; | |
$str('some_text_argument'); ... вызов функции с параметром. | |
Когда PHP видит открывающуюся круглую скобку, он понимает что надо вызвать функцию по имени лежащей в переменной $str. Но имя функции в переменной должно быть строкой! Иначе ошибка. | |
Ввиду этого, в PHP нельзя обращаться к элементу массива с помощью круглых скобок, например так: echo "$user('name')" - PHP сочтет за вызов функции с именем которое будет искать в 'переменной' $user. | |
Лучше не инициализировать функцию внутри другой, иначе верхняя становится "одноразовой". | |
При попытке повторного обращения будет попытка редикларировать уже существующую, а в PHP это означает ошибку. Пример: | |
function foo(){ | |
function bar(){ | |
echo "exists"; | |
} | |
} | |
foo(); // при первом вызове и дальнейшем вызове bar() - все нормально. | |
при повторном вызове foo() - ошибка: попытка редикларировать bar(); Тогда надо проверять на существование... function_exists()... | |
Значение параметров по умолчанию: function foo($first='some_value'){} | |
В PHP только две области видимости переменных: Глобальная и Локальная. (в JS иначе, происходит "всплытие"...) | |
Извне PHP ничего не видит что внутри функций, а находясь уже внутри по ходу исполнения, ничего не видит что "вне" функции. | |
Константы всегда и везде Глобальны! | |
Если надо изменить переменную внутри некой функции..? | |
Три варианта решения: | |
1. объявить переменную как глобальную: global $name; | |
например: | |
$name = 'John'; | |
foo('guest'); | |
funcion foo($name){ | |
$name - возьмет входящий параметр, не изменит глобальную. | |
global $name - возьмет глобальную ('John'), глобальная будет изменена! | |
Или так: $GLOBALS['name'];.. объяснение ниже.. | |
} | |
У PHP есть суперглобальный массив $GLOBALS - в этом массиве PHP хранит все глобальные переменные. | |
2. Запись $name = 'John'; в глобальной области видимости равнозначна записи $GLOBALS['name'] = 'John'; | |
3. Передача аргументов по ссылке. | |
sayHello($name); - передаю значение переменной | |
sayHello(&$name); - передаю адрес переменной (ссылка), но начиная с PHP v.3 - такое исплользование генерирует предупреждение, а в более поздних редакциях это будет тотальной ошибкой. | |
Теперь ссылку на переменную можно принимать в качестве входящего аргумента в описании функции, но нельзя указывать ссылку при обращении функции и отправке данных. Что не есть удобно. Раньше функции были универсальными, могли принимать и значения и ссылки.. | |
Например встроенная функция: | |
settype($x, 'integer') - ничего не возвращает, в декларировании принимает ссылку на $x | |
Статические переменные. | |
Локальная переменная существует только пока произходит исполнение кода внутри функции. | |
Но, иногда надо сохранить значение локальной переменной. Для этого ее можно объявить как статическую. | |
static $a; - эта переменная не становится глобальной и не будет видна в глобальной области видимости, но сохраняет свое значение при повторном обращении к функции. | |
Любая функция всегда возвращает значение, даже если это явно не указано. | |
В PHP в таком случае возвращается null. | |
Функция List; | |
list ($zero, $one, $two) = array(); - PHP раскидает элементы массива array по переменным. | |
Разыменование массива. Появилось в PHP начиная с версии 5,4 | |
Можно сразу обращаться к элементу массива: | |
$number = array()[1]; | |
В случае использования рекурсии, есть опасность уйти в бесконечный цикл, поэтому надо обязательно предусмотреть условие выхода из цикла! | |
Альтернитивный синтаксис в PHP вместо использования фигурных скобок: | |
<? | |
if($shop): | |
echo 'Иду в магазин'; | |
elseif ($kiosk): | |
echo "Иду в киоск"; | |
endif; | |
?> | |
cookie PHP | |
без указания доп.параметров кука сохраняется на время сессии, пока открыт браузер. Кука находится только в опер. Памяти браузера.. | |
setcookie( | |
name - имя куки,(строка) [единственный обязательный параметр!] | |
value - значение,(строка) | |
expire - дата истечения срока годности..(кол. секунд) | |
path - к какой части сайта относится ккука.. /docs/.. | |
domain - домены третьего уровня.. news.new.ru.. | |
secure - true или 1, если используем https (шифруются все заголовки..) | |
httponly - браузер должен отдать куку только если запрос идет по протоколу http (куку нельзя бутет похитить с помощью js) | |
) | |
setcookie('TestCoockie', $value) | |
setcookie('TestCoockie', $value, time()+3600) - время жизни куки один час | |
setcookie('TestCoockie', $value, time()+3600, "/docs/", ".example.com", 1) - .example.com отдавать всем поддоменам, | |
!!! Куки надо посылать До того как будет осуществлен какой-то вывод, какое-нибудь echo, так как с эко передается пустая строка и вывод заголовков сразу заканчивается. | |
Пустые переносы строки в начале файла это тоже эко и также прекратится вывод заголовков! | |
!!! Если PHP блок <?php ..?> в подключаемом файле является последним в этом файле, То закрыающий тег ?> можно и лучше не писать. Так как не возникнет проблема отправки заголовков, так как в конце файла может стоять пробел.. и этот пробел также будет подключен с кодом всего файла, | |
.. в последующих подключаемых файлах может быть необходимость отправки заголовков, и с это вызовет проблему. | |
Чтение куки: суперглобальный массив $_COOKIE | |
echo $_COOKIE['TestCoockie']; | |
Удаление куки: надо послать куку без значения, или пустую строчку.. setcoockie("TestCookie"), или setcoockie("TestCookie","") - не обязательно задавать прошедшее время. | |
Как сохранить массив в куки? Его надо перегнать в строку. Для этих целей есть функция serialize() - сохраняет сложные данные в строчку и теперь можно записать в файл или куку. | |
Чтобы "распаковать" данные обратно, существует функция unserialize() | |
$user = unserialize($_COOKIE['...']) | |
Сохраняем только раз в день.. | |
if(date('d-m-Y', $_COOKIE['lastVisit']) != date('d-m-Y')) | |
Если надо установить куку на максимально долгое время, в параметрах времени можно указать ... 0x7FFFFFFF) | |
!!! Возникновение ошибки в случае : | |
начало файла: | |
<?php | |
setcookie("test","test"); | |
?> | |
Попытка запустить файл приводит к ошибке: Warning: Cannot modify header ingormation... | |
header already send... | |
При отправке куки, происходит попытка отправить заголовок.. | |
Ошибка? - файл может быть сохранен в кодировке с Bom. | |
PHP до сих пор не умеет работать с Unicode на уровне ядра. (JS весь юникодный, кодировка не имеет значение..). | |
В файле с кодировкой utf-8 в начале файла стоят три невидимые символа bom. | |
Увидеть их можно в world, например (открыть в ms-dos). Эти три символа "улетают" как echo.. И отправляются заголовки.. | |
Почему нет PHP v.6? Основная фича должна была заключаться в том, Что PHP должен был научиться поддерживать юникод на уровне ядра. | |
75% сайтов в мире крутится на PHP, об этой проблемой с кодировкой знают все и все нормальные редакторы умеют менять кодировку файла в utf-8 без BOM. | |
Теперь проблем не будет.. | |
!!! Некоторые редакторы, например notepad в windows штатный всегда сохраняет файл с bom. | |
Вывод? - никогда не редактировать в нем php файлы. | |
HTTP протокол, Заголовки. | |
==================================================== | |
На сервер идут заголовки запроса, обратно - заголовки ответа. | |
Заголовок запроса: | |
Head /folder/index.html HTTP/1.1 | |
Host: www.domen.ru | |
Accept: */* | |
Accept-Language:ru | |
Referer: http//yandex.ru... | |
User-Agent: Mozilla 4.0 | |
.... | |
Заголовок ответа: | |
HTTP/1.1 200 OK | |
Server:Microsoft IIS 6 | |
Content-Type:text/html | |
Content-Length: 16345 | |
Last-Modified: Sun, 03 Jul 2005 18:00:00 GMT | |
.... | |
Говорили о методе GET / POST | |
Есть третий метод HTTP называется HEAD. От метода GET отличается тем, что в ответе от сервера приходят только заголовки без контента. | |
Например надо просто узнать размер файла на удаленном сервере. | |
Достаточно только получить заголовок, без самого контента. | |
Штатных заголовков очень много. Можно даже самому создавать индивидуальные и отправлять. | |
Заголовки отправляемые зависят от браузера. | |
Заголовки принимаемые от сервера зависят от трех факторов: | |
1 - Сам сервер по умолчанию | |
2 - администратор сервера | |
3 - Мы. Мы из своего скрипта можем "попросить" сервер допослать какой-то заголовок, который он не посылает по умолчанию, или просим изменить параметр.. т.е. можем гибко управлять заголовками. | |
Все заголовки посылаются с помощью функции header("строка"); exit; | |
header("Location:http://site.ru")... | |
Location - перенаправление. | |
Вместе с Location, по умолчанию посылается 302 статус - ресурс найден по другому адресу | |
Браузер идет по старому адресу, получает ответ 302 статус.. и перезапрашивает по указанному адресу. - 302 это временный редирект. Браузер каждый раз будет сначала приходить по старому адресу, и если находит перенаправление, совершает его. | |
Иногда надо указать 301 статус - ресурс перемещен постоянно. Клиенту предписывается это запомнить. | |
Указываем статус третьим параметром: | |
header("Location:http://site.ru", true, 301); | |
Пример: | |
файл go.php | |
<form action="<?=$_SERVER["PHP_SELF"]?>"> | |
Куда отправимся: | |
<select name="url" size="1"> | |
<option value="http://www.yandex.ru">Яндекс</option> | |
<option value="http://www.google.com">Гугл</option> | |
<option value="http://www.rambler.ru">Рамблер</option> | |
</select> | |
<input type="submit" value="GO!" name=""> | |
</form> | |
При клике по кнопке, отправляется значение option value.. | |
В начале файла: | |
<?php | |
$url = strip_tags($_GET["url"]); | |
if($url){ | |
header("Location: $url"); exit; | |
} | |
?> | |
Следующий пример связан с возникновением предупреждения после отправки формы и при попытке обновить страницу. | |
Выражение "обновить страницу", корректнее называть "повторить предыдущий запрос". | |
Так как "предыдущий запрос" был отправлен методом POST и были отправлены данные, произойдет попытка повторить отправку... | |
Возьмите за правило, после использования метода POST: | |
// Обработка формы | |
... | |
// перезапрос формы методом GET | |
header("Location:" .$_SERVER["PHP_SELF"]); | |
exit; - останавливаем обработку скрипта. (Зачем? после совершения запроса, скрипт продолжает выполняться дальше по коду, "в холостую"), что не есть хорошо. | |
- эту же страницу перезапрашиваю методом гет. | |
Теперь выполняется перезапрос гет методом, и форма повторно не отправиться. | |
Заголовок Refresh | |
======================= | |
- F5 , число это количество секунд. | |
header("Refresh:1"); Чаще это делается на JS | |
Для примера: | |
header("Refresh:1"); | |
<h1><?=date("H:i:s")?></h1> - будет перезапрос каждую секунду. | |
Еще пример: | |
header("Refresh:3; url=http://site.ru"); | |
- отрабатывает как Location, только с задержкой. | |
Location работает на уровне заголовков. Но бывает ситуация, когда надо чтобы контент дошел. Например вывести сообщение "Наш сайт переехал, через 5 сек, вы будете перенаправлены..." | |
Content-Type | |
======================= | |
Заголовки для браузера определяющие, он сам ни о чем не догадывается. | |
В заголовке запроса от просто обращается по указанному адресу и не знает какого рода контент ему будет отдан. | |
Но браузеру надо знать что именно от получил от сервера, поэтому сервер в заголовке подсказывает через Content-Type; | |
.... | |
Content-Type: text/html - я тебе отдаю текст в формате html | |
Content-Type: img/gif - отдаю картинку в формате gif | |
Если в начале файла прописать заголовок header("Content-Type: text/xml") - то браузер воспримет как xml. | |
header("Content-Type: text/plain") - откроет как простой текстовый файл | |
Иногда в начале фала пишут мета-тег | |
<meta http-equiv="Content-Type" content="text/html"/> | |
http-equiv - это аналог заголовка. | |
Браузер просматривает файл и если находит такую запись то, рассматривает как заголовок. | |
! Но будет читать его только в том случае, если с сервера такой заголовок не пришел. | |
Иначе, игнорирует. Поскольку Content-Type приходит всегда, эта мета не нужна. | |
!!! С сервера никогда не приходит кодировка. Браузер пытается догадаться. | |
Если utf-8 без BOM, то думают что win1251... (firefox), opera - правильно разработчики учли что если нет бома, это еще не значит что кодировка не utf-8. Так как много сайтов работают на php. | |
Поэтому надо принудительно указыать что используем utf-8. | |
Поэтому meta с указанием кодировки должен быть обязательно! | |
Получая инфу с сервера, у браузера есть несколько вариантов что делать с полученной порцией данных. По умолчанию выводит как текст. Но можно переназначить. | |
header("Content-Type: file/octet-stream") - говорим что собир. получить текст. файл. | |
header("Content-Disposition:attachment; filename=\"myfile.txt\""); | |
Теперь при попытке загрузки данных получим окно с возможностью выбора сохранения или открытия файла с предполагаемым именем myfile.txt. | |
Создание на лету файла с текстом пример: | |
В переменной $file_content находится обращение-приветствие. | |
$user_name = strip_tags($_COOKIE['userName']); - ищу в куках имя юзера | |
if(!$user_name) $user_name = "Незнакомец"; | |
$user_name .="Ты работаешь с IP " . $_SERVER["REMOTE_ADDR"]; | |
$file_content = str_replace("USER", $user_name, $file_content); - произвожу замену. | |
echo $file_content; | |
Так иногда в библиотеках файл не хранится физически а находится в базе, и выбрав в каком формате он нужен и указав, файл формируется в заданный формат включая служебные данные, если нужны, напр. этот файл скачан тогда-то там-то... | |
Кэширование | |
============================= | |
уровень 2 день 1 1:52. | |
уровень 2, день 1, 1.38 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment