- •Государственное образовательное учреждение высшего профессионального образования Волго-Вятская академия государственной службы
- •Разработка Web-приложений
- •Часть 2. Основы php – основного языка создания Web - приложений
- •Оглавление
- •Глава 1. Основы языка php 7
- •Глава 2. Синтаксис и семантика операторов php 58
- •Глава 3. Массивы 103
- •Глава 4. Функции 141
- •Глава 5. Работа с файлами 198
- •Глава 6. Вопросы и задания 271
- •Глава 1.Основы языка php
- •1.1.Замечания о некоторых особенностях языка и среды его выполнения
- •1.2. Как работает обработчик кода php
- •1.3. Синтаксис php – начальные сведения
- •1.3.1. Как интерпретатор распознаёт (различает) код php
- •1.3.2. Синтаксис php разрешает совместное и раздельное использование кода php и html
- •Пример 1‑1
- •1.3.3. Другие особенности синтаксиса php начального уровня
- •Пример 1‑2
- •Наиболее часто применяемые символы управляющих последовательностей
- •1.4. Синтаксис php –типы данных, строки, переменные, константы, функции и выражения
- •1.4.1. Основы понятия «типы данных». Классификация данных в php
- •Скалярных типов (всего четыре):
- •Смешанных типов (всего 2):
- •Специальных типов (всего 2):
- •1.4.2. Интервалы значений числовых данных в php
- •1.4.2.1. Целые числа
- •1.4.2.2.Вещественные (с плавающей точкой) числа
- •1.4.3. Элементы языка, которые «держат» данные. Их синтаксис
- •1.4.3.1. Постановка задачи
- •1.4.3.2. Строки
- •Пример 1‑3
- •Пример 1‑4
- •1.4.3.3. Переменные
- •Пример 1‑5
- •Пример 1‑6
- •Пример 1‑7
- •1.4.3.4. Константы
- •Пример 1‑8
- •1.4.3.5. Функции в php – введение в тему
- •Пример 1‑9 – обобщённая схема определения функции
- •Пример 1‑10
- •1.4.3.6. Функции php по работе с данными
- •Пример 1‑11
- •Пример 1‑12
- •Пример 1‑13
- •Пример 1‑14
- •Пример 1‑15
- •1.4.3.7. Функции php по работе со строками
- •Пример 1‑16
- •Пример 1‑17
- •Пример 1‑18
- •Пример 1‑19
- •1.4.3.8. Понятие «выражение» в php
- •1.4.3.9. Манипуляции с типами
- •Глава 2. Синтаксис и семантика операторов php
- •2.1. Классификация операторов php и порядок их выполнения
- •О ператоры php в порядке убывания приоритета
- •2.2. Математические операторы
- •2.2.1. Арифметические операции
- •Арифметические операторы php
- •Пример 2‑20
- •2.2.2. Математические функции
- •2.2.3. Операторы присваивания
- •Пример 2‑21
- •2.2.4. Операторы инкремента (увеличения) и декремента (уменьшения)
- •Пример 2‑22
- •2.2.5. Строковые операторы
- •Пример 2‑23
- •2.2.6. Побитовые операторы
- •Пример 2‑24
- •Побитовые операторы php
- •2.2.7. Класс логических операторов
- •2.2.8. Операторы (конструкции) управления выполнением скрипта
- •2.2.8.1. Операторы условного перехода
- •If ( условие )
- •Пример 2‑25
- •2.2.8.2. Расширение оператора if - оператор elseif
- •If (выражение) блок_выполнения
- •Пример 2‑26
- •Пример 2‑27
- •Оператор переключения "switch" ("выбор")
- •Пример 2‑28
- •2.2.9. Операторы цикла
- •2.2.9.1. Простейший оператор цикла – цикл с предусловием - оператор while
- •While (выражение) {блок_выполнения}20
- •While (выражение): блок_выполнения endwhile;
- •Пример 2‑29
- •2.2.9.2. Цикл с постусловием - оператор do while
- •2.2.9.3. Циклы for
- •Пример 2‑30
- •Пример 2‑31
- •Пример 2‑32
- •2.2.9.4. Частные случаи использования цикла for в php
- •Пример 2‑33
- •Пример 2‑34
- •Пример 2‑35
- •Пример 2‑36
- •2.2.9.5. Об альтернативном синтаксисе операторов цикла
- •Глава 3. Массивы
- •3.1. Общие вопросы использования массивов в php: определение, типы, использование в выражениях и размерность
- •3.2. Создание массивов и особенности их использования в php
- •Пример 3‑37
- •Пример 3‑38
- •3.3. Операции с массивами
- •3.3.1. Вывод элементов массива на экран
- •Пример 3‑39
- •3.3.2. Изменение, перебор элементов и удаление элементов массива
- •Пример 3‑40
- •Пример 3‑41
- •3.3.3. Сортировка массива
- •Пример 3‑42 - сортировка массивов
- •Array(день1,день3, день11, день111);
- •Array(5,1,3,день1,день5,день3,day1,"яблоко","груша","apple")
- •3.3.4. Преобразование строк в массивы и наоборот
- •Пример 3‑43
- •3.3.5. Примеры специальных функций обработки массивов
- •Extract (имя_массива)
- •Пример 3‑44 - использование array_merge() с параметрами разных типов в php 5
- •Пример 3‑45 – обработка массивов
- •3.3.6. Функции по работе с массивами для самостоятельного изучения
- •3.4. Многомерные массивы
- •3.4.1. Введение
- •Пример 3‑46
- •3.4.2. Создание многомерных массивов
- •Пример 3‑47
- •Пример 3‑48
- •3.4.3. Ссылки на элементы многомерных массивов
- •3.4.4. Перебор элементов многомерных массивов
- •Пример 3‑49
- •3.4.5. Операторы над массивами
- •Операторы над массивами
- •Пример 3‑50
- •Глава 4.Функции
- •4.1. Введение
- •4.2.Создание, подключение и использование собственных функций в php
- •4.2.1. Синтаксис описания функции
- •4.2.2. Описание работы функции навигации по страницам сайта
- •4.2.3. Архитектура проекта, иллюстрирующего работу функции
- •Пример 4-1 - код «простого» решения
- •Пример 4‑2 - текст файла index.Php
- •4.3. Передача данных в функцию
- •4.3.1. Передача в функцию списка простых данных
- •Пример 4‑6
- •Пример 4‑7
- •4.3.2. Передача массивов в функцию
- •Пример 4‑8
- •Пример 4‑9
- •4.3.3. Функции с переменным числом аргументов
- •Пример 4‑10
- •4.3.4. Два способа передачи аргументов в функцию
- •4.3.5. Ссылка в php
- •4.3.6. Передача аргументов в функцию по ссылке
- •Пример 4‑11
- •4.4. Организация возврата значений из функции в вызывающий её скрипт
- •4.4.1. Функции, возвращающие единичные (скалярные) значения
- •Пример 4‑12
- •Пример 4‑13
- •4.4.2. Функция, возвращающая массив. Использование списков
- •Пример 4‑14
- •4.4.3. Функция, возвращающая ссылки
- •Пример 4‑15
- •4.5. Типизация переменных в php по их «области действия», «видимости» и «времени жизни». Глобальные, суперглобальные и статические переменные
- •4.5.1. Общие положения
- •Пример 4‑16
- •4.5.2. Предопределённые переменные и суперглобальные массивы
- •Пример 4‑17
- •4.5.3. Статические переменные
- •Пример 4‑18
- •4.6. Дополнительные возможности работы с функциями в php
- •4.6.1 Переменные, ссылающиеся на функции
- •Пример 4‑19
- •4.6.2. Условное (динамическое) описание функций
- •Пример 4‑20
- •4.6.3. Вложенные функции и вложенные файлы
- •Где хранить эти файлы?
- •Какую команду надо использовать, чтобы вставлять файл в нужное место?
- •Какими должны быть синтаксис и расширение таких файлов?
- •Пример 4‑511
- •4.6.4. Обработка ошибок в функциях пользователя
- •Пример 4‑22
- •4.7. Рекурсивное использование функций
- •4.7.1. Рекурсивные и итеративные функции – в чём разница, недостатки и преимущества
- •Пример 4‑23
- •4.8. Основные итоги по теме «Функции»
- •Глава 5.Работа с файлами
- •5.1. Возможности работы с файлами в php
- •5.1.1. Введение
- •5.1.2. Понятия и термины, связанные с понятием «файл»
- •5.1.2.1. Понятие файла и файловой системы
- •Свойства файла
- •Операции и сущности, связанные с файлами
- •Бинарные (двоичные) и текстовые файлы
- •5.2. Функция открытия файла - базовая функция при работе с файлам. Особенности обращения к файлам
- •5.2.1. Синтаксис функции открытия файла
- •Пример 5‑52
- •5.2.2. Абсолютные и относительные пути (дорожки) до файла
- •5.2.3. Понятие унифицированного (единообразного) идентификатора ресурса - uri
- •5.2.4. Уточнение возможных ссылок на файлы и особенности работы с ними
- •Пример 5‑53
- •Пример 5‑54
- •Перечень некоторых предопределённых констант php
- •5.3. Примеры использования других функций для работы с файлами
- •5.3.1. Проверка существования файла
- •5.3.2. Проверка существования и размера файла
- •Int filesize(string имя_файла)
- •5.3.3. Закрытие файла после завершения работы с ним
- •Int fclose(int дескриптор файла)
- •5.3.4. Основные операции с открытыми файлами
- •5.3.4.1. Запись в файл
- •Int fwrite(int дескриптор, string stroka[, int длина])
- •5.3.4.2. Запись файла целиком
- •Пример 5‑55
- •5.3.4.3. Чтение из файла
- •Пример 5‑56
- •5.3.5. Специальные случаи чтения файлов
- •5.3.5.1. Чтение строк текста: функция fgets( )
- •5.3.5.2. Чтение строк текста c отбрасыванием html тегов: функция fgetss( )
- •5.3.5.3. Посимвольное чтение файла: функция fgetс( )
- •Пример 5‑57
- •5.3.5.4. Чтение файла в индексированный массив: функция file()
- •5.3.5.5. Чтение файла целиком в строку: функция file_get_contents()
- •5.3.5.6. Чтение файла с его синтаксическим разбором: функция fscanf()
- •Пример 5‑58
- •5.4. Функции для операций над каталогами
- •Перечень функций по работе с каталогами
- •5.4.1. Получение дорожки до текущего скрипта и его имени
- •5.4.2. Чтение всего содержимого каталога
- •Пример 5‑8
- •5.4.3. Печать дерева каталогов
- •Визуальное отображение дерева каталогов для текущего каталога ТекКат
- •Пример 5‑9
- •5.5. Общая классификация функций php по работе с файловой системой
- •Категории функций php по работе с файловой системой
- •5.6. Права пользователей по доступу к файлам
- •5.6.1. Определение прав доступа
- •5.6.2. Описание прав доступа в системе unix и их реализация
- •Пример записи прав доступа к файлу для разных групп пользователей
- •B. Матричный вид
- •5.6.3. Особенности управления доступом к файлу в php
- •Глава 6.Вопросы и задания
- •6.1. Вопросы и задания к главе 1(Основы языка php)
- •6.1.1.Контрольные вопросы к главе 1
- •6.1.2. Задания к главе 1
- •6.2. Вопросы и задания к главе 2 (Синтаксис и семантика операторов php)
- •6.2.1.Контрольные вопросы к главе 2
- •6.2.2. Задания к главе 2
- •6.3. Вопросы и задания к главе 3 (Массивы)
- •6.3.1.Контрольные вопросы к главе 3
- •6.3.2. Задания к главе 3
- •6.4. Вопросы и задания к главе 4(Функции)
- •6.4.1.Контрольные вопросы к главе 4
- •6.4.2. Задания к главе 4
- •6.5. Вопросы и задания к главе 5(Работа с файлами)
- •6.5.1.Контрольные вопросы к главе 5
- •6.5.2. Задания к главе 5
- •Рекомендованные для работы с пособием источники
- •32 Монтирование файловой системы — процесс, подготавливающий раздел диска к использованию операционной системой.
5.6.3. Особенности управления доступом к файлу в php
Опишем логику управления правами доступа к файлам в PHP. Чтобы разобраться в этом, необходимо отчетливо представить себе процесс работы сайта на сервере по этапам52.
Пусть в нашей модели программист создаёт сайт для себя и пишет его, используя тэги и элементы управления HTML, а также скрипты на PHP.
Далее программист завел себе хостинг, и созданный сайт переписал в папку, которую ему хостер выделил под это дело. При этом он использовал логин и пароль, который заранее обговорил со своим администратором хоста.
После этого он является владельцем всех папок и файлов, находящихся в той зоне, где действуют его логин и пароль на сервере. У него, как у собственника, права доступа – rwx, или в цифровом представлении - 7. Владельцем он станет только тогда, когда система попросит от него логин и пароль, и он авторизуется в ней. Только после этого, для него будут доступны те полные права, о которых мы говорили.
Группу (group), связанную с папками и файлами созданного сайта, определяет суперпользователь, то есть администратор вашего хостинга, например user. В целях безопасности сервера он, обычно ставит права для этой группы r-x или в цифровом представлении - 5. Группа - это те пользователи, которые уже зарегистрированы в системе и которых суперпользователь может связать с сайтом (обычно, этого никто не делает – то есть, администратором сайта такая группа, как правило, не создаётся).
Всем остальным пользователям, то есть тем, кто, в итоге, будет пользоваться созданным сайтом и заходить на сайт через браузер, суперпользователь сразу ставит права доступа только на чтение - r--, или в цифровом представлении - 4. Отметим, что программист-владелец сайта, при входе в него через браузер, для системы так же будете являться обычным пользователем Интернет, так как при использовании сайта в пределах браузера, он не сможет авторизироваться как Владелец ресурса (совокупности файлов, объединённых в папках).
Сайт работает. Это означает, что работают скрипты, созданные программистом. И вот, самое главное - сервер (ОС UNIX) воспринимает эти скрипты как владельца (owner).
Поэтому:
«Владелец - скрипт может читать файлы» - это означает, что при запуске скрипта, читающего какой-либо файл сайта, система понимает, что скрипт запустил owner, и к нему просматривается последняя цифра доступа к данному файлу. Если она 4, 5, 6 или 7 (004, 005, 006, 007), скрипт может прочитать файл и выдать результат в программу, запущенную запросом пользователя, зашедшего на сайт, и, в итоге, вернуться к нему в виде распечатки. Кроме этого, система просматривает и права доступа к каталогу, где лежит файл. Они должны быть: 1, 5 или 7 (001, 005, 007), чтобы программа могла зайти в каталог и прочитать известный ей файл. То есть, необязательно ставить права доступа к папке, где лежит простой и неизменяемый в размерах файл, 007 и права доступа к самому этому файлу 005, 006, 007. Достаточно поставить на папку 001, а на файл 004. Если права будут ниже этих цифр, то процесс, запущенный пользователем, ничего не прочитает из вашего файла. Кроме этого, если на папку поставить права (005, 007), все юзеры Интернета смогут прочитать содержимое такого каталога, что не совсем правильно.
«Пользователи могут изменять файлы» - это значит, запускается скрипт на сайте, который сначала читает файл, а потом пытается его изменить. Система понимает, что скрипт запустил владелец, и к нему просматривается последняя цифра доступа к данному файлу. Если она 6 или 7 (006, 007), то скрипт может прочитать, а потом и изменить файл, к которому было обращение, и выдать результат - программу, запущенную юзером, и, в итоге, вернуться к нему в виде распечатки. То есть, в данном случае прав доступа 002 (-w-), только запись, не хватит, так как перед изменением файла, его обязательно надо сначала прочитать. Кроме этого, система просматривает и права доступа к каталогу, где лежит файл. Они должны быть: 1, 5 или 7 (001, 005, 007), чтобы программа могла зайти в каталог и прочитать известный ей файл. То есть, необязательно ставить права доступа к каталогу, где лежит изменяемый в размере файл, 007 и права доступа к самому этому файлу 007, можно поставить на папку 001, а на файл 006. Если права будут ниже этих цифр, процесс, запущенный пользователем, ничего не запишет в ваш файл и ничего не прочитает из вашего файла. Кроме того, если на папку поставить права (005, 007), все юзеры Интернета смогут прочитать содержимое такого каталога, что не совсем правильно.
«Пользователи могут изменять каталог» – это означает, что запускается скрипт на сайте, который пытается записать файл в каталог или стереть его оттуда. Система понимает, что скрипт запустил юзер и к нему просматривается последняя цифра доступа к каталогу, она должна быть 3 или 7 (003, 007). Только тогда ваш скрипт, запущенный юзером, может записать в данный каталог файл или стереть его оттуда. Если права к такому каталогу будут 006 (чтение и запись), то прав не хватит, так как скрипт не сможет зайти в каталог, если будет 005 (чтение и заход в каталог) - это значит, что запись запрещена. То есть, на такие каталоги лучше ставить права 003. Однако, если поставить права доступа 007, то все юзеры Интернета смогут прочитать содержимое такого каталога, что не совсем правильно.
Обычно на сервере, куда размещают сайты, стоят такие права доступа:
На папки - 755 (rwxr-xr-x). При этом владелец (пользователь, user) может всё, группа и все остальные могут читать папки и заходить в них. Записывать файлы, изменять названия файлов, стирать файлы в папках им запрещено.
На файлы – 644 (rw-r--r--). Тогда владелец может читать и изменять файлы, исполнять их ему запрещено, все остальные могут файлы только читать, а изменять и исполнять им запрещено.
Все файлы и папки унаследуют именно такой порядок доступа. Как видите, на сайте с обычным html текстом, где нет файлов, которые надо менять, таких прав доступа вполне хватает.
Но, как правило, сайты используют базы данных, информация в которых, в процессе работы пользователей, постоянно меняется. Вспомним, что даже владелец сайта, который имеет хостинг и сам «залил» сайт, будет заходить на сайт как анонимный пользователь, а не как владелец.
Тогда права доступа должны выглядеть так:
Папки, все (в том числе, с базами данных) 711
Папки, куда должны записываться, стираться файлы 733
Простые файлы для чтения (.html, .php) 744
Файлы с базами данных (.dat) 766
Если на всех Ваших папках стоят права 711 или 733, то все ваши скрипты будут спокойно заходить во все папки и читать оттуда файлы и преспокойно работать. А юзеры Интернета не смогут браузером прочитать содержимое таких папок, если, конечно, они не знают название файлов. Если название файла юзеру будет известно, то он сможет в браузере набрать папку/название_файла и получить его распечатку. Как создать папки, где информацию нельзя считать вообще53. На это есть специальные файлы .htaccess, но их использование сильно тормозит сервер, поэтому лучше их использовать на тех папках, где лежат пароли или настройки сайта. На все остальные папки надо ставить права доступа 711 - этого вполне хватит. Кроме этого, на те папки, куда будут записываться - стираться файлы, ставьте права 733, не надо ставить 777 – в этом нет смысла, так как, если стоят права 733 – это значит, что пользователь не сможет отдельно от ваших скриптов читать содержимое каталогов.
На все файлы, которые не будут меняться, права должны быть не выше 744 (файлы .html, .php, и др.). На файлы с базами данных (.dat) ставьте 766. Обратите внимание, что на файлы мы вообще не ставим самые большие права 777, так как это совершенно не нужно и даже очень опасно.
После проведённого анализа становится понятным следующее:
Права на доступ к файлам, залитым на сайт, может менять только администратор хостинга.
Владелец файла может сделать изменения только через клиенты файловых менеджеров, такие как Far, Total Commander, Cute FTP и другие.
Администратор сайта может использовать специальную команду chmod. Эту команду, с существенными ограничениями, можно использовать и в скриптах php. Рассмотрение этой команды в данном пособии не предусмотрено.
Рис. 5‑21. Иллюстрация распределения прав.