mJournal
· Форум · Участники · Журналы · Случайный журнал ·
Главная -> Журналы -> Игорь_Vasinsky
PHP во сне и на яву
 
08 сентября 2011
  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):

user posted image


Эх.. не победил я ещё регулярки (т.е. паттерны), а так бы раскрасить можно было по красивше.

p/s Рассматривал так же возможность одного вызова, использовав 4 аргумента (под 4 массива) и так же если время будет - подкорректировать её под любой массив. Вообщем эти 2 момента оставлю на апгрейт.


| Цитата || Печать || Комментарии:6 |

31 августа 2011
  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 |

16 июня 2011
  21:54   Функция постраничной навигации в стиле Google
#12 Функция постраничной навигации в стиле Google
Что то такое полезное....пригодиться за пазухой wink.gif

Тема: Пагинатор в стиле 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 |

15 июня 2011
  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 в подлиннике"

user posted image

Рассматриваются основы функционирования Web-ссрверов, сборка исполняемого модуля РНР в ОС Unix, инструментарий Web-разработчика (в том числе утилиты отладки сценариев), синтаксис и стандартные функции языка. Приведено описание функций РНР для работы с массивами, файлами, СУБД MySQL, регулярными выражениями формата PCRE, графическими примитивами, почтой, сессиями, также ООП

Особое внимание уделено новым возможностям языка по работе с XML-документами, объектно-ориентированному программированию, а также подходам к отделению PHP-кода от HTML-шаблонов сайта.

Скачать здесь(12376 Kb)


| Цитата || Печать || Комментарии:0 |

13 июня 2011
  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 |

17 марта 2010
  08:49   Ошибки выдаваемые PHP
#2 Ошибки выдаваемые PHP

На время тестироваия вашего кода в первой строке поставьте:
Цитата
error_reporting(E_ALL);

очень много интересного сможете увидеть, что спрятано от глаз человеческого wink.gif

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 |

16 марта 2010
  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 |

 
Игорь_Vasinsky


★ЛжеЭксперт★


Регистрация 14.03.2010
E-mail Отправить
Приват Отправить
WWW Перейти
ICQ 608058768
Профиль Перейти
Рейтинг
Рейтинг: 4.2    Голосов: 14
Список друзей
inpost INSIDIOUS quickxyan
sharki stepan twin
zvezda_t
Календарь
март 2012
пн вт ср чт пт сб вс
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Статистика
Просмотры
Сегодня: 1
Всего: 7101
Хосты
Сегодня: 1
Всего: 7089
Последний комментарий
[6] Отладка скриптов PHP...
15.12.2011 20:05
Написал: Игорь_Vasinsky
[4] Тернарный оператор (...
09.09.2011 09:49
Написал: Игорь_Vasinsky
[4] Загрузка картинки дл...
09.09.2011 09:09
Написал: Игорь_Vasinsky
[2] Зашита от F5 (повто...
20.03.2010 20:30
Написал: Игорь_Vasinsky