<MyRusakov.ru />

Создание движка на PHP и MySQL 2.0

Создание движка на PHP и MySQL 2.0

Видеокурс "Создание движка на PHP и MySQL 2.0" научит Вас создавать профессиональные движки для сайтов на PHP и MySQL с использованием ООП и паттерна MVC.

В курсе разобрана вся теория по структуре движка: как всё устроено, какие должны быть объекты, какая у них иерархия и как они взаимодействуют между собой.

В практической части будет создан движок с чистого листа. Будет создано ядро, все адаптеры, все вспомогательные классы, а также классы для работы с объектами базы данных. И чтобы курс был максимально полезным, будет создан движок для сайта MyRusakov.ru.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Рекурсия в PHP

Рекурсия в PHP

Что-то такое рекурсия, многие из Вас знают. Но, на всякий случай, рекурсия - это вызов функции внутри самой себя. Однако, это определение все знают, но вот с пониманием возникают неясности. Я решил в этой статье разобрать рекурсию в PHP на достаточно простом и реальном примере из практики.

Не секрет, что все данные (за редким исключением), приходящие из форм, надо пропускать через функцию htmlspecialchars(), дабы избежать XSS. И я думаю, что Вы знаете, что некоторые входные данные являются массивами (например, при той же загрузке файлов). И наша с Вами задача написать такую функцию, которая принимает массив всех входящих данных, а также учесть, что среди этих данных есть также массивы, внутри которых также могут быть массивы и так далее.

Привожу код функции:

<?php
  function xss($data) {
    if (is_array($data)) { // Если это массив
      $result = array(); // Создаём новый массив
      foreach ($data as $key => $value) { // Перебираем исходный массив
        $result[$key] = xss($value); // Рекурсивно вызываем функцию xss
      }
      return $result; // Возвращаемый "защищённый" массив
    }
    return htmlspecialchars($data, ENT_QUOTES); // Если это не массив, то вызываем htmlspecialchars()
  }
  $data = xss($_REQUEST); // Пример вызова функции
?>

Ключевым моментом здесь является, что внутренних массивов внутри входящего $data может быть очень много, поэтому без рекурсии в PHP здесь не обойтись. А сам алгоритм простой:

  1. Если входящие данные - это НЕ массив, то просто вызываем функцию htmlspecialchars().
  2. Если входящие данные - это массив, то перебираем все элементы массива и для каждого вызываем эту же функцию. А дальше возвращаемся к пункту 1.

Я понимаю, что для новичков рекурсия в PHP - это достаточно сложная вещь, но я рекомендую прямо пройтись по коду, как будто Вы интерпритатор PHP. Тогда станет всё яснее.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (6):

malina95 malina95 07.11.2012 22:00:41

А зачем нужен глобальный массив $_REQUEST ? Что-то то я не могу понять

Ответить

cyber93 cyber93 07.11.2012 22:56:31

Владислав, для того чтобы хранить переменные, которые Вы передаете через HTTP запрос. Например данные из формы методом POST или GET значения после знака "?" в url или когда получаете куки в заголовках. POST, GET, COOKIE данные хранятся в глобальном массиве $_REQUEST.

Ответить

malina95 malina95 07.11.2012 23:24:33

Я это знаю, но я читал что таое не безопасно делать в любых функциях

Ответить

Admin Admin 08.11.2012 04:45:38

$_REQUEST здесь просто как пример. В нём хранится очень много данных, о которых Максим написал выше, и можно всё обезопасить. На практике же вызывается данная функция для $_POST, для $_GET иля для $_FILES. А иногда действительно используется $_REQUEST, ничего опасного в этом нет. Данный массив столько же опасен, сколько, например, и $_GET.

Ответить

malina95 malina95 08.11.2012 14:18:23

Я так и думал, но просто я однажды переводил один английский сайт(ссылку не помню) и там было написано что в функциях лучше не выводить никакие глобальные массивы как гет или пост, потому что незначительно падает скорость и безопасность... Значит всё таки неправду пишут :)

Ответить

Олег Олег 20.09.2013 22:10:32

Здравствуй Михаил! Вот рекурсия с "htmlspecialchars" из твоих уроков. Я попробовал проверить работу рекурсии двумерным массивом. Почему то у меня не в одном браузере функция "htmlspecialchars" в рекурсии с двумерным массивом не срабатывает! Я что то делаю не правильно? function secureData($data) { foreach ($data as $key => $value) { if (is_array($value)) secureData($value); else $data[$key] = htmlspecialchars($value); } return $data; } print_r (secureData($data));

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.