20:39 Отладка скриптов PHP, мониторинг глоб.массивов |
Наверника все и не раз сталкивались с моментом, когда во время отладки кода теряются какие либо переменные глобальных массивов, или же вы просто забываете как называется елемент какого либо глобального массива.
Этот момент легко контролировать 2 известными мне вариантами:
1. var_dump()
Цитата |
var_dump($_SESSION); |
2. print_r (Более красивый и удобный)
Цитата |
echo "<pre>";
print_r($_POST);
echo </pre>; |
Мне конечно удобней использовать 2й вариант, так как он выводит красивое дерево массива, но каждый раз писать (даже эти 3 строчки) мне становиться лень, темболее, что иногда это делаю я по нескольку десятков раз в день.
Именно по этому я решил написать функцию, которая бы заменила эти 3 строчки в несколько символов;
Назвал я её по началу globalsView(), но из-за лени переименовал в gview() (g-оставил, для красоты!)
Функция имеет всего один аргумент в качестве которого можно указать один из 4 суперглобальных массивов: POST, GET, FILES, SESSION (но указываются они не как элементы php, а как строки - в ковычках)
Цитата |
function gview($globals)
{
if($globals == "POST"){$title = "<strong style='color:blue'>Массив POST</strong>"; $arr = $_POST;}
elseif($globals == "GET"){$title = "<strong style='color:blue'>Массив GET</strong>"; $arr = $_GET;}
elseif($globals == "FILES"){$title = "<strong style='color:blue'>Массив FILES</strong>"; $arr = $_FILES;}
elseif($globals == "SESSION"){$title = "<strong style='color:blue'>Массив SESSION</strong>"; $arr = $_SESSION;}
ob_start();
echo "<pre>";
print_r($arr);
echo "</pre>";
$buffer = ob_get_contents();
ob_end_clean();
if($globals == $_GET)
$title = "<strong style='color:blue; font-size:15px'>Массив GET</strong>";
if($globals == $_FILES)
$title = "<strong style='color:blue'>Массив FILES</strong>";
if($globals == $_SESSION)
$title = "<strong style='color:blue'>Массив SESSION</strong>";
$strings = array("Array", "[", "]", "=>", ",", ")", "(", "<br />");
$repalce = array($title,"<strong style='color:red;'>", "</strong>", "<span style='color:blue;'>-></span>","", "", "", "");
$buffer = str_replace($strings,$repalce ,$buffer);
$buffer = "<div style='border: 1px solid gray; background: white; padding: 10px; margin: 2px'>".$buffer."</div>";
echo $buffer;
}
|
Потом я один раз её подключаю, где нить в самом верх index.php (в моих сайтах он всегда роутер)
Вызов функции, как я и говорил - несколько символов:
Цитата |
gview("POST");
gview("GET");
gview("FILES");
gview("SESSION");
|
А работает она так (Как дополнительный вспомогательный BOX):
Эх.. не победил я ещё регулярки (т.е. паттерны), а так бы раскрасить можно было по красивше.
p/s Рассматривал так же возможность одного вызова, использовав 4 аргумента (под 4 массива) и так же если время будет - подкорректировать её под любой массив. Вообщем эти 2 момента оставлю на апгрейт.
|
| Цитата || Печать || Комментарии:6 | |
21:07 MVC - очень удобно и практично. |
Решил я малость потрепаться про широко-популярный паттерн MVC (MODEL-VIEW-CONTROLLER), который практикуют и здесь, да и много кто ещё))
Кого озадачил - поясню: этот паттерн(он же шаблон проектирования) используется для создания сайтов, удобство его в том что используя его вы будете разделять логику(работу PHP) от вывода(шаблона).
Хочу рассказать о своём способе его использования, а неорденарен он тем, что в нём я использую и лёгкий намёк на Smarty (это уж в WIKI гляньте...).
Сначала о структуре такого сайта.
Цитата |
Корень
|_____Папка: admin
| |_____файл: config.php
| |_____файл: variables.php
|
|_____Папка: moduls
| |_______Папка: administarte
| | |___________модули панели администрирования
| |_______файл: home.php
| |_______ ..............................
| |_______ файл: contacts.php
|_____Папка: controllers
| |____________Папка: administrate
| | |___________контроллеры и подконтроллеры панели администрорования
| |____________контроллеры и подконтроллеры модулей, например: c.home.php (первая "с." - говорит мне что это контроллер)
|_____Папка: templates
| |_______Папка: default
| |______Папка: tpl (шаблоны tpl по названию модулей)
| |______Папка: js (js- применяемые в этом шаблоне)
| |______Папка: images (картинки применяемые в этом шаблоне)
|_____Папка: images (тут хранится графика для админки)
|_____Папка: js (js - для админки)
|_____Папка: uploads (для загружаемых файлов)
|_____Папка: libs (функции)
|_____Папка: logs(логи - ошибки, статистика)
|_____файл: index.php
|_____файл: .htaccess
|_____файл: robots.txt
|_____файл: favicon.ico |
Так... тепер поясняю:
Как вы обратили внимание - папки images и js - есть и в корне и в templates/default, я придерживаюсь такой иерархии, так как в тех папках, что находяться в корне - я храню графику и скрипты, необходимые для адинки, а те что в папке templates - default - это всё файлы шаблона "default" - удобно это тем, что - оч просто создать новый шаблон (создать папку "new_templte" в папке templates) - и данные нового шаблона - хранить в его папке. А для админки не зачем каждый раз переписывать шаблон, он есть и его хватает.
Далее файл: variables.php - тут я определяю большую часть переменных, GET, POST, SESSION и т.д
файл: config.php - настройки подключения к БД, константы Debug (bool) - отладка/продакшн, mod_rewrite(ЧПУ/SEO)
в папке libs - здесь я храню все функции, одна функция - один файл по названию функции (f.getLinks.php)
Итак, как построен алгоритм работы такого сайта:
в корне лежит index.php - вот он один и тянет весь сайт (т.е. все ссылки проходят через него), а организовано это так:
- конструкция switch/case - обеспечивает подключение модулей
-сами модули инклудят (именно в таком порядке!)
- функции, необходимые для работы модуля
- контроллер модуля (или подконтроллер)
- шаблон шапки
- шаблон тела
-шаблон футера
Вывод этих 3-х шаблонов заносится в буфер, назначается переменная для данных в буфере и буфер очищается.
В шаблонах содержаться метки вида {*TITLE*}, {*TOP_MENU*}, {*BANNER*}
Перед выводом этой переменной (целого шаблона - статики) в модуле (непосредственно перед выводом шаблона) я функцией str_replace() - произвожу замену этих меток (в переменной с данными из буфера) - на данные полученные из БД (заголовка, меню и т.д.).
Функция str_replace - тем для меня удобна - что в качестве аргументов может принимать массивы - массив меток <> массив данных из БД, тем самым - мне хватает - подготовить массивы и один раз "прореплесить" - после этого уже вывод переменной с изменёнными данними из буфера (окончательный вывод статики всей страницы)
В дальнейшем, при сождании нового шаблона - просто вставляю такие метки в нужные мне места - и всё. уаля.....
(например - я в админки создал новое меню - всё в БД, в том числе там же хранится и метка этого меню {*MY_MENU*}, и если я куда нить поставлю эту метку - то он замениться на это созданное меню).
Админка моей CMS содержит массу настроек (и будет содержать ещё больше, так там например можно даже редактировать php и др. файлы, закрывая разделы для доступа - на время работы, и оснащено это дло редактором с подсветкой синтаксиса), чтоб меньше лазить в панель управления хостингом.
Написать модули для такой структуры - раз плюнуть (всё по полочкам, всё по нотам), добавили модуль - добавили подраздел в админку - для управления.
Вот в принципе и всё. Так же хочу добавит, что можно в контроллере - тоже устроить switch-case подконтролерам - тогда точно всё по полочкам!
Удачь!
P.S файлы .htaccess и robots.txt - помогают мне ограничить доступ к одельным файлам и директориям не только от куль-хаккеров, но и от не нужной индексации.
|
| Цитата || Печать || Комментарии:0 | |
21:54 Функция постраничной навигации в стиле Google |
#12 Функция постраничной навигации в стиле Google
Что то такое полезное....пригодиться за пазухой
Тема: Пагинатор в стиле Google
|
| Цитата || Печать || Комментарии:0 | |
21:47 Функция для редатирования и сохранения файлов |
#11 Функция для редатирования и сохранения файлов
В этой функции используется предыдущая функция chmod_();
Цитата |
<?php
/**
* @author Васинский Игорь Александрович
* @copyright 2011
*
* Функция редактирования файлов
*
* @param string $filename - путь/файл
*
* @return string $res - результат выполнения
*
* @call echo file_edit($filename);
*
* $_POST['edit_file'] - передано с textarea
*
* VAS_PATH - define("VAS_PATH", $_SERVER['DOCUMENT_ROOT']."/") корневая директория
*
*/
function edit_file($filename)
{
$new_data = $_POST['edit_file'];
$real_chmod = (int)chmod_($filename, "get");
chmod_($filename, "set", 0777);
if(@file_put_contents(VAS_PATH.$filename, stripslashes($new_data)))
$res = "Данные успешно сохранены!";
else
{
$res = "Ошибка сохранения данных!";
}
chmod_($filename, "set", $real_chmod);
return $res;
}
?> |
|
| Цитата || Печать || Комментарии:0 | |
21:44 Функция для определения и смены CHMOD файлов |
#10 Функция для определения и смены CHMOD файлов
Цитата |
<?php
/**
* @author Васинский Игорь Александрович
* @copyright 2011
*
* Функция просмотра и управления CHMOD файла/директории
*
* @param string target- путь/имя файла
* @param string action - set (выставить права) или get(считать права)
* @param integer chmod - права на файл/директорию в формате 0777
*
* @return string(action = set) / $view_chmod(action = get) - установленные права на файл
*
* @call chmod_("filename", "set");
*/
function chmod_($target, $action, $chmod = null)
{
if($action == "set")
{
chmod(VAS_PATH.$target, $chmod);
}
elseif($action == "get")
{
return $view_chmod = substr(sprintf('%o', fileperms(VAS_PATH.$target)), -4);
}
}
?> |
|
| Цитата || Печать || Комментарии:0 | |
15:34 Загрузка картинки для определённого юзера БД |
#9 Загрузка картинки для определённого юзера БД
была такая задача, пусть терь здесь висит, до ресайза руки не дошли!
Задача такая: При регистрации дать возможность юзеру загрузить своё фото, при этом при загрузке фото - переименовать его в id из БД этого юзера.
Цитата |
<?php
error_reporting(E_ALL);
/**
* @author I am
* @copyright 2011
*/
#имя файла из временной директории
$img_tmp = isset($_FILES['img']['tmp_name']) ? $_FILES['img']['tmp_name'] : null;
#Максимальный размер файла в байтах, ~460кб - достаточно для хорошего фото
$size = 460000;
#Вес в кб
$size_kb = $size / 1024;
#Разрешённые типы, лучше мы проверим mime type, расширение можно подделать
#Создадим индексный массив расширение => mime type
$ext = array("jpg", "jpeg", "bmp", "png");
#Создадим пустой массив для ошибок
$error = array();
#нажата submit и выбрана картинка, успешно загружена в tmp директорию
if(isset($_REQUEST['send']) AND is_uploaded_file($img_tmp))
{
#имя файла на локальном компе
$img_name = isset($_FILES['img']['name']) ? $_FILES['img']['name'] : null;
#вес файла в кб
$img_size = isset($_FILES['img']['size']) ? $_FILES['img']['size'] : null;
$img_size_kb = $img_size / 1024;
#myme type файла вида: image/x-png, используем str_replace чтобы получить только расширение - для сравнения с $ext
$img_type = isset($_FILES['img']['type']) ? str_replace("image/x-", "", $_FILES['img']['type']) : null;
#Проверим - не привышает ли максимальный размер наш загруженный файл
if($img_size > $size)
#Запишем ошибку в пустой массив $error
$error[] = "Максимальный размер разрешённого файла: ".$size_kb.", Ваша картинка: ".$img_size_kb."<br />";
#Проверим соответствует ли mime type, для этого поищем совпадения типа файла в нашем массиве $ext -
#у нас для этого есть in_array()!
#Мы пойдём от обратного - если совпадения нет - запишим ошибку в наш массив ошибок
if(!in_array($img_type, $ext))
$error[] = "Разрешено загружать картинки в формате JPG, JPEG, BMP, PNG<br />";
#Теперь нам остаётся загрузить и на лету переименовать файл
#Но мы не продолжим работу - если присутствуют ошибки!
#Если наш массив пуст - то ошибок нет и мы продолжаем
if(!$error)
{
#Сначала требуется проверка, был ли загружен файл во временную директорию, но так как у нас вначале скрипта стоит
#AND is_uploaded_file($img_tmp) - и раз мы здесь - значит загрузка прошла успешно, иначе бы и небыло $img_tmp
#нам остаётся переименовать и переместить его на постоянное место
#Чтобы переименовать картинку по id пользователя - нужно знать id пользователя но мы его не знаем ещё
#Чтобы узнать id есть 2 варианта: 1 - сделать запрос в БД с сортировкой по id DESC - т.е выташить id последнего
#увеличить его на 1, либо 2: записать все данные нового пользователя, вместо картинки указать null, сделать запрос в БД
#чтобы узнать значение id почследней вставленной записи - mysql_insert_id();
#сделать UPDATE avatar этой строки, 1й вариант повседневен
#а вот второй для практики не помешает - его и используем!
#Предположим что данные для нового юзера ты записал ранее этого кода, значит нам остаётся выташить последний ID
$lastID = mysql_insert_id();
#Теперь у нас есть ID - значит и новое имя файла, соберём имя картинки, так быстрей
#id.расширение(урезанный тип)
$img_name = $lastID.".".$img_type;
#обновим строку - запишем путь до аватара
#Заглушим ошибку -т.к. у нас есть свой массив ошибок
$query = @mysql_query("UPDATE `таблица` SET `avatar` = '/папка/".$img_name."'");
#Если запрос в БД прошёл, переименуем и переместим файл
if($query)
{
if(!$upload = move_uploaded_file($img_tmp, "/папка/".$img_name))
#Если перемещение файла не удалось - ошибка в массив
$error[] = "Не могу переместить файл в конечную папку";
}
#Если запрос не прошёл - запишем ошибку\
else
$error[] = "Не могу записать данные в БД";
}
#Самое время вывести ошибки - если они есть
if($error)
{
foreach($error as $errors)
{
echo $errors."<br />";
}
}
else
echo "Картинка переименована и размещена в конечной папке!"
}
?> |
|
| Цитата || Печать || Комментарии:4 | |
17:59 Запрет каширования AJAX (JQuery) |
#8 Запрет каширования AJAX (JQuery)
Возникла проблема, использую ajax для обработки данных -а именно: редактирование и сохранение файлов (шаблонов и т.д), так вот:
редактирую файл - жму сохранить - обработчик выдаёт "Всё пучком хозяин, я сохранил", лезу в редактор - там открыт этот файл - редактор говорит, что докумен обновлён - предлогает показать обновлённый - соглашаюсь, а там без изменений.
Оказалось - кеширование (причём тока на IE, Opera, FF - всё пучком), начал разнюхивать и вот:
функция jQuery $.ajax в качестве одного из аргуметнов принимает параметр cache (Boolean). Если cache=false, то jQuery автоматически добавит к запросу уникальный параметр (тот же timestamp). То есть приведенный выше код можно записать следующим образом:
Цитата |
$.ajax({
type: "GET",
url: "/users/list",
cache: false,
/* ... */
}); |
Тут подводный камень в том, что если используется POST вместо GET, то jQuery опускает этот самый уникальный параметр за (якобы) ненужностью. То есть, если запрос посылается через GET, то можно смело использовать cache: false, но если запрос — это POST без параметров, то придется добавлять что-то типа data: { tstamp: new Date().getTime() }.
|
| Цитата || Печать || Комментарии:0 | |
11:37 Режимы "Отладка" , "продакшн" и логирование ошибок |
#7 Режимы "Отладка" , "продакшн" и логирование ошибок
В принципе, я не искал решения н поисковиках или форумах, просто в один день решил использовать эти моменты и придумал такой механизм:
Цитата |
<?php
#Назначим константу для вкл, выкл режима "отладки"
#Если TRUE - режим отладки, FALSE - режим продакшн
define("DEBBUG", true);
#Так же не плохо было бы вести логирование ошибок
#Константа пути от корня
define(PATH, $_SERVER['DOCUMENT_ROOT']."/");
#Константа LOG-файла
define(LOG_ERROR, PATH."log/errors.log");
#Дата и время
$date = date("d.m.Y : h:m:s");
#грубая Функция записи ошибок в файл
function WriteError($error)
{
if($file=fopen(LOG_ERROR, "a"))
echo "Не могу откыть файл ".LOG_ERROR;
else
fputs ($file, $error);
fclose($file);
}
#Если режим отладки включен, включим вывод ошибок и нотисов
if(DEBBUG)
error_reporting(E_ALL);
if(DEBBUG)
{
mysql_query($query) or die(mysql_error());
$error = $date.": ".mysql_error());
WriteError($error);
}
else
{
mysql_query($query) or die("Извените, произошла ошибка, заходите позже!");
#А данные в логе об ошибке нам всёравно не помешают
$error = $date.": ".mysql_error());
WriteError($error); }
?> |
|
| Цитата || Печать || Комментарии:0 | |
11:15 Тернарный оператор (тернарная операция) |
#6 Тернарный оператор (тернарная операция)
Очень удобная штука ! значительно сокращает (упрощае читабильность) код.
Итак, представим условие, где нам нужно проверить например пришедшие данные с формы, например:
У меня есть привычка, не знаю хорошая или плохая, но по возможности я деаю форму обработчиком в дном файле.
Цитата |
# Форма
<form action="" method="POST">
Имя: <input type='text' name='user' /><br />
Комментарий:
<textarea name="comment">
</textarea><br />
<input type="submit" name="send" value="отправить"/>
</form> |
1. Обработчик, на той же странице, if - else.
Цитата |
<?php
// Проверим нажата ли кнопка отправить
<?php
if(isset($_POST['send']))
{
# Проверим имя отправителя
if(empty($_POST['name']))
echo "<span style='color:red'>Не заполнено поля Имя!<br /></span>";
else
$name = trim($_POST['name']);
# Проверяем данные на ваше усмотрение ...
# Поверим наличие текста комментария
if(empty($_POST['comment']))
echo "<span style='color:red'>Отсутствует текст комментария!<br /></span>";
else
$comment = trim($_POST['comment']);
# Если оба поля заполнены - работаем с данными
if($name AND $comment)
{
# Работаем с данными, пишем в файл, в БД и т.д.
echo "<span style='color:green'>Спасибо, ваш комментарий добавлен!</span>";
}
} |
2. Определение переменных с использыванием тернарного оператора
Цитата |
<?php
$name = isset($_POST['name']) ? trim($_POST['name']) : null;
$comment = isset($_POST['comment']) ? trim($_POST['comment']) : null;
if(isset($_POST['send']))
{
if(!$name)
echo "<span style='color:red'>Не заполнено поля Имя!<br /></span>";
if(!$comment)
echo "<span style='color:red'>Отсутствует текст комментария!<br /></span>";
if($name AND $comment)
{
# Работаем с данными, пишем в файл, в БД и т.д.
echo "<span style='color:green'>Спасибо, ваш комментарий добавлен!</span>";
}
}
?> |
Разбор полётов:
Цитата |
$name = isset($_POST['name']) ? trim($_POST['name']) : null; |
А работает это так:
переменная = условие ? если усовие выполнено : если условие не выполнено
Условие могут быть и по длиннее:
Цитата |
$name = (isset( $_POST['name'] AND strlen( $_POST['name']) > 3)) ? $_POST['name'] : null; |
|
| Цитата || Печать || Комментарии:4 | |
08:48 Котеров Дмитрий "PHP 5 в подлиннике" |
#5 Котеров Дмитрий "PHP 5 в подлиннике"
Рассматриваются основы функционирования Web-ссрверов, сборка исполняемого модуля РНР в ОС Unix, инструментарий Web-разработчика (в том числе утилиты отладки сценариев), синтаксис и стандартные функции языка. Приведено описание функций РНР для работы с массивами, файлами, СУБД MySQL, регулярными выражениями формата PCRE, графическими примитивами, почтой, сессиями, также ООП
Особое внимание уделено новым возможностям языка по работе с XML-документами, объектно-ориентированному программированию, а также подходам к отделению PHP-кода от HTML-шаблонов сайта.
Скачать здесь(12376 Kb)
|
| Цитата || Печать || Комментарии:0 | |
16:44 Замучала кодировка? или крякозябры (иеоглифы) на с |
#4 Замучала кодировка? или крякозябры (иеоглифы) на странице способы предотвращения и борьбы с ними.
Запомните эти простые правила, как "Отчи наш" - и данный вопрос вас больше не будет беспокоить:
Речь пойдёт на примере юникода - UTF-8
1. Сам файл страницы или скрипта должен быть сохранён в UTF-8 без BOM
2. Первой строчкой или до любого вывода отправьте кодировку в заголовке header:
Цитата |
header("Content-Type: content=text/html; charset=utf-8"); |
3. Если используется html разметка, то не стоит принебрегать мета-тегом
Цитата |
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
4. Укажите кодировку в файле .htaccess
Цитата |
AddDefaultCharset utf-8 |
5. При работе с БД MySQL
- сама БД создаётся в collation = utf8_general_ci
- Кодировка для ячеек таблицы - UTF-8
- MySQL connection collation: utf8_general_ci
- Если вы делаете импорт SQL из файла - то последите чтоб данные в БД вписались нормально, читабельно, а не в крякозябрах
- в конфиге сайта,сразу после соединения с БД добавьте:
Цитата |
mysql_query("SET NAMES 'utf8'"); |
или
Цитата |
mysql_set_charset('utf8'); |
|
| Цитата || Печать || Комментарии:0 | |
16:21 Составление правильно оформленного запроса в БД: |
#3 Составление правильно оформленного запроса в БД:
- почему-то многие игнорируют данные правила, но если они придуманы - значит они нужны и следовательно их нужно соблюдать!
1. Имена таблиц и столбцов необходимо заключать в апострофы (`name`)
2. Для переменных, констант PHP - используют конкатенацию или фигурные скобки и обрамляяют в одинарные ковычки, которые можно опустить если в переменной или константе передаются данные типа intger
3. Для отладки скрипта в котором осуществляестся работа с БД - к каждой функции PHP, работающей с БД - допишите mysql_error();
Пример:
Цитата |
$link = mysql_coonect("server", "user", "pass") or die(mysql_error()); |
Конкатенация:
Цитата |
$query = mysql_query("SELECT * FROM `table` WHERE `cell` = ' " . $var . " ' ") or die(mysql_error()); |
Использование фигурных скобок:
Цитата |
$query = mysql_query("SELECT * FROM `table` WHERE `cell` = '{$var}'") or die(mysql_error()); |
Переменная типа integer
Цитата |
$query = mysql_query("SELECT * FROM `table` WHERE `cell` = " . $var) or die(mysql_error()); |
Цитата |
$query = mysql_query("SELECT * FROM `table` WHERE `cell` = {(int)$var}") or die(mysql_error()); |
|
| Цитата || Печать || Комментарии:0 | |
08:49 Ошибки выдаваемые PHP |
#2 Ошибки выдаваемые PHP
На время тестироваия вашего кода в первой строке поставьте:
Цитата |
error_reporting(E_ALL); |
очень много интересного сможете увидеть, что спрятано от глаз человеческого
error_reporting – вывод ошибок
• E_ALL - Все предупреждения и ошибки.
• E_ERROR - Критические ошибки времени выполнения.
• E_WARNING - Предупреждения времени выполнения.
• E_PARSE - Ошибки трансляции.
• E_NOTICE - Замечания времени выполнения (это такие
предупреждения, которые, скорее всего,
свидетельствуют о логических ошибках в
сценарии, - например, использовании
неинициализированной переменной).
• E_CORE_ERROR - Критические ошибки в момент старта PHP.
• E_CORE_WARNING - Некритические предупреждения во время старта PHP.
• E_COMPILE_ERROR - Критические ошибки времени трансляции.
• E_COMPILE_WARNING - Предупреждения времени трансляции.
• E_USER_ERROR - Сгенерированные пользователем ошибки.
• E_USER_WARNING - Сгенерированные пользователем предупреждения.
• E_USER_NOTICE - Сгенерированные пользователем замечания.
|
| Цитата || Печать || Комментарии:0 | |
13:40 Зашита от F5 (повторная передача данных)) |
#1 Зашита от F5 (повторная передача данных))
Ранне почемуто этот момент меня мало интересовал, но сейчас решил уделить ему своё внимание.
О мерах: предотвращение повторной передачи данных методом $_POST (если пользователь не специально или предномеренно обновил страницу)
Знающим людям этот пример известен, а не знающим будет полезен.
Итак:
есть страница с формой (регистрация или авторизация - не суть)
Цитата |
<form method='POST' action='post.php'>
<input type='text' name='login'>
<input type='pass' name='password'>
<input type='submit' value='пошёл !'>
</form> |
есть страница куда эти данные отправляются (об обработки этих данных в целях безопасности я писать не буду - это другая тема)
Цитата |
<?php
session_start(); // стартуем сессию
if (empty($_SESSION['post_ok'])){ // проверяем - если сессия пуста то
// получаем данные
// обрабатываем
// записываем
$post_ok = 'true';
session_register('post_ok');
}
else { // если сессия не пуста то:
echo "Ваши данные уже были переданы и записаны";
}
?> |
Это только алгоритм, т.к. предназначение каждой формы может иметь специфический характер , например если форма регистрации - то ещё необходимо проверить - может такой логин уже занят.
P.S. МОЖНО НЕ ИСПОЛЬЗОВАТЬ СЕССИИ, А СДЕЛАТЬ РЕДИРЕКТ ЧЕРЕЗ HEADER и POST будут очищены.
|
| Цитата || Печать || Комментарии:2 | |
|
|
|