Вы находитесь на странице: 1из 167

Константин Шереметьев www.sheremetev.

info
__________________________________________________________________

1
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

ВНИМАНИЕ!

Это — не бесплатная электронная книга!

ВСЕ ПРАВА ЗАЩИЩЕНЫ.

Любое копирование, воспроизведение, хранение в


информационных системах или передача в любой форме и
любыми средствами — электронными, механическими,
посредством фотокопирования, записи или иными — любой
части данной книги запрещено без письменного разрешения
владельцев авторских прав.

ООО «Арнион Центр» © 2019 г.

Все права сохранены. Запрещается любое копирование, переработка,


распространение и размещение любой части данного контента в
информационном пространстве и поисковых системах сети Интернет.

Опубликовано:
ООО «Арнион Центр»
Проект Константина Шереметьева
Автор Константин Шереметьев
Сайт: www.sheremetev.info
E-mail службы поддержки: zakaz@sheremetev.info

2
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Содержание

Введение ............................................................................................5
1. Основы языка PHP ...........................................................................6
1.1 Установка среды PHP-express ........................................................6
1.2 Технологии Интернета ..................................................................9
1.3 Протокол HTTP ........................................................................... 13
1.4 Язык разметки HTML .................................................................. 17
1.5 Минимальная программа на PHP .................................................. 21
1.6 Модель языка PHP ...................................................................... 23
2. Функции и типы данных ................................................................. 26
2.1 Ключевые особенности PHP ........................................................ 26
2.2 Переменные и функции .............................................................. 29
2.3 Сборка веб-страницы ................................................................. 33
2.4 Использование функций в PHP .................................................... 36
2.5 Типы данных ............................................................................. 40
2.6 Массивы .................................................................................... 48
3.Разработка программ ...................................................................... 53
3.1 Структура проекта ..................................................................... 53
3.2 Константы и операторы .............................................................. 60
3.3 Язык описания стилей CSS ......................................................... 66
3.4 Основы верстки ......................................................................... 71
3.5 Работа со строками .................................................................... 75
3.6 Работа с файлами....................................................................... 79
4. Основы MySQL .............................................................................. 82
4.1 Взаимодействие PHP и MySQL ..................................................... 82
4.2 Язык запросов SQL ..................................................................... 85
4.3 Менеджер БД phpMyAdmin .......................................................... 89
4.4 Реляционные базы данных.......................................................... 93
4.5 Работа с объектами MySQL .......................................................... 97
4.6 Работа с датой и временем ....................................................... 105
5. Работа с посетителями сайта ........................................................ 110
5.1 Как анализировать посетителя сайта ......................................... 110
5.2 Хранение данных о посетителе ................................................. 114
5.3 Сессии..................................................................................... 118
5.4 Регистрация посетителей .......................................................... 123
5.5 Организация работы с паролями ............................................... 128
5.6 Администрирование сайта......................................................... 132
6. Графическая библиотека GD ........................................................ 135
6.1 Проверка наличия GD............................................................... 135
6.2 Графические примитивы ........................................................... 139
6.3 Текст и трансформации ............................................................ 141
6.4 Работа с графическими файлами ............................................... 144
3
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
6.5 Трансформация изображений.................................................... 147
6.6 Совмещение изображений ........................................................ 149
7. Разработка веб-сервиса ............................................................... 152
7.1 Регистрация на хостинге ........................................................... 152
7.2 Знакомство с хостингом ............................................................ 154
7.3 Перенос проекта на хостинг ...................................................... 157
7.4 Реализация проекта ................................................................. 159
7.5 Развитие проекта ..................................................................... 161
7.6 Развитие профессионализма ..................................................... 164
Заключение .................................................................................... 167

4
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Введение
Здравствуйте! Меня зовут Константин Шереметьев, и мы начинаем курс
«Программирование на PHP и MySQL». Сейчас я кратко расскажу о том,
что же будет в курсе, и что будем изучать.

Есть такие названия как «Википедия», «Facebook», «WordPress». Что это


такое? Это очень популярные веб-сервисы. Что их объединяет? Они
написаны на языке PHP. Более того, 80% сайтов, которые в 2018 году
есть во всемирной паутине, написаны на PHP. И вот следующий язык
Java занимает всего лишь 9%, т.е. язык №2 чуть ли не в 10 раз хуже по
распространенности. Почему так?

Теперь как раз и нужно познакомиться с PHP. PHP – это


специализированный язык для разработки веб-сервисов, разных сайтов,
порталов. Более того, даже вы сейчас смотрите этот курс на платформе
«Автоофис», который тоже написан на PHP. И в силу того, что это
специализированный, не универсальный язык, вы не можете его
использовать вне веб-программирования. Были какие-то попытки, но это
всё несерьезно. Но когда есть какой-то инструмент, который
предназначен для конкретной задачи (например, есть консервный нож.
Он предназначен для того, чтобы вскрывать консервы), то он прекрасно
с этой задачей справляется. Здесь та же самая ситуация.

Язык PHP и система управления базами данных MySQL организована и


сделана так, чтобы максимально эффективно разрабатывать сервисы. У
нас будет специальный урок, где мы рассмотрим как раз модель PHP и
то, почему она так эффективно работает.

Соответственно, если вы хотите разрабатывать что-то для интернета, то,


конечно, сейчас самый лучший и единственный выбор – это изучить
связку «PHP и MySQL». И как раз в нашем курсе мы это и будем делать.

5
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
1. Основы языка PHP
1.1 Установка среды PHP-express
Продолжаем наш курс «Программирование на «PHP и MySQL». Сейчас у
нас глава 1 «Основы языка PHP».

Пару слов о его распространенности. Язык программирования PHP в


настоящее время – это самый популярный язык для создания сайтов и
веб-сервисов. Рейтинг можно посмотреть здесь
https://www.wappalyzer.com/categories/programming-languages. Есть
такой сайт, на котором можно посмотреть популярность тех или иных
технологий. Я скопировал этот график сюда, и здесь видно, что PHP
сейчас занимает 81% всех разрабатываемых проектов в интернете. И из
этой главы вы поймете, почему это так.

Но прежде, чем мы перейдем к изучению языка, нам нужно установить


рабочую среду. Итак, урок 1.1 «Установка среды PHP-express».

6
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

У вас в курсе есть файл «PHP-express.zip». Первое, что вы должны


сделать – это скопировать этот файл в папку «c:\Prog» (вот папка
«c:\Prog», и я его уже скопировал). Второе действие – вы должны
распаковать PHP-express в папку «c:\Prog». Для этого заходим сюда,
выделяем 3 папки и перетаскиваем в «Prog», и начинается распаковка.
Пока идет распаковка, наша задача будет запустить файл
«c:\Prog\UwAmp\UwAmp.exe» и получить результат. Это то, что нам
нужно для работы. Что здесь изображено? Это веб-сервис «Apache», с
которым мы будем работать, и сервис баз данных «MySQL», который нам
тоже нужен.

Сборка распаковалась, переходим в «Prog». Файл «PHP-express.zip»


можем удалить, он нам уже не нужен. Итак, у нас есть 3 папки, нам
нужно зайти в папку «UwAmp» и здесь запустить приложение «UwAmp».
Мы должны увидеть вот такую картину: у вас должно быть написано:
«Apache : Running» и «MySQL : Running». Сейчас здесь всё хорошо, но
если сервис не запустился, тут будет написана какая-то ошибка, то вам
нужно зайти в папку «Prog\UwAmp\lib» и запустить сначала «vc12», т.е.
установить библиотеки «Visual C» 2012 года. Затем, если опять не
запускается, то запустить программу библиотеки 2017 года. У вас
должно всё получиться, но если у вас не получается, значит, у вас не
хватает библиотек. Этот сервер «UwAmp» требует «Windows 7» и выше,
т.е. 7, 8, 10. Если у вас «Windows XP», то этот сервер у вас не
запустится, следовательно, курс вы пройти не сможете.

Если у нас всё получилось, мы готовы к работе, то при первом запуске у


вас появится оповещение «Windows» (т.к. я не первый раз запускаю, то
у меня его сейчас не было) о том, что «Apache» и «MySQL» пытаются
запуститься. В данном случае вам нужно разрешить доступ, т.е. 23 раза
нажать на «Разрешить доступ».

7
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Если у вас по каким-либо причинам что-то не пошло, или были какие-то


сбои, то как полностью удалить сборку «PHP-express»? Сборка «PHP-
express» содержит 3 независимых программы, каждая из которых в
своей папке: «Geany», «Kompozer», «UwAmp». Для полного удаления
вам нужно удалить все 3 папки. Также можете удалить и переустановить
любую из программ, они совершенно независимы. И если у вас всё
нормально, то на этом первый урок окончен.

8
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
1.2 Технологии Интернета
В этом уроке нам нужно понять, какое место наша технология «PHP
MySQL» занимает в развитии интернета.

Смотрите, как устроен интернет. Интернет – достаточно сложная


многоуровневая система, в основе которой находятся отдельные
компьютеры. Весь интернет – это очень-очень много компьютеров в
большой сети. Эти компьютеры объединены в сети, и, соответственно, в
сети могут передаваться какие-то данные. То, что мы называем
интернетом - это две технологии (TCP/IP). Это специальные хитрые
протоколы передачи данных, которые мы рассматривать в курсе не
будем, просто мы должны знать, что весь интернет построен на вот этих
технологиях.

Но технология TCP/IP – это некоторый фундамент, на нем много чего


сделано, но в частности есть такая вещь, которая называется всемирная
паутина, или, сокращенно, WWW. Всемирная паутина – это те самые
статические сайты, которые были в самом начале развития интернета, и
сейчас они тоже есть (так называемые сайты-визитки). В данный момент
наиболее распространены динамические сайты, которые могут
взаимодействовать с пользователем. И вот именно на этом уровне
(создание динамических сайтов) и предназначена технология
PHP/MySQL. Но нужно понимать, что технология PHP/MySQL полностью
опирается на технологию всемирной паутины, и поэтому прежде чем мы
начнем рассматривать PHP, мы должны понять, что же такое вообще
всемирная паутина.

9
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Итак, всемирная паутина, или World Wide Web (WWW), – это система
размещения гипертекстов с общемировым доступом. С точки зрения
всемирной паутины, когда вы что-то выкладываете в интернет на сайт,
то это называется гипертекстом. Почему? Потому что в этом тексте есть
ссылки, по которым можно переходить на другие сайты. И вот язык PHP
позволяет эти гипертексты создавать динамически, т.е. этот гипертекст
появляется и создается при обращении к сайту.

Таким образом, чтобы нам создать этот гипертекст, нужно понять, из


чего он складывается. Гипертекст опирается на 3 технологии: URL
(унифицированный указатель ресурса), HTTP (протокол передачи
гипертекста) и HTML (язык разметки гипертекста).

И давайте перейдем к первой технологии – технологии URL. Основой


всемирной паутины является сайт – выделенное место на сервере
провайдера, снабженное адресом, по которому этот сайт может быть

10
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
доступен. Выделенное место находится на компьютере провайдера, а сам
процесс выделения места называется хостингом.

Как же нам находить эти сайты, как же нам к ним обращаться? Есть
понятие IP-адрес. Каждый узел в интернете имеет свой IP-адрес,
который уникален в переделах интернета. Он состоит из 4-х чисел,
разделенных точками, каждое из которых меньше 256, Например,
112.53.34.77. Но это адрес внешних узлов, когда вы набираете этот
адрес в интернете, то вы попадаете на какой-то внешний узел. Внутри
этого узла могут быть свои IP-адреса. Вы должны понимать, что, как
правило, хостинг на одном IP-адресе размещает тысячи сайтов. И только
в том случае, если у вас выделенный сервер (что, естественно, намного
дороже), то по конкретному внешнему IP-адресу вы получаете ваш
конкретный сайт. Обычно это не так. Те сайты, которые мы будем на
этом курсе делать, будут размещены на одном IP-адресе.

Как же все-таки нам обратиться к сайту? Для точного указания сайта


используется система доменных имен (DNS), которая преобразует
символьное имя в IP-адрес, при этом указатель URL имеет такой общий
вид: название протокола, пользователь, пароль, @, хост, порт, путь,
закладка. Давайте разберем какой-то из URL и посмотрим, из чего он
состоит. Вот URL, на котором курсы на сайте «progtips.ru». Давайте
посмотрим, из чего состоит.

 htpps – защищенный протокол, в котором буква «s» говорит о том,


что он защищен.
 :// – признак адреса. Сам изобретатель этого гипертекста даже
переживал по поводу того, зачем он использовал целых 3 символа,
т.е. эти 2 слэша лишние, и сколько их приходится в интернете
набивать и передавать.
 progtips – имя сайта.
 .ru – доменная зона России.
 /kursy – подпапка на сайте:

11
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
 #а – признак закладки
 i – имя закладки.

Таким образом, указатель URL позволяет нам обратиться к любому сайту


в интернете. Следующие технологии рассмотрим в следующих уроках.

12
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
1.3 Протокол HTTP
Данные в интернете передаются по специальным протоколам.

Во время установления связи один компьютер запрашивает


информацию, он называется клиентом (чаще всего это обычный
компьютер), а другой – предоставляет информацию, и он называется
сервером (обычно это большие мощные компьютеры, иногда со
множеством системных плат). Как правило, клиент посылает запрос, и в
этом запросе содержится URL – доступ к некоторому сайту; а сервер
возвращает на веб-страницу данного сайта.

Как устроен HTTP? Протокол HTTP (HyperText Transfer Protocol) – это


протокол передачи гипертекста, который использует модель «запрос-
ответ». Клиент запрашивает информацию по URL, сервер выдает
информацию по этому адресу клиенту, и после выдачи ответа связь
обрывается, и состояние не сохраняется. Это то, с чем потом приходится

13
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
бороться PHP-программисту. Но здесь нужно пояснить, почему так
сделано.

Одновременно к серверу обращаются тысячи, а иногда и миллионы


пользователей, клиентов, HTTP работает как можно быстрее. К нему
обратились, он тут же выдал информацию, и на этом связь оборвалась. В
последнее время по рекомендации Google идет переход к защищенному
протоколу HTTPS, в котором передаваемая информация шифруется.
Раньше HTTPS был обязателен только для сайтов, где передавалась
какая-то важная (обычно финансовая) информация. Конечно, напрямую
Google не запрещает незащищенные сайты, но он их понижает в
результатах поиска. Поэтому сейчас идет массовый переход на HTTPS. С
точки зрения PHP-программиста, протоколы здесь одинаковые, только
информация шифруется.

Суть программирования на PHP состоит в том, что перед выдачей


информации клиенту сервер сначала выполняет программу на PHP.
Когда передается обычная html-страница, там ничего не происходит. То,
что лежит статическая страница, то, что лежит на сайте, то сервер и
выдает, а вот если мы пометили, что эта программа у нас на PHP, то она
сначала выполняется, а потом отправляется на сервер.

Программирование на PHP – это программирование на стороне сервера.


Существует еще программирование на стороне клиента, когда программа
выполняется в браузере, например, это язык JavaScript. Нужно
понимать, что есть такие ситуации, когда вам нужно программировать на
стороне клиента, и компьютер здесь обычно менее мощный, чем на
стороне сервера, и поэтому в большинстве случаев для повышения
быстродействия мы используем программирование на стороне сервера, а
только когда невозможно на стороне сервера что-то решить, тогда
используется программирование на стороне клиента.

Какие программы используются для работы с HTTP?

14
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Программа для сервера называется «веб-сервер», а программа для


клиента называется «браузер». Наиболее популярными веб-серверами
сейчас являются серверы «Apache» и «nginx». Ну, «nginx» – это
упрощенный «Apache», поэтому, если вы знаете работу с «Apache», вы
сумеете работать с «nginx». А наиболее популярными браузерами
являются «Google Chrome» и «FireFox».

С точки зрения нашего курса, между теми программами, на которых мы


будем писать, различий никаких нет, поэтому используйте то, что вам
больше нравится. Кроме того, веб-сервер часто используется
дополнительными программами, в частности с интерпретатором PHP и
СУБД MySQL. Это важно, потому что когда вы получаете платный
хостинг, как правило, вы автоматически получаете сразу и Apache, и
PHP, и MySQL. Для локальной разработки (чтобы что-то сделать, нужно
сначала это сделать локально) используется комплект, который
называется WAMP (сокращение от слов «Windows», «Apache», «MySQL»,
«PHP»). И в курсе используется комплект UwAmp, который мы запустили
и проверили.

Сразу скажу, что на самом деле таких комплектов бывает много, но так
как они все содержат, по сути, одно и то же ядро (Apache, MySQL, PHP),
то они отличаются только какими-то дополнительными возможностями.
Опять же, с точки зрения нашего курса нам от веб-сервера особо ничего
не надо, нам нужно только, чтобы он содержал Apache, MySQL и PHP.
Собственно, мы с ним и будем работать.

Как разрабатываются сайты на PHP? Смотрите, 2 шага. Первый шаг –


локальная разработка. На вашем компьютере есть папка, в которой вы
разрабатываете ваш сайт локально. Когда вы считаете, что ваш сайт
готов, вы делаете шаг второй – перенос сайта на хостинг. Вы вот эту
папку копируете на хостинг провайдеру, и в этот момент эта папка (ваш
сайт) становится доступной всем компьютерам в интернете.

15
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Для того чтобы вести локальную разработку, используется специальный


адрес localhost или IP-адрес 127.0.0.1. Для проверки локального веб-
сервера напишите этот адрес в строке браузера. Итак, берем localhost и
пишем его в строке браузера. Мы видим самую важную надпись «Apache
Work Finell» (Apache прекрасно работает). Это говорит о том, что у нас
сейчас всё хорошо, мы можем локально разрабатывать. Для размещения
сайтов используйте папку «c:\Prog\UwAmp\www\». Вот у нас есть папка
«Prog\UwAmp», здесь есть папка «www», и все, что здесь вы будете
размещать – каждая папка будет сайтом. И еще удобные две кнопочки
на сервере UwAmp (группа «My Web»). Если вы нажимаете «Browser
www», то вы попадаете на localhost, а если вы нажимаете «Folder www»,
то вы попадаете на тот сайт, где у вас размещен.

Дальше мы уже начнем учиться эти сайты делать.

16
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
1.4 Язык разметки HTML
Прежде чем мы приступим к программированию на PHP, нам нужно
понять 3 технологии, которые лежат в основе всемирной паутины. Мы
рассмотрели URL (адрес, по которому находятся сайты), протокол HTTP,
по которому происходит обращение к сайтам. И последняя технология –
это язык разметки HTML.

Что это такое? HTML (HyperText Markup Language) – это язык разметки
гипертекста, в котором блоки текста обрамляются тегами. Нужно понять,
почему вообще возникла необходимость в этом языке. Так как текст в
интернете передается последовательно, то язык HTML позволяет
отображать текст сразу после того, как передался некоторый фрагмент
текста, завершающий тег прошел, и браузер может отобразить этот
фрагмент текста. Мы можем последовательно отображать весь текст на
экране браузера.

Каждый тег заключается в угловые скобки, обозначается некоторым


кодом, имеет начало и конец. Начинается знаком «<код параметры>» и
заканчивается знаком «</код>». Например, текст, выровненный влево,
выглядит так: открывающая угловая скобка, «p» (тег параметра),
параметр выравнивания влево, текст, закрывающая угловая скобка. Тег
«p» имеет начало (<p>) и конец (</p>) параграфа.

Как выглядит структура сайта?

17
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Сайт – это папка на компьютере, которая содержит веб-страницы. При


этом первая страница должна иметь имя «index.html», а остальные
страницы доступны по ссылкам. При этом других страниц может и не
быть: если это простенький сайт-заглушка или визитка, то может быть
достаточно одной страницы «index.html». Если же в файле содержится
программа на PHP, то файл должен иметь расширение «php», и первая
страница должна иметь имя «index.php». И так как мы программируем на
PHP, у нас все файлы будут с расширением «php» (там, где программа).

Теперь пора рассмотреть минимальную веб-страницу на HTML.

Согласно стандарту, минимальная веб-страница будет выглядеть вот так,


и она должна иметь следующие теги:

 <html> – это говорит о том, что эта страница написана на HTML;


 <head> – это данные для браузера; они не отображаются на
странице;

18
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
 <title> – заголовок страницы; он отображается на вкладке браузера
(чуть позже мы это увидим);
 <body> – это тело страницы;
 <p> – тег параграфа, внутри которого мы написали какой-то текст.

Теперь давайте нашу минимальную веб-страницу проверим. Для этого


мы копируем текст, вставляем его в обычный блокнот, сохраняем его в
папке «UwAmp\www». Создадим для этого папку «Site1». Сюда мы
разместим наш файл с именем «index.html». Сохраняем. У нас веб-
страница сохранена. Теперь нужно перейти в браузер по адресу
«localhost/site1». Переходим. У нас появился «Site1», и если мы сюда
зайдем, то увидим здесь текст страницы, а в заголовке – «Заголовок
страницы». Наш первый сайт уже заработал.

Возникает вопрос: неужели нужно изучать весь этот язык HTML-разметки


и всё это помнить? Сразу скажу: конечно же, это достаточно
бессмысленное занятие, и для быстрой разработки веб-страницы обычно
используются визуальные редакторы. В сборке «PHP-express»
присутствует редактор под названием «CompoZer». Бесплатный,
русифицированный, портабельный, который позволяет быстро создать
веб-страницу.

Давайте на него посмотрим. «Prog\Kompozer», запускаем его. Мы можем


здесь что-то писать. Например, «Пример страницы». Он выглядит как
совершенно обычный редактор. Но здесь внизу есть вкладочка «Код», и
когда вы на нее переключаетесь, редактор уже сделал нам <html>,
<head>, <body>, «Пример страницы», вначале указал, что данная
страница поддерживает HTML 4.

Чтобы вам не запоминать, смотрите. Допустим, вы хотите знать, как


выглядит жирный шрифт. Вы, как обычно, нажимаете «жирность», а
затем смотрите, что написано в коде. В коде здесь стоит «span style»,
соответственно, это жирный шрифт. И так вы можете смотреть наклон,

19
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
подчеркивание, смещение влево, вправо, и т.д. Вы можете спокойно что-
то писать, как в обычном текстовом редакторе, а потом получать код,
который вам нужен. В следующем уроке мы посмотрим, как пишется
программа на PHP.

20
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
1.5 Минимальная программа на PHP
Мы уже знаем достаточно, для того чтобы начать писать на PHP.

Что же такое программа на PHP? Программа на PHP представляет собой


скрипт, который вставляется прямо в HTML-файл. Смотрите: вот наша
программа, она начинается с тега «<?php» и завершается тегом «?>». В
данном случае мы пишем слово «print» (вывести строку), дальше
начинается вывод строки – «”Сегодня”»; дальше «.» (соединить со
следующей строкой), и выводим нашу дату в определенном формате.

Теперь вопрос: где ведется разработка на PHP? Как правило, существует


специальная среда разработки. Сразу скажу, что для PHP-программ
фактическими лидерами являются «Notepad++» и «Geany». На первом
месте – «Notepad++». Обе эти программы построены на одном движке
«Scintilla», но «Geany» отличается тем, что она кроссплатформенная и

21
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
доступна для последующих операционных систем: BSD, Linux, Mac OS X,
Solaris и Windows. Поэтому в курсе мы будем использовать «Geany». Но
если вы по каким-то причинам уже работает в «Notepad++», то можете
использовать его, потому что с точки зрения движка они идентичны.

Работа с «Geany» происходит достаточно просто, потому что это


обычный текстовый редактор, но со множеством удобных инструментов
для программиста. Сейчас не будем вдаваться в подробности, но по мере
того, как мы будем знакомиться с работой, мы научимся использовать
какие-то фишки данного редактора. А пока наша задача – тот пример,
который мы сейчас сделали, сделать в «Geany».

Смотрите, что вам нужно будет сделать. Сам «Geany» находится в папке
«Prog\Geany». Запускаете «GeanyPortable», затем копируете сюда текст,
который у вас есть на экране, сохраняете его в папку «www\Site2» с
именем «index.php». Теперь мы переходим в браузер и видим, что
появилась папка «Site2». Заходим сюда и видим: «Сегодня – 09-11-
2018». Давайте что-то поменяем. Пишем: «Вывод даты». Нажимаем
«Сохранить», затем переходим сюда и нажимаем «F5» (обновить). Вот у
нас появился вывод даты. Разработка на PHP ведется таким образом: в
редакторе «Geany» мы что-то правим, переключаемся на браузер и
обновляем страницу.

Теперь вопрос: а если мы хотим здесь что-то поменять, выровнять что-то


и пр.? Для этого у нас есть «KompoZer». Допустим, «Пример страницы»
мы хотим выровнять посередине. Мы это делаем здесь, переключаемся,
смотрим, какой у нас появляется код, и мы можем этот код копировать.
Поместим его сюда. Здесь будет не «Пример страницы», а «Вывод даты».
Нажимаем «Сохранить» и «Обновить». И у нас текст центрировался на
странице. Таким образом, сама разработка программы на PHP ведется
достаточно просто.

22
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
1.6 Модель языка PHP
Этот урок важен, постарайтесь его понять, потому что от этого урока
зависит ваша производительность как PHP-программиста.

Я много раз наблюдал: когда в язык PHP приходят программисты,


которые до этого кодили на других языках, они пытаются ту модель,
которая у них была, перенести на PHP. Кстати, именно поэтому в PHP всё
время добавляются лишние экзотические элементы, потому что люди
просто к ним привыкли, и их пытаются сюда впихнуть, хотя это
достаточно бессмысленно. И производительность резко падает, когда вы
используете элементы из других языков.

Теперь давайте все-таки рассмотрим в чем же уникальность модели.


Итак, причиной популярности языка PHP является уникальная модель
языка, которая отличается вот чем. В стандартном языке (и
программисты, которые пишут на стандартных языках, к этому
привыкли) веб-страница формируется средствами этого языка.
Например, если мы пишем на языке Java, то мы формируем страницу
именно средством языка Java. Как иначе?

Если мы берем язык Си, когда мы что-то выводим на печать, и,


естественно, для того чтобы что-то напечаталось на бумаге,
программисту в языке Си нужно всё это расписать. Без вариантов. А как
иначе? А вот в языке PHP модель совершенно другая. В модели PHP сама
веб-страница пишется на HTML. По умолчанию веб-страница – это
обычный текстовый файл, потому что HTML – это текстовый формат. А
вот на PHP пишутся только динамические элементы, так называемые
PHP-скрипты.

Таким образом, если мы берем некоторую страницу, которая сделана PHP


правильно, в логике языка PHP, то основная работа на этой странице
была сделана не программистом, а верстальщиком – человеком, который
23
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
пишет HTML-страницы. Эта модель дает возможность быстрой
разработки, потому что за короткое время можно набросать прототип
сервиса и выдать его на общее тестирование. Почему? Потому что пока
традиционный программист всю эту страницу сформирует, пока он будет
писать код, что делает программист на PHP? Он заходит в какой-либо
вариант HTML-редактора (можно в «KompoZer», а можно еще работать в
онлайн-редакторах), переключается на среду разработки и быстро
пишет само содержание страницы – только те элементы, которые
динамические.

И получается, что пока традиционный программист еще только


формирует страницу, у PHP-программиста уже готов прототип. Теперь
вам должно быть понятно, почему 80% всего интернета написано на
PHP. Потому что проще и быстрее.

Есть еще один момент – совместная работа над сайтом.

Простота включения PHP-скриптов привела к тому, что над сайтом могут


работать одновременно верстальщики и программисты. Это тоже
совершенно невозможно представить традиционному программисту.
Почему? Например, представим себе язык Си, и нам нужно сделать
интерфейс некоторой программы. Мы только сели программировать, и
мы не можем допустить какого-то дизайнера интерфейса: к чему
допустить? Еще ничего нет. Прежде чем мы допустим дизайнера, нам
нужно еще долго-долго писать базовый код.

Смотрите, как это реализуется в случае с PHP. Верстальщики начинают


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

24
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Например, если верстальщик написал: «Вывод даты». И дальше говорит,
что вот здесь будет какая-то функция (здесь в коде мы просто вставим
какую-то функцию, например, под названием «Дата»). И верстальщик
говорит: «Мне без разницы, как ты ее здесь выведешь, мне только
нужно, чтобы дата была вот здесь, и всё». И программисту тоже без
разницы, где будет вызываться его код, он просто выводит свой
динамический фрагмент. Таким образом, одновременная работа
верстальщиков и программистов позволяет делать достаточно хорошие,
классные сайты, что невозможно делать на других языках.

Подробно об этом в следующей главе, но скажу пару слов про общее


описание языка PHP.

Итак, PHP – это интерпретатор, который выполняется на стороне


сервера. Сервер берет страницу на PHP, выполняет все скрипты на этой
странице и отправляет клиенту чистый HTML-код. Сейчас PHP бурно
развивается и получает всё больше возможностей, но большинство этих
возможностей экзотичны и используются крайне редко.

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

25
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
2. Функции и типы данных
2.1 Ключевые особенности PHP
Здесь пару слов нужно сказать о языке PHP.

Так как PHP постоянно развивается, есть проблема с версиями PHP.


Часто, когда вы что-то делаете на локальной версии, затем переносите
всё это дело на ваш хостинг, что-то перестает работать. Как правило, это
происходит из-за разных версий. Поэтому программисту нужно всё время
следить, чтобы версии PHP на вашей локальной машине и на сервере
совпадали. Также нужно учитывать изменения в языке. Для этого вам,
конечно же, нужен официальный сайт «php.net». На этом сайте есть
отличное подробное руководство по PHP на русском языке, всегда
актуальное. Следите за ним.

Ключевые особенности языка PHP:

26
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
 функциональный подход (код пишется в виде «y = f(x);» (это
совпадает с языком Си);
 отсутствует типизация, тип переменной устанавливается по
контексту (это что-то новенькое, мы об этом поговорим);
 и самая экзотическая часть PHP заключается в том, что исходный
код программы на PHP располагается прямо на веб-странице.

Как вы помните, тег <p> – это параграф. В языке HTML идет, что «Здесь
нет PHP», затем включается командой «php» ваша программа, затем она
закрывается, и «Опять нет PHP».

Комментарии в PHP могут быть однострочными или многострочными, как


в языке Си, и в стиле UNIX (#). Смотрим, как это работает. Здесь мы
видим:

<?php
print “Начало”; // Однострочный комментарий /*
Первая строка комментария
Вторая строка комментария
*/
print “Конец”; # Комментарий в стиле Unix
?>

В этом коде будут выведены только «Начало» и «Конец». Но у нас сам


наш код располагается в HTML, мы еще должны знать, как пишутся
комментарии в HTML. А пишутся комментарии в HTML так: <!—
комментарий -->. Это теги, которые обозначают комментарий в HTML.
Таким образом, вы должны представлять в момент, когда вы пишете
комментарий, в каком месте кода это код PHP или это код HTML, чтобы
вставить комментарий.

27
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Теперь научимся готовиться к уроку, потому что это достаточно сложная


процедура. Почему? Потому что перед каждым уроком вы должны
убедиться, что:

 сервер UwAmp запущен и работает;


 исходный текст сайта для урока скопирован в папку
«С:\Prog\UwAmp\www»;
 исходный текст урока открыт в программе «Geany»;
 в браузере открыт localhost.

Переходим в «Geany» и видим, что у нас сейчас есть текст урока 2.2 –
всё нормально. Переходим на сайт localhost и видим, что UwAmp
работает, и «Site3» у нас здесь есть.
После того, как вы подготовились к уроку, ваша задача – подготовиться
к следующему уроку, а именно к уроку 2.2, и для этого нам потребуется
сайт №3.

28
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
2.2 Переменные и функции
В основе языка PHP (и это достаточно сложная тема в языке PHP) –
переменные.

Переменные обозначаются знаком «$» и записываются следующим


образом. «$a = 5» – эта запись означает, что переменной «$a»
присвоить значение «5». При этом имена переменной в PHP являются
регистрозависимыми, т.е. «$a» и «$A» – это разные переменные.

Теперь важный момент: программист не устанавливает тип переменной.


Это делает PHP во время выполнения программы в зависимости
контекста. Если программист напишет: «$a = TRUE», то переменная
получит логический тип; если программист напишет: «$a = “Строка”»
(или другой текст, заключенный в кавычки), то переменная получит
строковый тип. И, наконец, если программист напишет: «$a = 12», то
PHP посчитает, что в этой переменной находится целое число. Конечно
же, потенциально это содержит почву для ошибок, потому что когда у
нас строго типизация, и мы четко указали для какой-то переменной, что
она такого-то типа, а затем присвоили ей другое значение другого типа,
компилятор нам подскажет, что у нас здесь ошибка. В PHP этого нет,
поэтому программист должен быть внимателен.

29
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

В PHP для вывода строк есть две языковые конструкции. Это не


функции, а специальные операторы. Это «print», который выводит одну
строку, но при это строку можно получить конкатенацией через точку; и
«echo» – многострочный вывод, и обычно параметр для вывода
перечисляется через запятую. Во всем остальном это абсолютно
идентичные языковые конструкции. Если нам нужно вывести две
переменных в «print», то мы используем точку, для того чтобы соединить
в единую строку; а в «echo» мы через запятую перечисляем все
параметры, которые нам нужно вывести.

И еще один важный режим вывода – вывод документа, когда мы можем


написать следующую языковую конструкцию: «print <<<END», и затем –
закрывающая «END» (имеется в виду, что нужно печатать, пока не
встретится «END»; когда он встретится – остановка печати). В этом
режиме вывода документа можно размещать переменные, при этом
переменные будут подставляться. Только важно помнить, что этот
закрывающий идентификатор должен располагаться в отдельной строке,
не внутри текста.

30
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Для чего это чаще используется? Например, вам нужно внутри вашей
PHP-программы подготовить текст договора, который потом появится на
экране браузера. Конечно же, самый простой способ – это текст
договора вывести в таком режиме документа, а там, где идут название
организации, реквизиты – подставить их через переменную. Это само
часто используемый случай.

Часто новички PHP-программисты делают ошибку: когда есть какой-


нибудь текст у компании, где нет никаких переменных, они тоже
используют режим документа. Совет: если вы используете режим
документа без переменных, то эффективнее будет использовать чистый
html. Вместо записи «Наша компания на рынке с такого-то года имеет…»
(а вы не используете переменные) гораздо проще закрыть PHP и
написать обычный параграф текста в языке html. Это чисто
психологическая инерция у тех программистов с других языков, всё
писать внутри текста программы, хотя конкретно в случае PHP это не
нужно и неэффективно.

Наконец, переходим к важнейшему моменту в языке PHP – функциям, и


смотрим, как они записываются.

Есть ключевое слово «function», которое указывает на то, что дальше


пойдет определение функции. Дальше идет имя функции
(«MaxNumber»), аргументы функции («$x, $y») и возвращаемое
значение. Смотрите, что мы видим. Открывается фигурная скобка,
выполняется какое-то действие, и в конце фигурная скобка закрывается.
Что за действие здесь выполняется? Здесь есть условный оператор «if»,
который говорит о том, что если «x» больше «y», то мы возвращаем «x»;
противном случае мы возвращаем «y». Таким образом, мы выполнили
получение максимального числа.

Функции могут быть вложенными, например, «f3($x)» мы можем


заключить внутрь «f2($x)», можем «f1($x)», и, наконец, получить

31
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
окончательное значение. Функции могут не иметь входных параметров
или аргументов, и возвращаемых значений.

Теперь давайте перейдем к нашему примеру. вы открыли «Site3», там


единственный файл «index.php», и давайте в нем разбираться. Так как
это HTML, первыми идут многострочные комментарии, и здесь написано:
«Урок 2.2», «Пример site3 – функции PHP». Дальше идет чистый HTML –
это заголовок документа (до «/head»), дальше выравнивание по центру,
и дальше написано: «// Начало программы на PHP». У нас уже начался
код на PHP, мы используем комментарии в виде PHP, но когда идет
завершение, после этого у нас идет HTML, и мы здесь используем
комментарии в стиле HTML. И дальше завершение документа.

У нас здесь сейчас 3 примера, 2-й и 3-й примеры закомментированы.


Переходим к примеру первому «Вывод текста». Итак, что у нас здесь
происходит? Строка «$a=5» (переменной «a» присвоить значение «5»),
«$b=15» (переменной «b» присвоить значение «15») и 2 варианта
вывода. «print» – это значит, что мы вводим. Что такое «br»? В HTML
«br» – это перевод строки, чтобы перешло на следующую строку. И
здесь используется точка, для того чтобы это соединить в единую
строку. А в «echo» идет перечисление через запятую. Также у нас есть
«print» (вместо него можно подставить «echo», здесь никакой разницы
нет), и мы здесь выводим большой текст и подставляем значения
переменных. Теперь переходим на localhost, переходим на «Site3». Что
мы видим? «b=15» мы вывели через «print», далее «b=15» вывели через
«echo», а вот этот текст мы вывели через конструкцию «print <<<END».

Теперь переходим к следующему примеру. Убираем начальный и


конечный комментарии и смотрим «Функция вывода даты». Дату мы уже
выводили в предыдущих уроках, и мы просто эту строчку, которая у нас
была, записали в виде функции «ShowDate()». Теперь мы эту функцию
просто вызываем в нашем коде. Конечно, вы спросите: а зачем мы ее
оформили в виде функции, если можно просто вот здесь написать? Ответ
такой: у нас в разных частях сайта может потребоваться вывод текущей
даты, и, таким образом, мы один раз делаем функцию, а затем в разных
местах программы эту дату выводим. Давайте проверим.
Раскомментировали, нажимаем «Сохранить», нажимаем «F5», чтобы
обновить. И вот у нас появилась строчка: «Сегодня – 13-11-2018». Мы
повторили то, что у нас было.

Следующий пример – «Функция вывода максимума». Убираем


комментарии. Мы используем «print», пишем: «”<br>Максимум –
“.MaxNumber(5,10)». А вот функция, которая у нас записана в уроке.
Сохраняем и обновляем, и наша функция посчитала нам максимум:
«Максимум – 10».

Таким образом, в этом уроке мы научились обращаться с функциями в


языке PHP.

32
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
2.3 Сборка веб-страницы
Сейчас мы рассмотрим достаточно сложную схему языка PHP, которая
непривычна для других языков. Ее надо знать очень хорошо, потому что
если вы хорошо владеете этой схемой, то работа с PHP для вас будет
удовольствием.

Эффективное использование PHP предполагает, что веб-страница


собирается из отдельных фрагментов, и часть этих фрагментов
повторяется по всему сайту. Чем это сильно отличается от какого-то
традиционного программирования, где программист пишем программу, и
программа едина? Здесь получается, что мы мысленно разбиваем нашу
программу на множество фрагментов, и затем, когда нам нужно получить
какую-то конкретную веб-страницу, мы эти фрагменты начинаем
собирать.

Для сборки используется специальная конструкция, которая выглядит


так: «require [имя_файла];» (имя файла, который мы хотим
подключить). Как она работает? Перед запуском программы
интерпретатор заменяет эту конструкцию на указанный файл (который
здесь написан), и затем он интерпретирует всю программу, как обычно.
Важный момент: файл при этом рассматривается, как новый PHP-файл, и
для интерпретации требует конструкции «<?php … ?>». Это значит, что
мы можем спокойно вставлять различные HTML-конструкции, и здесь
ничего не произойдет.

Вместо «require» можно использовать «include» по тому же принципу. Но


эта конструкция выполняется уже в момент работы программы. Это
более медленно и рекомендуется только в том случае, если это реально
необходимо. Когда это реально необходимо? Когда, в зависимости от
того, что у вас выполняется, вам нужно подключить или один, или
другой фрагмент. Тогда, конечно, нужно использовать «include», потому
что «require» все это делает перед интерпретацией программы.

33
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Давайте посмотрим всё это на примере сборки. Мы берем файл


«index.php», сразу включаем режим PHP и пишем конструкцию: «require
“header.php”». А что такое «header»? Это файл, который содержит наш
заголовок. Как вы видите, здесь написано: «php», но здесь можно
написать: «html», и здесь, соответственно, тоже «html». И мы этот
«html» просто включим. Эта строчка – это работает PHP, и здесь мы
вводим какую-то строчку. Наконец, пишем: «require “footer.php“», где с
помощью «footer» мы заканчиваем нашу веб-страницу. При этом есть
такой момент: если фрагментов много, то для исключения дублирования
рекомендуется использовать конструкцию «require_once», которая
включает файл один раз.

Перейдем к примеру. Переходим в «Geany». Вам нужно использовать


пример «Site4», в котором сейчас 3 файла: «index», «header» и «footer».
Но здесь, в отличие от того, что мы сейчас рассмотрели, мы рассмотрим
еще одну дополнительную конструкцию, где в заголовке мы хотим
вывести содержимое переменной. Переходим в «header». Если мы
напишем: «print $title», то программа не сработает, потому что, как я
уже говорил, когда работает «require», в этот момент она рассматривает
как новый PHP-файл. Это значит, что режим PHP еще не включен.
Поэтому для того, чтобы вывести переменную, мы должны включить
режим PHP, вывести переменную, и закрыть режим PHP. А в «footer» то
же самое, что мы рассмотрели. После того, как мы всё это сделали, мы
переключаемся в наш пример и получаем: «Сборная веб-страница», «©
Company, 2018.»; и наш заголовок – это переменная «Урок 2.3».

Есть еще один момент именно для отладки таких вещей – просмотр когда
страницы.

34
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Для отладки очень удобно смотреть конечный код веб-страницы. Для


этого в браузере нажимаете «Ctrl+U». Вот мы находимся на нашей
странице, нажимаем «Ctrl+U», увеличим, и вот конечный результат
нашей программы. Мы видим, что это чистый HTML-код, и в данном
случае стоит «Урок 2.3».

Теперь посмотрим, какую ошибку вы могли бы сделать если бы здесь


написали: «print $title». Это типовая ошибка при использовании
«require». Сохранили, обновили. Смотрите: у нас в заголовке сейчас
«print $title». Здесь наш интерпретатор, считая, что это просто HTML-
файл, вывел то, что мы дали. Поэтому для контроля таких ошибок и
используется просмотр кода страниц.

И вернемся к такому моменту. У нас сейчас – «© Company, 2018.», а,


допустим, нам нужно поменять год на 2019. Если у нас нет сборки, то
нам бы пришлось во всех веб-страницах его менять, а если сейчас у нас
используется режим сборки, то, поменяв это в «footer», мы поменяем и
во всех страницах нашего сайта. Принцип сборки как раз позволяет
упростить многие вещи.

35
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
2.4 Использование функций в PHP
Само по себе использование функций в языке PHP достаточно
стандартное, точно так же, как в языке Си функция используется как
«черный ящик». Программисту совершенно неважно, что внутри
функции, какая реализация функции, а его интересует только какие
аргументы на входе, и какое возвращаемое значение у этой функции.

Есть особенности в использовании функций.

Во-первых, имена функций PHP, в отличие от переменных,


регистронезависимы, «a()» и «A()» – это одна и та же функция. Но всё
равно не рекомендую играть регистром. Если вы записали каким-то
образом имя функции, так его используйте. Во-вторых, полезная
особенность PHP: так как язык PHP очень распространен для
программирования в интернете, он содержит очень много стандартных
функций. Их можно найти в официальном справочнике. Я рекомендую,

36
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
прежде чем писать функцию, которая вам нужна, сначала посмотреть,
возможно, уже существует готовая функция.

Область видимости переменных. В отличие от языка Си, в PHP


глобальные переменные недоступны внутри функции. Если мы
определим глобальную переменную «$a» и попытаемся вывести ее
внутри функции, у нас ничего не получится, потому что с точки зрения
PHP внутри функции переменная имеет локальное значение, локальную
видимость, и эта локальная функция никак не связана с этой функцией.

Тогда возникает вопрос: а как же получить доступ к глобальной


переменной? Для доступа к глобальной переменной внутри функции
применяется ключевое слово «global». Вот вы задали глобальную
переменную, написали, что эта переменная глобальная, и теперь вы
можете ей пользоваться, поэтому сейчас выполнение «test» – «Выведет
единицу».

Для сохранения значения локальной переменной используется слово


«static». Но эта переменная не будет доступна вне функции. Напишем
функцию «test» и сделаем в ней запись: «static $a = 1;». Во время
первого вызова этой функции создастся переменная «a» и ей присвоится
значение «1». Но в последующие вызовы функции «test» значение «a»
уже не будет равно «1». Будет присвоено новое значение внутри
функции, и уже это значение будет сохраняться. Но за пределами
функции вызвать переменную «a» нельзя, это будет ошибкой, так как
переменная сохраняется только внутри функции.

37
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Точно так же как и в Cи, используется декомпозиция задач. Если вам


нужно сделать какое-то большое действие, то необходимо разбить его на
маленькие составляющие и для каждой составляющей написать
отдельную функцию.

Организация вызова функций тоже несколько своеобразна. Как правило,


на текущей веб-странице используются только вызовы функций, а их
определение содержится в отдельном файле. Как это выглядит с точки
зрения программиста? Например, у нас есть «index.php» – это наша веб-
страница, которую мы сейчас хотим продемонстрировать. Здесь мы
используем строчку «<?php require “main.php”; ?>». Именно «main.php»
содержит описание функции, а внутри веб-страницы мы их только
вызываем с помощью этих строчек – функции «a» и «b».

Почему это часто применяется? Если вы сами и программист, и


верстальщик, то в этом никакого смысла нет. Можно писать определение

38
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
прямо в файле «index.php». Это часто применяется, потому что, как
правило, часть страниц отдается верстальщикам, и они знают, что есть
помеченные места, которые трогать не надо. И дальше выполняет
верстку, сохраняя ваши вставки. А программист занимается
исключительно реализацией функций, и в каком дизайне будет
выводиться эта функция, ему особо неважно. Поэтому, как правило,
файл с веб-страницей открыт у верстальщика, а файл «main.php» (с
определениями функций) открыт у программиста. Также у него есть
тестовый файл, который он запускает для того, чтобы протестировать
функции.

Давайте посмотрим на примере, как это обычно устроено. Откроем файл


«index.php». Из прошлых уроков в переменной у нас написано: «Урок
2.4», далее вызывается «header», и здесь мы пишем: «main.php». Когда
вызываются функции, «require_once» лучше делать всегда, чтобы они не
вызвались повторно и не выдали ошибку. Далее PHP закрывается, после
чего идет обычный HTML-файл, затем идет вставка, и дальше функция
«Hello», которая определена в «main», но не на этой странице. Дальше
идет HTML и наш стандартный «footer».

Теперь посмотрим, что представляет собой функция «Hello» и где она


определена. Вот наша функция «main». Это не является каким-то
исполняемым файлом, как в случае языка Си. Это просто набор
определений функций. И здесь мы используем как раз слово «global».
Мы завели некоторую глобальную переменную «$Name», указали, что
хотим к ней обратиться, и выводим некоторую информацию. Давайте
посмотрим на результат. Обновляем и читаем: «На нашем сайте много
интересного»; здесь работал наш скрипт; «Рады встрече»; и наша
сборка. В заголовке – «Урок 2.4».

Таким образом, с помощью отдельного файла мы храним те функции,


которые нам потребуются.

39
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
2.5 Типы данных
Так как PHP не имеет строгой типизации, то программист должен хорошо
понимать работу с типами и постоянно следить за правильностью
использования типов. Конечно, если программист приходит с языка Си,
где компилятор очень часто подсказывает ошибки при неправильности
типов, то в PHP этого нет, поэтому это отдельная забота PHP-
программиста – следить за типами.

Как же происходит присвоение типа? PHP делает присвоение типа сам, в


зависимости от контекста. Мы сейчас подробно рассмотрим, в каком
контексте какой тип будет присвоен. Но сначала кратко их перечислим:

 boolean (логический тип)


 integer (целые числа)
 float (числа с плавающей точкой);
 string (строки);
 NULL (пустой тип);
 object (объекты) – экземпляры классов;
 resource (ресурсы) – хранение ссылки на внешний ресурс;
 array (массивы).

Логический тип.

40
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Тип Boolean имеет всего 2 значения: TRUE (истина) и FALSE (ложь). Эти
2 значения являются константами и регистронезависимы, их можно
писать как большими буквами, так и маленькими. Итак, вот запись, в
результате которой PHP присвоит логический тип: «$found = TRUE».
Соответственно, после этой строчки «found» будет иметь логический тип.
Или «$error = FALSE». Логический тип обычно используется в условном
операторе. Как? Есть оператор «if» (если), в скобках условие
проверяется, и если это условие истина, то выполняется один блок (в
данном случае будет написано слово «Найдено»). Есть ключевое слово
«else» (иначе); и если это условие ложное, то будет выполнен блок
после слова «else» (здесь будет написано «Не найдено»). Вот таким
образом задается логический тип.

Целый тип.

Тип integer представляет целое число со знаком размером в 32 бита. Это


позволяет представить числа от -2147483648 до 2147483647. Для этого
достаточно записать число без точки. Если мы напишем: «$a = 5;» или

41
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
«$b = -6;», то PHP присвоит целый тип. Кроме того, можно записывать
числа в других системах счисления. Для восьмеричного числа нужно,
чтобы число начиналось с 0, для двоичного, чтобы число начиналось с
0b, и для шестнадцатеричного число должно начинаться с 0x. Возможно,
у вас есть вопрос, для чего в браузере шестнадцатеричные числа. Есть,
например, способ задания цветов, который использует как раз
шестнадцатеричные числа, это иногда полезно.

Числа с плавающей точкой.

Размер числа с плавающей точкой float зависит от платформы.


Максимально возможное значение, которое вы можете использовать, это
10 более чем в 300-й степени. Этого вам хватит для любых целей. И для
этого можно использовать 2 вида записи: либо записать точку (1.56),
либо «e» (2.43e4, 2.34 умноженное на 10 в 4-й степени).

Строки.

Тип string – это последовательность символов внутри кавычек


(например, “Привет!”). «Привет!» – это строка. Но, в отличие от Си,
строки могут содержать в себе нулевые символы, что никак не повлияет

42
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
на программу (напомню, что в Си 0 завершает строку), поэтому строки
можно использовать для хранения бинарных данных. При этом
максимальный размер строки составляет 2 Гб, но по умолчанию на PHP-
скрипт выделяется всего 128 Мб, что, конечно, значительно меньше.

Важный момент: можно использовать одинарные либо двойные кавычки,


и они по-разному обрабатываются. Строки в одинарных кавычках не
обрабатываются, они выводятся так, как есть, а строки в двойных
кавычках обрабатываются, при этом переменные заменяются на их
значения, а спецсимволы заменяются на те значения, которые дают
спецсимволы. Давайте приведем пример. Допустим, мы задали: «$a =
1», и сначала записали некоторую строку в одинарных кавычках.
Смотрите, будет выведено ровно то, что здесь написано: «’<br>$a = 1’».
А теперь запись в двойных кавычках, и смотрите, что будет написано
здесь. Здесь вместо «$a» будет подставлено значение, а вместо «\$»,
который как раз говорит, что нужно вывести «$», будет выведен именно
символ «$». И поэтому здесь будет выведено: «"br>$a = \$a"».

Пустой тип.

Пустой тип NULL означает, что значение для переменной не задано.


Константа тоже регистронезависима. Чтобы его использовать, нужно
написать: «$a = NULL». Если переменная не имеет значения, что это
означает? Это важный момент. Во-первых, если переменной не было
присвоено какое-либо значение, написали просто «$a;». Во-вторых,
если специально присвоили тип NULL (как в этом примере). В третьих,
если значение было удалено с помощью функции «unset()».

Для проверки, есть ли значение у переменной или нет, используется


функция «is_null», которой на входе дается какая-то переменная, а на
выходе какое-то значение: истина, если «null», и FALSE в ином случае.
Для чего это используется? Если у вас большие данные, то вы можете
превысить тот размер, который вам выделен, и поэтому достаточно

43
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
распространенная практика PHP-программиста – получить какое-то
значение переменной, использовать его, а затем это значение удалить,
чтобы оно не занимало память.

Объекты.

Здесь нужно пояснение. В язык PHP постепенно добавляются элементы


объектно-ориентированного программирования (ООП). Почему это
происходит? Потому что есть программисты Си++, которые перешли в
PHP с этого языка и хотят использовать, опять же, привычные приемы.
Получилось так, что этот язык PHP постепенно включал какие-то
элементы, поэтому в разных версиях есть свои реализации ООП.

Сразу скажу, что этот конфликт версии – это достаточно серьезная


проблема, поэтому вы должны следить: если вы хотите использовать
объектно-ориентированное программирование, то у вас должен быть
справочник по данной версии PHP, на локальном компьютере у вас
должна стоять эта же версия PHP, и на хостинге должна стоять эта же
версия PHP. Скорее всего, если у вас идет несовпадение версий, то ваша
программа перестанет работать, и есть большая проблема: с переходом
на следующую версию PHP ваша программа так же перестанет работать.
Это серьезная проблема с реализацией. Если вы пишете на Си++, это
работает всегда и везде.

Здесь немножко по-другому. Но главное другое. Применение объектно-


ориентированного программирования в PHP затруднено, потому что ООП
требует стиль «водопада». Это значит, что когда мы делаем проект,
сначала разрабатываются базовые классы, потом они наследуются, а
потом реализуется конечный функционал. А так как веб-сервисы
постоянно переделываются, то модель «водопада» реализовать трудно.
Поэтому большого распространения ООП пока не получило.

44
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
В частности, при программировании системы «WordPress» (это самая
распространенная CMS для создания сайтов) оно не используется. Но
для решения этой проблемы существует направление PHP-
программирования – фреймворки, и они решают проблему «водопада»,
потому что они уже содержат в себе базовые классы. Таким образом,
программист может их брать и сразу наследовать.

Но фреймворки одну проблему решают, и создают новую. Так как во


фреймворк стараются напихать как можно больше классов, то когда
программист только тронул какой-то класс, он тянет за собой другие, в
результате получается очень медленная работа, когда страницы могут
открываться по десяткам секунд. Просто представьте себе: вы зашли на
сайт, нажали на кнопочку и ждете 20-30 секунд, пока появится
страница. Это, конечно, совершенно недопустимо. Поэтому когда вы
будете использовать объектно-ориентированное программирование,
учтите все особенности, которые при этом получаются. Дальше мы в
нашем курсе уже про объекты говорить не будем.

Ресурсы.

Ресурс – это специальная переменная, которая содержит ссылку на


внешний ресурс. При этом создание и использование ресурса зависит от
конкретных функций, поэтому работа с ресурсом вне этих функций
смысла не имеет. Полный список функций для работы с ресурсом
приведен здесь. Ресурсов, как вы понимаете, очень много. В
зависимости от той задачи, которая перед вами стоит, вы будете
разбираться с тем или иным ресурсом, как его использовать.

И теперь давайте практически посмотрим на то, как используются типы в


конкретной программе. Для этого вам нужно, чтобы у вас был «Site6», и
в «Geany» тоже должен быть открыт проект «Site6». Давайте смотреть,
что у нас написано. Мы записываем: «Урок 2.5», и индекс уже расписан
так, как в классическом PHP. Это HTML; в данном случае «h1» – это
заголовок уровня 1, а «h2» и т.д. – это заголовки уровня 2. И написано с

45
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
«html» со вставочками «php», и для каждой вставочки у нас имеется
соответствующая функция. В конце мы с помощью «require_once»
добавляем «footer». Это уже мы знаем.

Теперь давайте посмотрим, что мы сделали в «header». В «header» мы


добавили только то, что перенесли «require_once “main.php”». Это такая
хорошая практика – переносить в «header» все используемые
библиотеки и другие модули. А в «footer» мы просто поставили один
полезный тег <hr>, который дает горизонтальную линию. И давайте
посмотрим наши функции («main»).

Итак, первая функция – «TypeList()». Смотрите, вот здесь я как раз


использовал тот прием, о котором говорил, что если вам нужно просто
вывести текст (а здесь просто выводится текст), то самое простое – это
завершить PHP, в HTML этот текст написать (<li> – это тег стрелочного
списка), затем открыть PHP и завершить программу. Давайте посмотрим,
как это выглядит. Заходим на «Site6». Итак, первое – тип «заголовок»
(<h1>), и наш текст выведен, вот он. А теперь идем по примерам.

Итак, следующий пример – логический тип Showfound. Смотрим, что у


нас здесь. То, что у нас в примере. Итак, мы проверяем переменную
«$found» и пишем, найдено или не найдено. Здесь мы вызываем
«FALSE», и у нас написано: «Не найдено». Отлично, теперь, поменяем:
вот здесь вместо «FALSE» напишем «TRUE». «Сохранить», «Обновить», и
теперь – «Найдено». Теперь переходим к целому типу «ShowInt».
Смотрим: целые числа. Итак, вот у нас как раз запись идет в десятичном
виде, в восьмеричном, в двоичном, в шестнадцатеричном. Далее мы это
пытаемся вывести. Но смотрите, что у нас получается. У нас получается,
что везде написано «28». Почему так получилось?

Да, действительно, PHP взял эти числа в тех системах счисления,


которые мы ему задали, но так как это все значение 28, то когда мы
пытаемся вывести значение этих переменных, он везде пишет «28». Что
же нам делать, если мы хотим получить вывод в других системах
счисления? И для этого нам нужно использовать форматный вывод. Он
такой же, как в языке Си. Это функция «print f», которая отличается тем,
что вы сначала записываете строку, которую надо вывести, и указываете
через «%», в каком формате выводить. И давайте смотреть.

Здесь мы говорим: вывести в формате десятичном («%d»), восьмеричном


(«%o’»), двоичном («%b’») и шестнадцатеричном («%X’»). Сохраняем,
обновляем, и теперь мы получили вывод в соответствующей системе
счисления.

Дальше у нас идет «ShowFloat»; смотрим, что у нас здесь происходит.


Мы задали 2 числа и затем их выводим. Что у нас получается? 1,56
вывелась, как мы и записали, а здесь PHP вывел полностью число. А
если мы хотим вывести именно так, как мы записали, то здесь нам
приходит на помощь тот же самый форматный вывод. Мы ставим здесь

46
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
комментарий, и у нас в данном случае форматный вывод либо «f», либо
«e». Нажимаем, обновляем, и вот мы получили форматный вывод так,
как нам нужно.

Дальше строки «ShowStr». Здесь снова этот пример из урока. Мы


записали здесь в одинарных кавычках, здесь в двойных кавычках.
Давайте посмотрим, что мы увидим. Здесь «$a=1», а здесь «1=$a».

И, наконец, пустой тип «ShowVar». Мы задали какое-то значение и


проверяем: «is_null», и дальше пишем, нет значения или есть значение.
И в данном случае мы присвоили значение, здесь у нас есть значение. И,
кстати, завершает тег <hr> горизонтальная линия. И теперь вместо «1»
мы пишем «NULL», сохраняем, обновляем «Нет значения».

Вот таким образом можно работать с типами данных PHP.

47
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
2.6 Массивы
Мы выделили в отдельный урок этот тип данных, потому что понятие
массива отличается от языка Си. В PHP массив – это упорядоченное
отображение, которое устанавливает соответствие между ключом (key) и
значением (value).

Пример. Мы задаем массив: ключевое слово «array», дальше в круглых


скобках начинается перечисление пар: ключ – значение, ключ –
значение, ключ – значение. При этом ключ может быть либо типа
целого, либо типа строкового значение. А значение «value» может быть
любого типа.

И, прежде чем мы пойдем дальше, нужно пояснить, почему разработчики


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

Давайте рассмотрим пример. Здесь мы задаем массив «$a = array»,


скобки, и мы здесь задаем два значения: ключ – «роза», значение –
«цветок»; ключ – «цветок», значение – «роза». Соответственно, так
тоже можно сделать. Здесь альтернативное задание массива: вместо
ключевого слова «array» используются квадратные скобки. Здесь 3
ключа: «один», «два», «три»; и 3 значения: «первое», «второе»,
«третье».

48
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Массивы могут быть нумерованными или ассоциативными, одномерными


или многомерными. Давайте по порядку. Если мы не зададим никаких
данных, то мы получим пустой массив. В данном случае «a1» – это
пустой массив. Если мы зададим только значения, то PHP пронумерует
все эти значения от нуля, и фактически мы получаем нумерованный
массив. Для обращения к каждому элементу нужно записать индекс в
квадратных скобках. В данном случае индекс «1», значит, второе
значение, и здесь будет выведено: «Петров». Одномерный
ассоциативный массив. Мы задаем пары значений: ключ – значение; и,
для того, чтобы обратиться к элементу, мы должны указать: «"Петров"»,
в данном случае в кавычках, потому что это строковое задание нашего
ассоциативного массива.

Многомерный нумерованный массив.

Теперь смотрите: вот такая хитрая запись. Мы решили записать


некоторую таблицу, мы начинаем массив, но каждой строкой этого

49
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
массива будет другой массив. Получается двумерный массив. И в данном
случае каждый массив является нумерованным, мы не задали никаких
ключей. Таким образом, мы записали, и мы фактически с помощью этой
записи задали некоторые таблицу: название марки машины, год выпуска
и цвет машины. При этом для доступа к этому нумерованному массиву
мы должны указать строку и столбец каждого значения. В данном
случае, «[0][0]» у нас будет «Мерседес», «[0][1]» – «2017», «[0][2]» –
«черный».

Также можно создать многомерный ассоциативный массив.

И принцип записи точно такой же. Мы берем ключевое слово «array»,


дальше обозначаем какой-то ключ, но этому ключу ставим массив, и
опять этой записью мы фактически закодировали таблицу. Но только для
доступа к массиву теперь будет нужно будет указать:
«.$a[“Петр”][“Фамилия”]». Таким образом, мы получаем: если «Петр» –
это у нас вторая строчка; здесь – «Петров», и фамилия, соответственно,
здесь будет «Петров». Но есть при таком указании сложность. Когда мы
подставляем вот такие многомерные массивы, то иногда интерпретатор
не может понять, где у нас кончается собственное имя массива, а где
начинается дальше текст. Потому что если здесь смотреть, то как нам
посмотреть, что вот это относится к указанию одномерного массива, а
это уже пошел какой-то текст. Получается такая неоднозначность. И вот
для точного указания на элемент массива можно использовать фигурные
скобки. Если мы вот здесь напишем фигурные скобки, то PHP будет
точно знать, что мы имеем в виду.

И давайте посмотрим это на примере. Итак, нам нужен «Site7», который


относится к уроку 2.6, и в этом примере мы как раз увидим типовую
ситуацию (это называется программированием с заглушками), когда мы
начали писать некоторую программу, здесь сделали вставочки, но пока
эти вставочки у нас не работают, мы их делаем просто как комментарии.

И, таким образом, мы видим всю структуру программы, но эти функции


пока не вызываются. Напомню, что если вы хотите закомментировать и

50
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
сам HTML-код, здесь комментарий выглядит вот так. И поэтому если мы
сейчас откроем «Урок 2.6», то мы увидим заголовок массива, и дальше –
3 заголовка, и работает у нас пока только первый. Давайте посмотрим,
что такое «ShowArray».

Итак, мы задаем простейший одномерный массив, где мы просто


перечислили значения. Мы получили нумерованный массив, и выводим
значение «$a[1]». Смотрим, что это за значение. Это значение «Петров».
Отлично. Теперь мы открываем заглушку, чтобы у нас начал работать
второй параграф. И что здесь происходит? Здесь мы задаем как раз наш
ассоциативный массив, и нам нужно вывести значение с ключом «2».
Сохраняем, обновляем. Вот значение с ключом «2» – второе. Хорошо.
Теперь переходим к следующему. Это уже двумерный нумерованный
массив, таблица. Но теперь возникает вопрос: а как же вывести
таблицу? Опять нам помогает наш «KompoZer». Наша задача – вывести
таблицу, но мы не знаем теги. Что мы делаем?

Мы нажимаем «Таблица», выбираем в данном случае 2x3. Получили вот


эту таблицу, и смотрим, что за код в этой таблице. Здесь уже всё
понятно Начинается «<table>», заканчивается «</table>», и дальше
отмечаются строки и столбцы. Вот «ShowArray3()». Мы задали наш
двумерный массив «cars» (автомобили), и теперь этот код «print
<<<END», мы начинаем выводить нашу таблицу, в которую мы взяли
теги из «KompoZer». Теперь просто подставляем эти значения. Но как
раз вот здесь нам и потребуются вот эти фигурные скобки, чтобы PHP
точно понимал, что именно здесь нужно произвести вставку. Итак, мы
наши значения, которые задали, выводим в виде таблицы. Сохраняем,
обновляем, и вот мы получили нашу таблицу – двумерный нумерованный
массив.

И последний, четвертый – убираем комментарии в HTML, убираем


комментарии в коде PHP и смотрим, что у нас происходит здесь. Здесь у
нас происходит следующее: мы задаем двумерный ассоциативный
массив и затем выводим ту же самую таблицу. Только обратите
внимание: почему разработчики пошли на вот такой шаг, как
ассоциативный массив, зачем он был сделан? Если мы смотрим на этот
код, то нам не очень понятно, что мы выводим, а если мы смотрим на
этот код, то нам сразу понятно, что именно мы выводим. Сохраняем,
обновляем и получаем ту же самую таблицу.

Конечно же, возникает вопрос: использовать нумерованный или


ассоциативный? Это зависит от задачи. В каких-то задачах удобнее
нумерованный, в каких-то задачах удобнее ассоциативный.

51
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Мы рассмотрели все типы данных. И последняя тема в завершение –


приведение типов. В PHP можно использовать явное приведение типов (в
круглых скобочках, если вы пишите «boolean», «float», «print», то вы
приводите к соответствующему типу). Но вот в этом примере, например,
скажем, это нормально. Смотрите: у нас есть переменная «a», мы
написали: «$a = 10;», в данный момент «a» стала целочисленным типом.
Но нам нужно преобразовать его в логический тип. Тогда мы написали:
«$b = (Boolean) $a;» и теперь «b» стало логическим типом. Но смотрите:
так как PHP устанавливает из контекста, то очень часто встречаются
такие примеры и в книжках, и в коде, когда программисты пишут
неявное преобразование типа, и получается, например, так, смотрите.

Если мы возьмем вот этот код (на самом деле это абсолютно нормально
работающий код), то что произойдет в этом коде? В этом коде PHP, видя,
что у нас есть арифметическое действие, преобразует это строковое
значение в числовое (у нас при этом получится 10) и умножит это на 5.
И, таким образом, переменная «a» получит значение целого числа 50.

Я категорически рекомендую везде указывать обязательно приведение


типов. Почему? Причины две. Первая – вы сами можете ошибиться; и
второй момент – когда вы будете потом сами разбираться в этой
программе, или кто-то будет читать вашу программу, ваш код, то вот
такого рода неявное приведение типов очень сильно заставляет
задуматься о том, что же тут на самом деле происходит. Допустить
ошибку в такой записи очень легко Вот, собственно, все типы в языке
PHP мы рассмотрели.

52
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
3.Разработка программ
3.1 Структура проекта
Мы посмотрим, какие же подходы применяются, для того чтобы
эффективно разрабатывать PHP-программы.

В первую очередь нужно понимать, что PHP – это скриптовый язык, а не


язык программирования общего назначения. Скрипт – это программа,
которая работает в определенном контексте. В каком же контексте
работает PHP? PHP работает на стороне веб-сервера, и его задача –
сформировать веб-страницу, которая будет отображена в браузере. Но
это накладывает множество ограничений на PHP-программы. Мы должны
кратко перечислить главные ограничения.

Первое – это ограничение по объему выделяемой памяти. Всего лишь


128 Мб по умолчанию. Ну, конечно же, вы можете это дело расширить,
но сразу скажу, что это тупиковый путь, потому что в этом случае у вас
начнутся различные нестандартные проблемы, поэтому лучше с этим не
связываться.

Тут нужно понимать, что такое 128 Мб. Во-первых, это очень мало, а во-
вторых, это в целом на скрипт. Это значит, что если у вас есть один
массив на 100 Мб, то уже второй массив вы завести не сможете. Дальше,
ограничения по скорости работы скрипта – это тоже очень мощное
ограничение, потому что есть комфортное время отображения страницы
– где то 1 секунда, и это касается вообще любых программ, не только
браузеров.

И, кстати, вот отсюда и пошло обозначение «1С» известной


бухгалтерской программы. «1С» заявляли в рекламе, что их форма
отображается за 1 секунду. Это значит, что вариант, когда у вас
серьезная, мощная программа, которая имеет множество каких-то
вариантов, в PHP она просто невозможна, потому что она будет очень

53
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
долго работать. И вот в частности «Framework», которые идут по пути
именно таких больших, глобальных систем, их не очень любят уже
конечные пользователи, потому что долго открываются страницы, но их
и не любят поисковые системы, потому что поисковые системы тоже
проверяют скорость открытия страниц.

И, наконец, тоже весьма неприятное ограничение – ограничение по


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

А вот в случае с PHP – если пользователь закрыл браузер, а потом он


зайдет снова на этот же сайт, то все данные уже исчезли, и поэтому PHP-
программисту нужно будет искать способы и методы каким-либо образом
восстановить значение, чтобы пользователю не приходилось всё время
начинать с нуля. И все эти ограничения привели к тому, что существует
некоторый подход к эффективному PHP-программированию, который
сформировался за годы существования динамического интернета.
Давайте с ним познакомимся.

Проект на PHP – это обычно набор папок, каждая из которых отвечает за


отдельный функционал программы. Смотрите, очень важный момент:
PHP-программирование – это набор большого количество небольших,
маленьких скриптов, и в каждой папке, соответственно, мы имеем какое-
то количество этих самых скриптов.

54
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
И в качестве иллюстрации давайте посмотрим «Word Press», как самую
популярную систему управления сайтом. У «Word Press» есть одно
колоссальное достоинство. Если вы перейдете на сайт «Word Press» и
нажмете «Получить WordPress», вы можете совершенно спокойно
бесплатно скачать «Word Press» (исходный код доступен) и посмотреть,
как вообще устроен самый популярный проект на PHP. И если вы
скачаете и откроете, то вы увидите, что в данном проекте, во-первых,
есть индекс PHP (это понятно, с этого всё начинается), во-вторых, есть
какие то скрипты в корневой папке, и есть три важных папки. Смотрите,
за что они отвечают.

 «wp-admin» – админка сайта;


 «wp-content» – содержит всё, что пользователь туда вносит (текст и
т.д.)
 «wp-includes» – это отображение сайта, т.е. как отображается на
экране сайт.

Дальше идет уже стандартная иерархическая структура. Если мы


возьмем «wp-content», то он содержит папки:

 languages – переводы
 plugins – плагины
 themes – темы
 uploads – медиа-файлы (фотографии, аудио- и видеофрагменты),
которые отображаются на сайте.

Самый лучший способ – ориентироваться на такие вот успешные


проекты, и таким образом ваш проект PHP (если это будет большой
проект, большой сервис) будет организован приблизительно так.

Есть такой подход, который получил название «программирование в


юнитах». Из-за того, что такие строгие ограничения на скрипты, и
общую мощную монолитную программу на PHP построить просто

55
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
невозможно (точнее, построить-то возможно, но она будет очень
медленно работать), это привело к тому, что вместо единой большой
программы используют следующие технологии. PHP-сервис (вип-сервис
на PHP) представляет собой небольшое ядро и набор юнитов.

Что такое юнит? Юнит – это часть программы, которую можно включить
и выключить без влияния на работоспособность программы в целом.
Причем, если юнит разработан внешним разработчиком, то он
называется «плагин». И, кстати, скажу вам, уже как PHP-программист, с
точки зрения того, где искать работу: одним из популярных направлений
PHP программирований является разработка как раз плагинов для других
веб-сервисов. Специальные требования, как разработать плагины, и вы
просто пишите ту же самую PHP-программу, но вы пишете ее
применительно к некоторому другому сервису. Это сейчас очень сильно
востребовано. В частности, плагины для «Word Press» – это большая
отрасль программирования.

Давайте теперь посмотрим, как же в этой нашей технологии мы получаем


данные от пользователя. «Получение данных».

Для получения данных от пользователя PHP использует формы, при этом


минимальный полезный юнит на PHP имеет две страницы: форму и
результат. Давайте посмотрим всем известный «google.com». Что мы
видим? Мы видим некоторое поле для ввода и две кнопочки: «Поиск» и
«Мне повезет!». И такой же краткий вариант есть у «Яндекса». Если мы
на него зайдем, то мы увидим то же самое: есть поле ввода и кнопочка
«Найти». Это простейшее использование PHP, просто поле ввода. Для
получения данных от пользователя PHP использует формы. Минимальная
форма имеет следующий вид: форма написана на HTML. Это не сам PHP,
а чистый HTML. Есть тег «form», заканчивается «/form», и внутри этого
тега мы указываем «action» и, самое главное, имя нашего PHP-скрипта.
Дальше указываем метод «get» (это чуть позже рассмотрим). Дальше

56
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
пишем имя «input text», размер и имя нашего вида данных, и дальше
«submit» – это кнопка, на которой будет надпись «ok».

Наша задача сейчас – открыть «Site8», где у нас урок 3.1, и давайте
посмотрим, как устроена форма. Сейчас здесь чистый HTML, и мы
разбираемся с методом «get». Мы написали «form», вызывающий
«hello1.php». И введем какие-то значения. Теперь давайте посмотрим,
как эта форма у нас выглядит. Мы видим метод «get». У нас написано:
«Имя», поле ввода и кнопка «ok». Теперь посмотрим «hello1». Что
произойдет, когда мы нажмем на кнопку «ok». Здесь будет написано:
«Привет», и нужно будет получить этот самый «name». Давайте
разберемся, как получить «name».

Мы сейчас узнаем одну особенность PHP, которая доставляет много


неприятностей программистам. В отличие от многих других языков
программирования, которые разрабатывались одним человеком и имеют
определенную логику в своем построении, в PHP разные группы думали,
как правильно развивать PHP, и в результате получилась такая вещь.

Помните, мы говорили, что в отличие от других языков, в PHP, если есть


глобальная переменная, она недоступна внутри функции. Но потом
пришли другие разработчики и сказали: «Это глобальная переменная
недоступна внутри функции, а мы введем понятие «суперглобальная
переменная» и, в данном случае, «суперглобальный ассоциативный
массив, который доступен внутри функции». Когда вызывается данная
функция PHP, то ей передается суперглобальный ассоциативный массив
под названием «$_GET». И в этом ассоциативном массиве передаются те
значения, которые пользователь ввел на форме. В данном случае у нас в
форме есть «name» (имя), и мы через суперглобальный массив
($_GET[“name”], где «name» – имя ключа) получим данные. Мы введем в
поле: «Вася», и нажмем «ok». У нас получилось: «Привет, Вася!».

Теперь посмотрим что же такое метод «get». Если мы посмотрим на


адресную строку в браузере, то увидим, что после «hello1.php» идет
вопросительный знак, а затем виден наш суперглобальный массив. Мы
видим ключ «name», и у него есть значение «Вася». Преимущество
такого метода в том, что мы можем эту строчку скопировать и затем
использовать для того, чтобы напрямую обратиться к этой форме (о
недостатках чуть позже). Но у нас есть проблема с формой ввода.
Проблема состоит в том, что у нас возможен взлом. Давайте посмотрим, в
чем он состоит.

57
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

При получении данных этой формы хакер может написать код, который
нарушит работу сайта. Давайте возьмем простейший код, который может
нарушить работу сайта, и введем его прямо в форму, нажмем «ok».
«Chrome» тут же среагировал, что в форме какой-то скрипт, и он его
заблокировал. Но если мы то же самое введем в «Firefox», то мы увидим,
что наш сайт взломан, на этом сайте был выполнен какой-то чужой
скрипт.

Для того чтобы это исправить, существует простая специальная защита,


которую надо делать всегда. Защита содержит функцию
«htmlspecialchars()», которая переводит все скрипты в
неработоспособное состояние. Как она это делает, сейчас
непринципиально, для вас главное, как ее использовать. Давайте
посмотрим. Уберем комментарии здесь, здесь защита, доступ к «hello2».
И в «hello2» переданную нам переменную поместим в функцию
«htmlspecialchars()», больше ничего не меняется. Нажимаем
«Сохранить», «Назад», «Обновить». И давайте опять попробуем вставить
скрипт в форму. Нажмем «ok». Мы видим, что он не выполнился, а
просто отобразился. Это и есть простейшая защита. На всякий случай
проверим так же и в «Firefox». Здесь скрипт просто отобразился. Мы
сумели защититься от такого простого метода взлома.

Теперь разберем, чем отличаются методы GET и POST.

58
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Существуют два метода передачи – GET и POST. Метод GET передает


данные в строке браузера, но недостаток метода в том, что эти данные
открытые. POST отличается тем, что передает данные скрытно, но
сохранить и повторить запрос нельзя. Получить данные можно точно так
же через суперглобальный ассоциативный массив, только не GET, а
POST. Давайте проверим. Убираем комментарий. Здесь у нас написано:
«<form action="hello3.php" method="post">». Далее переходим к
«hello3». Здесь все то же самое, только «GET» меняем на «POST».
Нажимаем «Сохранить», «Обновить». Сначала в форме вводим «Вася»,
чтобы проверить работу формы. Мы получили: «Привет, Вася!», но в
адресной строке ничего. Теперь попробуем наш нехороший скрипт,
вставим и проверим, что он ничего не нарушил. Так же проверим в
«Firefox» и убедимся, что он так же ничего не нарушил.

Таким образом, мы узнали как устроен проект на PHP и какой


минимальный юнит для получения информации мы можем использовать.

59
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
3.2 Константы и операторы
Начнем с констант.

Константы отличаются от переменных тем, что их значение не может


изменяться во время выполнения скрипта, поэтому они и называются
константами. Кроме того, они не могут принимать значение «NULL». И
константа задаются командой «DEFINE», которой нужно дать имя
константы, значение константы и указать регистры независимости (об
этом чуть позже). Вот пример задания константы. Обратите внимание,
что мы здесь задали константу «NUMBER», которая равна 5, при этом у
констант не пишется знак «$». Для проверки существования константы
служит функция «DEFINE», которой просто передается константа. И
константы доступны везде – неважно, вне функции, внутри функции и
т.д.

Теперь переходим к регистру зависимости/независимости. Так как PHP


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

Дальше, имена функции так же регистронезависимы, их можете писать


как угодно, но рекомендуется так называемый CamelStyle, отдельные
слова в названии выделяются заглавными буквами, получаются, как
горбы верблюда. А вот имена переменных в PHP регистрозависимы. Это
значит, что вы их можете писать только так, как вы их написали, и «А»
(большая), и «а» (маленькая) – это разные переменные. Рекомендуется
переменные обозначать строчными буквами.
60
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

А что же с константами? А вот с константами по выбору. Вы можете хоть


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

И существуют так предопределенные константы, которые, хотя


называются константами, но на самом деле их значение меняется от
контекста, в котором они используются.

Полный список вот таких предопределенных констант находится вот по


этому адресу http://php.net/manual/ru/reserved.constants.php. Их много,
и они полезны для программиста. Но мы посмотрим только два, которые
очень часто используются.

Константа, которая дает полный путь и имя текущего файла, причем,


если используется внутри подключаемого файла, то возвращается имя
данного файла. И папка файла. Здесь тот же самый принцип: если
используется внутри подключаемого файла, то возвращается папка этого
файла. Чуть позже мы посмотрим пример, как использовать эту
константу.

Теперь переходим к операторам.

61
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Операторов в языке PHP много, начнем с арифметических. Они все


достаточно просты: сложение, вычитание, умножение. Разве что
инкремент увеличения на единицу, инкремент уменьшения на единицу.
И есть оператор возведения в степень. Опять же, такие логические
операторы: «равно», «не равно», «меньше», «больше», «меньше или
равно» понятны, но здесь добавляются операторы «эквивалентно» и «
неэквивалентно». Что это значит? «Эквивалентно» означает, что не
только значения двух переменных равны, но еще и типы этих значений
равны.

Побитовые и логические операторы.

Побитовые не буду даже обсуждать, потому что вряд ли они вам


пригодятся в PHP, просто вы должны знать, что они есть. А логические
очень даже нужны, полезны. «AND», «OR», отрицание соответствуют
логическому «И», логическому «ИЛИ» и логическому отрицанию. PHP
развивается, и кто-то подумал: «А почему нет такого знака как «<=>».
Раз нет, давайте сделаем». Таким образом, в PHP есть такой интересный

62
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
оператор, который возвращает число меньшее, большее или равное
нулю, когда «$а» меньше, больше или равно «$b». Трудно представить
себе ситуацию, когда это может пригодиться, но такой оператор есть, и
вам интересно о нем узнать.

Оператор циклов и ветвления.

Для тех, кто знает язык Си, здесь всё очевидно. Но сейчас я кратко их
перечислю, и мы чуть позже на примерах их рассмотрим.

 Цикл с переменной «for», где есть специальное выражение о том,


как развивать цикл. Этот цикл выполняется столько раз, сколько
записано в этих выражениях.
 Этот оператор новый – «foreach». Мы отдельно его чуть позже
рассмотрим.
 Цикл с предусловием («while»): вычисляется выражение, и пока это
выражение верно, выполняется данный оператор.
 Цикл с постусловием («do оператор while (выражение)»): сначала
выполняется оператор, затем проверяется выражение, и, если оно
верно, цикл идет на начало.
 Условное выполнение мы уже рассмотрели (если выражение, то
оператор)
 Оператор выбора «switch» в зависимости от выражения идет по тому
или иному пути.
 И два полезных оператора: оператор «break» – оператор
завершения цикла или выбора, и оператор «continue» – переход на
повторение цикла.

Теперь посмотрим перебор ассоциативного массива.

63
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

В ассоциативном массиве обращение к элементам массива идет по


ключу. И возникает вопрос: а если нам нужно обойти все элементы
ассоциативного массива, то что мы делаем? В этом случае, мы
используем цикл «foreach», который последовательно обходит элементы
массива с первого до последнего. При этом на каждой итерации ключ
записывается в переменную «key», а значение в переменную «value» .
Причем «key» и «value» могут быть любыми. При этом переменная «key»
не обязательна.

Посмотрим на примерах. Мы задали ассоциативный массив, у которого


ключи «first», «second», «third», а значения «яблоко», «груша»,
«слива». Мы пишем либо полную форму, если нас интересует и ключ, и
значение, и выводим ключ и значение; если нас интересует только
значение, то мы можем написать «foreach arr value» и просто печатаем
значение. Если вы хотите изменять элементы массива внутри цикла, то
переменной «value» должен предшествовать знак амперсанд, и в этом
случае значение будет присваиваться по ссылке.

Теперь давайте посмотрим это всё на деле. Нам нужен сайт 9-й, нас
интересует «index» и «main». В «index» написаны наши примеры.
Зайдем в урок 3.2 и обновим. У нас пока эти закомментированы, и
давайте смотреть ShowFileName. Что мы здесь делаем? Здесь мы
используем предопределенную константу «FILE» и просто выводим ее на
экран. Давайте будем смотреть, что у нас вывелось. Вывелся путь к
нашему файлу. Дальше убираем, цикл «for», «ShowArray1» . Смотрим,
что у нас происходит с «ShowArray1». Есть массив, вот он задан, и
теперь мы задаем цикл. Итак, как задается цикл «for»? Сначала
переменной цикла присваивается значение, затем проверяется условие,
по которому будет решаться, останавливать цикл или нет, и какие
действия происходят после каждой итерации. В данном случае у нас
сначала «i=0», мы проверяем, что «i<6», и, соответственно, каждый раз
набавляем «i» на 1. Таким образом, у нас выводятся в двойных кавычках
(это значит, что у нас будет заменяться на значение) элементы нашего

64
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
массива. Сохраняем, обновляем, и вот выведены элементы нашего
массива.

Дальше убираем комментарии и смотрим «ShowArray2». Вот он задан


ассоциативный массив, о котором мы говорили, и мы задаем «foreach
{$a as $value}» и выводим это значение. Нажимаем «Сохранить»,
«Обновить», и у нас вывелись эти значения массива. Дальше цикл
«while», смотрим «ShowArray3». Это очень похоже по использованию на
цикл «for». У нас есть массив, мы обнулили в самом начале переменную
цикла, и, пока переменная цикла меньше 6, выводим и набавляем эту
переменную. Сохраняем, обновляем, и этот же массив у нас вывелся.
Дальше цикл «do», ««ShowArray4». Здесь всё то же самое, только здесь
условие стоит в начале, а здесь – в конце. Сохраняем, обновляем. Всё
прекрасно работает.

Теперь мы переходим к выводу двумерного массива. Смотрите, что здесь


поменяется. У нас двумерный массив с предыдущего урока, когда у нас
была такая таблица. Что мы делаем? Здесь мы выносим в начало
заголовок таблицы и в окончание таблицы, и начинается цикл в цикле.
Верхний цикл «cars» – это как раз массив массивов. Что такое
двумерный массив в данном случае? Это массив массивов. Поэтому мы
говорим, что в массиве «cars» для каждого массива что-то надо сделать.
Вводим тег начала строки, и дальше пошел внутренний цикл. А это
массив, который мы обозначили, и нам нужны значения этого массива.
Здесь элементы ячейки – мы это значение просто выводим, и в конце
завершаем строку. Давайте это посмотрим. Заходим, обновляем. Вот мы
вывели цикл по двумерному массиву.

Сейчас вы уже достаточно много знаете, у нас уже появляются задания


в уроках, и задание для этого урока – в каждом цикле вам нужно
вывести по 2 элемента. Идете в каждый цикл, что-то меняете, чтобы
вывелось по 2 элемента.

65
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
3.3 Язык описания стилей CSS
Это еще один язык, который обязательно нужно знать PHP-
программисту, потому что данный язык сейчас очень распространен для
разработки сайтов.

Что же такое CSS? CSS является аббревиатурой от английского


Cascading Style Sheets, что в переводе на русский означает «каскадные
таблицы стилей». В настоящее время CSS – это развитый инструмент
верстки сайта, и обычно используется верстальщиками. Целиком изучать
CSS вам не потребуется, потому что фактически CSS – это отдельные
файлы, как мы сейчас увидим. Вы даже не будете иметь к ним доступа,
этим будут заниматься верстальщики. Но для того, чтобы все-таки
каким-то образом описать сайт, всё равно CSS нужен.

К счастью, программисту необходимо знать только основы CSS. Есть


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

Итак, базовый синтаксис CSS.

66
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Возникает вопрос: для чего он был нужен, для чего был создан CSS?
Смотрите, язык HTML отвечает на вопрос «что это?». Например,
заголовок сайта или главы – это текст, это ссылка и т.д. HTML позволяет
браузеру правильно определить, что за элемент присутствует. Так вот,
CSS отвечает на вопрос «как это отобразить?». И почему он появился –
это тоже важный момент; и почему он отдельный.

Потому что в какой-то момент разработчики столкнулись с ситуацией:


есть некоторая веб-страница, на которой нужно выводить что-то
содержательное (текст, картинки и т.д.). И сидит HTML-верстальщик или
контент-менеджер, который выводит тест. Но одновременно с этим есть
дизайнер, которому нужно красиво всё это подать. Получается, что они
работают с одним документом. Это очень неудобно, и разделить работу
никак не получается. Именно для этой цели был создан CSS – для того,
чтобы отделить «что это» от «как это отобразить».

Как же выглядит CSS? CSS – это набор конструкций следующего вида:


«селектор {свойство: значение;}». И селектор – это некоторый тег
HTML, который мы хотим как-то отобразить. У этого селектора есть
какое-то свойство, и мы даем ему какое-то значение. Существуют 3
варианта применения CSS, которые мы сейчас рассмотрим. Самый
простой вариант – это просто взять тег, и прямо в теге HTML добавить
свойство «style» (стиль) и прямо там написать «background-color», то
есть цвет фона равен. И вот эта запись – это шестнадцатеричная запись
цвета, где по две цифры означают RGB, то есть красный, зеленый,
синий. В данном случае R – это red. Это значит, что это красный цвет. И
давайте эту строчку сейчас и вставим.

Итак, вот у нас урок, сайт десятый, мы его открыли, и идем в заголовок
«header php». Здесь у нас есть «body», и вместо этого «body» мы
вставляем стиль прямо сюда. Сделаем, чтобы фон был красным.
Сохраняем и обновляем. Вот у нас красный фон для нашей страницы.

67
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Дальше второй вариант. Можно прямо в заголовке страницы вставить
стиль «style» и дальше записывать описания для всех элементов.
Давайте опять перейдем сюда, здесь убираем и вставляем просто стиль.
Красный уже был, давайте здесь сделаем зеленый. «Сохранить» и
«Обновить». Вот мы задали зеленый цвет странице. При этом мы его
задали именно в заголовке. И здесь мы можем прописывать какие-то
другие параметры. Но этот способ не рекомендуется, естественно, хотя
теоретически его можно применять, это только для каких-то
специальных целей.

А теперь перейдем к основному способу.

Третий рекомендуемый способ использования CSS – это единая таблица


стилей для всего сайта. И что же это такое? Мы сначала создаем
отдельный файл (у него расширение «css») – обычный текстовый файл;
чтобы не путаться, мы его так отделяем. В данном случае у нас это
«style.css». В CSS комментарии такие же, как и в PHP (/*). Теперь
смотрите. У нас есть некоторый заголовок h1 – мы для него что-то
прописали; для заголовка 2 – опять прописали; для таблицы, для строки
и т.д. В этом случае нам только нужно в заголовке указать ссылку на
этот самый CSS-файл. Нам нужно проставить в каждой веб-странице, что
мы ссылаемся на такой-то файл стиля. Для каждого тега мы можем
прописать любой стиль. Давайте это сделаем.

Итак, мы идем в заголовок. Этот стиль мы убираем, и у нас здесь есть


уже закомментированный вставленный стиль, мы здесь пишем: «link»;
дальше говорим, что это таблица стилей, и дальше «href» ссылаемся на
этот файл. Дальше сохраняем и обновляем. Мы видим, какие у нас
произошли изменения. В соответствии с нашим стилевым файлом
заголовки 1-го и 2-го уровней у нас стал синими, а таблица (сейчас пока
не будем разбирать, что здесь написано) выводится.

Есть еще один важный момент – базовые стили CSS.

68
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Я скажу так: если у вас есть верстальщик, то, конечно, никакие базовые
стили вам совершенно не нужны: верстальщик сделает то, что нужно.
Базовые стили применяются для макетов, когда вам нужно очень быстро,
то, как мы говорили, PHP – быстрый способ создания страниц. Для этого
и существуют базовые стили. Почему лучше использовать базовые
стили, а не крутить что-то свое? Есть хорошая иллюстрация –
специально сделали верстальщики сайт под названием «badhtml.com»
(давайте на него посмотрим). Это образец того, как сайты делать не
надо, это то, что обычно делают любители, которые превращают
страницу в такой ужас.

Итак, мы не хотим разрабатывать сами, а хотим использовать базовые


стили. Тогда мы там, где у нас ссылка на стиль, ссылаемся на
официальный сайт и берем здесь один из 8 основных стилей. Но так как
мы уже можем программировать, то давайте сделаем это через
программу. Сейчас это закомментируем.

У нас есть ShowStyle – это программа, которая будет отображать нам


некоторый стиль из базовых стилей. Раскомментировали. Здесь будет
отображаться имя, а здесь будет отображаться ссылка для перехода к
следующему стилю. И давайте посмотрим, как эта программа работает.
Мы заводим глобальный массив с восьмью названиями стандартных
базовых стилей. Вот глобальный массив. Кстати, для перехода в «Geany»
есть вкладка «Символы», по которой очень удобно переходить, потому
что здесь все функции расставлены по алфавиту. И нам нужно:

1. показать стиль в заголовке. Программа должна отобразить, и мы


будем брать из нашего глобального массива, который нам будет
передан в строке с помощью «GET», и будем передавать странице, что
мы хотим отобразить этот стиль;
2. в нашей странице с помощью «ShowStyleName» мы будем писать
имя этого стиля;
3. в «NextStyle» будем выводить ссылку, в которой будем подставлять
номер следующего стиля. Причем, с помощью функции «NextIndex»

69
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
мы смотрим: если номер стиля меньше 7, то увеличиваем, и если
перебрали все 8 стилей, то возвращаемся на единицу.

Сохраняем и проверяем работу нашей программы. Итак, обновили,


сейчас у нас стилей нет. И теперь, когда я подвожу мышь, то внизу
отображается та ссылка, на которую сейчас перейдет. В данном случае
перейдет на «Index 1». И вот, первый стандартный стиль, который
называется «Midnight». Нажимаем следующий стиль – «Modernist».
Следующий. Вот имена, а здесь можете увидеть номера этих стилей.
Следующий стиль «Traditional»,»Ultramarine». И мы возвращаемся к
первому стилю.

Таким образом, мы достаточно быстро можем использовать стили в


любой нашей программе.

70
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
3.4 Основы верстки
Этот урок важен, потому что, хотя версткой занимается верстальщик,
есть некоторые вещи, которые должен решать программист. И поэтому
мы сейчас рассмотрим некоторые базовые знания, которые должен
знать программист.

Итак, что такое верстка? Верстка сайта – это размещение элементов


сайта согласно некоторому макету, который обычно разрабатывается
дизайнером. Сложность верстки связана с тем, что сайт открывается на
различных устройствах – от больших экранов до мобильных телефонов,
и в разных браузерах: «Firefox», «Opera» и т.д. И поэтому нет
единственно верного подхода к верстке. Как правило, верстка требует
принятия ряда решений, компромиссов, в которых участвует и
программист сайта.

И есть много сервисов. Можно посмотреть сайт на разных устройствах в


данном сервисе. Введем здесь: «progtips.ru». И смотрите, что мы видим.
На экране настольного компьютера сайт будет выглядеть вот так. На
планшете (например, «iPad») он будет выглядеть тоже более-менее. Но
вот уже на маленьком экране, вы видите, как он съеживается. А если мы
возьмем какой-нибудь большой, то мы увидим, что слева и справа есть
пустые поля. Сама идея, когда программист, особенно тот, кто пришел с
традиционных языков и привык к тому, как он форму задаст, так она
будет и отображаться, здесь, конечно, нужно думать немного по-
другому. Нужно думать в процессе переменного дизайна. И что же
обычно нужно решать?

Выбор верстки.

71
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Итак, существуют 2 вида верстки: табличная и блочная.

Табличная – берем обычную таблицу и помещаем в нее элементы


дизайна. Преимущество табличной верстки – это простота, это делается
в 3 секунды. Но есть и недостатки. Во-первых, страница отображается
только целиком. До тех пор, пока вся таблица не будет передана в
браузер, на экране пользователя ничего не будет. Это вообще-то
раздражает. На маленьких экранах страница слишком мелко выглядит,
требуется обычно отдельная мобильная версия сайта. Конечно, если вы
сделаете таблицу в виде одного столбца, то не требуется отдельная
мобильная версия, но в большинстве случаев приходится все-таки к
этому прибегать.

Есть другой более современный и более настраиваемый вариант –


блочная верстка. Блочная верстка, во-первых, отображается по мере
загрузки. Она никак не тормозит и может адаптироваться под различные
версии сайта. Она может даже меняться в зависимости от того, смотрят
на нее с настольного компьютера или мобильного устройства.

Кроме того, существует 2 вида реакций на размер экрана:


фиксированная и резиновая. Фиксированная никак не меняется. Есть
какой-то размер экрана, мы зафиксировали размер. И поэтому
фиксированная верстка имеет или пустые поля, или горизонтальную
прокрутку. Но зато она выглядит красиво так, как нарисовал дизайнер.
Резиновая верстка растягивается на весь экран, и сделать так, чтобы она
выглядела красиво, весьма проблематично.

Кроме того, есть понятие некоторых элементов, к которым пользователь


привык. Не обязательно, что именно так надо делать. Просто есть какие-
то уже устоявшиеся понятия: шапка, верхнее меню, левый блок, в
центральной части размещают содержимое, правый блок и подвал.
Фактически, для того, чтобы сделать некоторый готовый сайт, нужно
хотя бы ориентироваться на такую структуру.

72
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Еще нужно знать такую полезную вещь для быстрого прототипа: если
нам нужно увидеть, как сайт будет выглядеть, его надо заполнить каким-
то текстом. И вот есть один из сервисов, в котором вы задаете
параметры, нажимаете «Сгенерировать какой-то текст», и получаете
случайный текст, чтобы заполнить ваш прототип сайта.

Теперь давайте посмотрим, как же это выглядит. Мы переходим к


«Site11», вот у нас «index.php». У нас будет 2 отображения нашей
страницы: «ShowPageTable» (табличная верстка) и «ShowPageBlock»
(блок). Давайте начнем с табличной верстки. Мы открыли таблицу, и
дальше размещаем в разных строках и столбцах наши какие-то
элементы. И здесь как раз идет случайный текст, и таблица закрывается.
Вот табличная верстка, что называется, проще некуда.

И давайте посмотрим, как она выглядит: шапка, подвал, основной текст,


в данном случае только левый блок. Соответственно, всё просто. При
этом, здесь в таблице мы указываем «100%» – это так называемая
резиновая верстка. Смотрите, что происходит, если мы уменьшаем. У
нас, несмотря на то, что мы меняем размер, сайт всё время заполняет
весь доступный размер. Это резиновая верстка, она не привязана к
таблице или блокам – и там, и там можно сделать резиновую или
фиксированную.

И теперь смотрим блочную верстку. Здесь комментируем, здесь


открываем. Блочная верстка намного сложнее. Для блочной верстки есть
специальные элементы «div», которые могут иметь некоторые названия
после «id». И каждый элемент «div» описывается так же, как любой
элемент в CSS. И вот у нас «style.css». Есть «id=”header”» (шапка сайта),
у нас для него все параметры указаны. При этом смотрите, что у нас
здесь задана конкретная ширина. И общая оболочка – здесь тоже
указана конкретная ширина. Это признак фиксированности, не 100%, а
конкретная ширина. И дальше для всех элементов расписано. Как вы
понимаете, чтобы это всё расписать, требуется время и усилие.

73
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

А дальше в основном всё просто. После того, как мы расписали


различные «div», для каждого указали, как он будет отображаться,
после этого в любой «div» помещаем наш контент и можем посмотреть,
как это выглядит. Сохраняем и обновляем. И вот у нас получилась
блочная верстка, при этом она достаточно хорошо выглядит, и она
фиксированная. Если мы начинаем ее уменьшать, то через некоторое
время получаем вот эту горизонтальную прокрутку. Зато мы видим, что
как дизайнер задумал, так оно и отображается. Она имеет весьма
стабильный дизайн. Таким образом, вы можете уже принять решения по
верстке вашего сайта.

74
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
3.5 Работа со строками
В силу важности обработки строк при программировании сайта PHP
содержит большой диапазон средств работы со строками. На этой
странице вы можете посмотреть, какое количество функций работы со
строками у вас есть. Мы все рассматривать не будем, а посмотрим общий
принцип, для того чтобы потом уже легко могли применять эти функции.

Давайте самое простейшее. strlen – возвращает длину строки. На входе –


строка, на выходе – целое число, которое означает длину строки. Другая
функция trim – удаляет пробелы (или другие символы) из начала и
конца строки. Вы можете либо дать строку на вход и получить строку без
пробелов, либо можете задать маску, какие именно спецсимволы нужно
убрать из этой строки. Но есть один момент, который касается работы с
кириллицей.

Как вы знаете, сейчас рекомендуется создавать сайты на кодировке UTF-


8. В этой кодировке существует различное число байтов для
кодирования символа. В частности, для кириллицы кодируется символ
двумя байтами, и поэтому при работе с кириллицей нужно использовать
функции для работы с многобайтовой кодировкой. Эти функции имеют
префикс «mb_» и находятся они на этой странице:
http://php.net/manual/ru/book.mbstring.php. Они ничем особым не
отличаются. Например, вместо «strlen» есть функция «mb_strlen».
Дальше мы будем использовать обычные варианты, рассматривать
функции, но вы должны знать, что для кириллицы требуется этот
префикс.

Поиск в строке.

75
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Первую рассмотрю подробно: «substr» – возвращает подстроку. На вход


нужно дать саму строку, дальше стартовую позицию (нумерация идет с
0), и сколько символов вам надо вернуть. Если эта функция не задана,
то возвращается весь остаток строки. Вот у нас строка «substr(“abcdef”,
2)». Мы указали, что стартовая позиция 2, значит, 0, 1, и до конца
строки, то есть возвращает «cdef». А если мы показываем «-2», то
нумерация идет в обратную сторону, справа налево, и у нас получается
0, 1 – это «ef», возвращает «ef».

Дальше, по исходному принципу, «strops» возвращает позицию


вхождения некоторой строки в первую позицию. Вы задаете строку, в
которой вы ищете, и подстроку, которую нужно определить, и получаете
на выходе позицию: int strpos ( string $haystack , mixed $needle [, int
$offset = 0] ). Этот вариант «strrpos» возвращает позицию последнего
вхождения строки. «strstr» возвращает часть строки. «substr_count»
возвращает число вхождений построки.

Преобразование строк.

76
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Есть очень полезная функция «number_format», которая возвращает


строку, представляющую число в заданном формате, где мы задаем
число с плавающей точкой, задаем количество десятичных, то, что идет
после точки, как отделяется десятичная часть числа и как отделяются
тысячи. Если мы зададим вот такое число с плавающей точкой и будем
использовать «number_format»: число точек после запятой – 2; точка –
это разделитель; и разделитель тысяч – пробел. Дальше функция,
которая преобразует строку в нижний регистр; функция, которая
преобразует строку в верхний регистр.

И есть еще интересная функция работы с URL. Если нам нужно разобрать
адрес URL на отдельные составляющие, то мы передаем этой функции
строку URL и получаем отдельные составляющие этого адреса как
вариант элемента массива.

И давайте посмотрим пример использования функции работы со


строками. Итак, мы переходим на «Site12» и идем на «index.php». Мы
сейчас научимся такому интересному приему работы, который
достаточно часто используется в PHP-программировании, который
заключается в следующем. Сначала посмотрим нашу страницу, вот она.
Здесь задается некоторая форма, где нам нужно ввести строку. Обратите
внимание: когда мы для этой формы задаем в качестве обработчика этот
же самый файл («index.php»), вы, конечно же, спросите: «А тогда как
это будет работать?». Смотрите, какой прием мы здесь используем.

Мы должны в этой форме передать некоторое значение. В данном


случае, «firstname». Смотрите, как действует функция ShowText. Она
проверяет empty($_POST[“firstname”]) – это значит, что в данном случае
значение пустое, нам форма ничего пока не передала. Когда мы первый
раз зайдем, нам форма ничего не передала, поэтому мы просто напишем:
«“Нет строки”». А если нам что-то передали, то мы уже будем выводить
эту строку с различными преобразованиями.

77
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Сначала давайте что-то введем. Например, напишем: «show123123».
Нажмем «ОК». И вот теперь начинается обработка. Сначала
переключимся, вообще, что за обработка у нас здесь происходит.
Смотрите, это те функции, которые мы сейчас рассмотрели, и посмотрим,
как их легко применять. Мы сначала заводим переменную «s», куда
помещаем переданную строку, и начинаем писать, что введена строка
«s», далее длина строки.

Дальше мы можем обрезать пробелы, напечатать строку без пробелов,


длину строки без пробелов. Первые 2 символа – «substr($s, 2)» (мы
начинаем с 0, и 2 символа); последние 2 символа – «substr($s, -2)».
Первая позиция – единица. Мы даем на вход нашу строку «s» и
подстроку, которую мы ищем. Последняя позиция единицы здесь
«strrpos». Фрагмент строки с единицей – «strstr». Число единиц –
подсчитываем «substr», и дальше переводим верхний и нижний регистр.

Посмотрим, как это всё работает. Вот введена наша строка. Длина
строки: 10; строка без пробелов; первые 2 символа: sh; последние 2
символа: 23; первая позиция единицы: 4, подсчет от 0; фрагмент строки
с единицей: 123123; число единиц: 2; переводим верхний регистр,
переводим нижний регистр. Наша программа работает. Но если мы здесь
напишем кириллицу «Вася123» и нажмем «ОК», то мы увидим, что
работает она неправильно. Соответственно, ваше задание – исправить
программу так, чтобы она правильно работала с кириллицей.

78
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
3.6 Работа с файлами
Важно знать такую вещь, что в целях безопасности многие провайдеры
по умолчанию запрещают работу с файлами в UNIX, и для включения
работы с конкретными файлами нужно выставить атрибуты полного
доступа.

Выставление атрибутов зависит от хостера, поэтому вам нужно просто


узнать, как выставляются в том или ином случае. Мы сейчас работаем в
Windows, здесь такой проблемы нет. И основные функции работы с
файлами следующие:

1) file_exists – проверка существования файла;


2) fopen – открытие файла;
3) fread – чтение из файла;
4) fwrite – запись в файл;
5) fclose – закрытие файла.

Полный список можно посмотреть здесь Полный список функций можно


посмотреть здесь: http://php.net/manual/ru/ref.filesystem.php.
Соответственно, достаточно много операций, но мы рассмотрим те,
которые чаще всего нужны. А именно: нам нужно открыть файл, и что-то
считать, записать. Давайте посмотрим, как это делается.

79
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Итак, порядок работы с файлом: для работы с файлом его нужно


открыть, произвести операции чтения, записи, и потом закрыть. Здесь
мы проверяем, существует ли какой-либо файл. Если не существует, то
мы выходим из функции, а если он существует, то мы его открываем, в
данном случае, на чтение; дальше запускаем цикл, считываем по 4096
байт и выводим на экран такими строками, и затем этот файл закрываем.
Сейчас мы на примере увидим еще один способ работы с файлом.

Итак, переходим в наш «Site13». Давайте посмотрим, что мы здесь


делаем. Мы здесь делаем так называемую гостевую книгу. Раньше, на
заре развития интернета, это была достаточно популярная вещь, очень
простая, быстро делалась. И сейчас вы увидите, как просто ее сделать.
Давайте сначала посмотрим, как она выглядит в самом начале. В самом
начале здесь «Записи», пока они пустые, здесь «Форма ввода». И вот
здесь специально мы сделали список файлов, для того чтобы вы
увидели, что файл будет создан, он здесь появится. Давайте посмотрим,
как это происходит.

Итак, вот у нас основная функция «guestbook», которая и делает


гостевую книгу. Вначале мы проверяем, есть ли у нас «username», были
ли введены какие-то данные. Если нет, то мы ничего не делаем, это
первый раз. Но если мы ввели данные, то мы записываем переменную
«user», мы записываем комментарий, убираем все теги в этом
комментарии. Дальше открываем файл, т.е. «a+» на добавление. Файл у
нас будет называться «guest.dat». Формируем дату, и дальше пошла
запись. Сначала указываем цвет шрифта, записываем дату, затем мы
записываем имя пользователя (тот, кто написал что-то), затем
записываем его комментарий и закрываем файл.

И вот в конце есть интересная функция «readfile», которая просто


выводит на экран содержимое какого-то файла. А здесь ShowFiles,
давайте посмотрим. Это как раз работа с папками, она достаточно
простая. Мы открываем папку (в данном случае, текущую), а затем в

80
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
цикле начинаем считывать следующий файл в текущей папке и просто
выводим его на экран, в конце эту папку закрываем.

Теперь давайте посмотрим как это всё функционирует. «Ваше имя»,


допустим, Вася. Пишем: «Сайт хороший» и нажимаем «Отправить».
Смотрите, вот в записи появилось: дата, время, Вася написал, что сайт
хороший, а в списке появился файлик «guest.dat», этот файл сейчас
создался. Дальше еще напишем пару комментариев, чтобы вы поняли
принцип. Вот он записывается. «Коля», «Так себе». Такая вот простая
гостевая книга, которая сделана на основе записи в файл.

81
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
4. Основы MySQL
4.1 Взаимодействие PHP и MySQL
MySQL – это система управления базами данных, сокращенно СУБД, и,
как правило, она используется в связке с PHP. Давайте разберемся.

В основе большинства сайтов находится некоторая база данных (БД).


Например:

 Википедия – это база терминов.


 Booking – база отелей.
 Kinopoisk – база фильмов.
 Любой интернет-магазин – это база товаров.

Почему? Потому что организация данных в виде базы данных позволяет


легко сортировать, искать информацию, представлять в разных
разрезах. И поэтому для того, чтобы сайт был полезен, необходимо в
99% случаев использовать БД. Поэтому программисту нужно знать, как
нужно работать с БД. Для подробного описания работы с базами данных
я рекомендую курс «Программирование баз данных на SQLite». Чуть
позже скажу пару слов, чем отличается SQLite и MySQL. В этом курсе
много информации, как правильно работать с базами данных. В этом
курсе мы разберемся с базами данных на MySQL в таком упрощенном
варианте, чтобы вы просто могли обращаться к базе данных и как-то с
ней работать. Но профессиональная работа требует намного большего
количества знаний.

82
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Сначала пару слов о разнице между MySQL и SQLite, они отличаются вот
чем. Вообще SQLite приблизительно в два раза быстрее, чем MySQL. Но
SQLite предназначен для небольшого числа одновременных обращений к
БД. Если число обращений будет превышать тысячу или десятки тысяч
обращений одновременно, то SQLite будет работать очень медленно. А
вот MySQL как раз предназначена для большого количества обращений.

Каким образом это сделано? MySQL – это многопоточный сервер базы


данных. Это значит, что когда некоторый посетитель хочет подключиться
к БД, то для этого посетителя создается свой процесс, который не
зависит от других посетителей, и это обеспечивается собственными
средствами СУБД. И поэтому для интернета, там, где обращений могут
быть десятки тысяч, гораздо удобнее СУБД MySQL. Ну и обычно есть
некоторое такое правило, оно н обязательно, но просто чтобы вы
представляли. Обычно один сайт работает на одной БД. У MySQL есть
официальный сайт www.mysql.com.

Вся необходимая информация по MySQL тут находится, вы ее можете


найти. Еще одно замечание, что сейчас часто говорят, что MySQL
устарела и есть какие-то другие БД. Смотрите по факту: на любом
хостинге есть связка PHP и MySQL, большинство сайтов ее используют,
полно книг, руководств и эта связка очень хорошо описана, изучена. И
зная ее, вы гарантированно можете сделать нормальный динамический
сайт. Другие БД, именно с точки зрения интернета, это все-таки сейчас
пока экзотика, можете их изучать, применять и так далее, но учтите, что
одно дело – рекламные заявления. В практическом смысле они не всегда
соответствуют реальности.

83
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

И теперь поговорим еще об одной важной вещи. До четвертой версии


MySQL в PHP использовалось расширение с названием MySQL.
Большинство книг по PHP/ MySQL описывают именно это расширение. Но
начиная с четвертой версии, было предложено расширение MySQL
Improved (MySQLi), которое и рекомендуется к применению. Это
расширение имеет хорошее описание на официальном сайте:
http://php.net/manual/ru/book.mysqli.php

Мы дальше в курсе будем рассматривать именно MySQLi. Но если вы


открываете какую-то книгу по MySQL или смотрите какие-то исходные
тексты программ по MySQL, то сейчас мы рассмотрим простой пример и
признак, по которому можно определить, к какому расширению
относится данное руководство. Это можно определить по символу «i» в
конце функции.

Старое расширение имеет команду – mysql_connect.


А в новом расширении просто добавлена сюда буква «i» –
mysqli_connect.
Таким образом, если вы видите букву «i» - это значит, разговор идет о
новом расширении. И вы всегда можете определить, эта информация
актуальна или нет.

84
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
4.2 Язык запросов SQL
Для работы с БД предназначен так называемый язык запросов SQL и
СУБД MySQL его полностью поддерживает.

И для всех реляционных БД, что такое «реляционная» мы узнаем чуть


позже, для них для всех SQL является фактическим стандартом. При
этом для языка SQL не имеет значения физическая реализация БД,
потому что все манипуляции с данными предполагают виртуальную БД,
из которой берутся данные. Что это значит с точки зрения
программиста? Это значит, что все базы для человека, который знает
язык SQL, одинаковые и нужно только узнать, как именно передавать
запросы к БД и дальше работать только через SQL-запросы.

И еще один практический совет: если некоторую функцию можно


реализовать или в PHP, или через SQL-запрос, то нужно учитывать, что
SQL-запрос будет работать намного быстрее. Ну например, вы получили
какие-то данные и вы хотите их отсортировать. И у вас есть два пути: вы
можете получить их из БД неотсортированными и отсортировать в PHP,
или с помощью SQL-запроса получить уже сортированные данные. Так
вот так как PHP – это интерпретатор, то сортировка будет идти очень
медленно. Библиотека MySQL написана на С и она уже откомпилирована,
поэтому можно получить отсортированный запрос намного быстрее.

85
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Теперь давайте разберемся с терминологией. В основе БД лежат


таблицы. Таблица – всем нам привычная вещь, если мы на нее
посмотрим, мы увидим, что есть строки, есть столбцы. Так вот строки в
БД называются «записи», а столбцы – «поля». При этом если, например,
есть запись, условно говоря, «Петров», то мы предполагаем, что есть
некоторый объект Петров, к которому эта запись относится. Это значит,
что у Петрова есть номер в этой таблице, в данном случае – 2, фамилия
– Петров, оклад – 15000 и год рождения – 1985. То есть одна запись
относится к одному объекту. А поле – это определенное свойство
объекта. Например, оклад.

И теперь посмотрим, как выглядит вообще язык SQL-запросов. Он


достаточно прост. Давайте посмотрим на конкретику. Первая команда –
удалить таблицу «Сотрудники», если она существует: DROP TABLE IF
EXISTS Сотрудники. То есть что тут? Если м несколько раз будем
выполнять наши запросы, и для того, чтобы у нас не было ошибки, что
эта таблица существует, мы в самом начале просто эту таблицу удаляем.

86
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
CREATE TABLE Сотрудники (‘N’, ‘Фамилия’, ‘Оклад’) – то есть создать
таблицу «Сотрудники». И здесь мы указываем имена полей. И здесь
общее правило, что если имя поля у вас может быть неправильно
прочитано, а там более сложная запись, то в этих случаях используется
обратная кавычка, то есть имя пользователя заключается в обратные
кавычки. Обратная кавычка находится на клавиатуре слева, там, где
буква Е.

INSERT INTO Сотрудники (‘N’, ‘Фамилия’, ‘Оклад’) – вставить в таблицу


«Сотрудники», вот в эти поля, которые мы выделили обратными
кавычками, значения. Вставляются они в том порядке, в котором
записаны, то есть N = 1, Фамилия – Иванов, Оклад – 35000 и так далее.
То есть мы можем добавлять одной командой сразу несколько записей. И
вот это все вместе – это мы создали таблицу и заполнили ее записями, а
если нам надо получить записи, то мы пишем: SELECT * FROM
Сотрудники – это значит, что мы хотим получить все поля из таблицы
Сотрудники». Как видите, читаются SQL-запросы достаточно просто.

Теперь важный момент. Использование кириллицы в БД. Раньше


использовать кириллицу в именах объектов нельзя было. И начиная с
MySQL 5.0 стало можно. Но учтите, что это может вызвать сложности с
библиотеками и утилитами сторонних разработчиков. Поэтому если вы в
проекте планируете их использовать, то нужно писать имена объектов
БД латиницей.

Теперь для использования кириллицы, вам нужно задавать для ваших


таблиц кодировку “utf8” и способ сравнения “utf8_general_ci”. И теперь
смотрите. Иногда такой дается совет, что в любом случае пишите
латиницей. Но здесь этот совет достаточно странный, потому что если
что-то у нас записано кириллицей, то моментально взгляд выхватывает
суть этого запроса, потому что кириллица сразу привлекает к себе
внимание. Тот же самый запрос, но сделанный латиницей, уже требует
некоторого внимания для того, чтобы разделить, где здесь имена полей,

87
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
а где ключевые слова языка SQL. Ну и еще один признак: если вы
видите руководства или исходные тексты, написанные именно
латиницей, то скорее всего данное руководство или данный текст уже
устарели. Поэтому поищите более свежую версию.

88
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
4.3 Менеджер БД phpMyAdmin
Для того, чтобы эффективно работать с БД, нам нужно видеть, что
происходит в БД, какие там таблицы, поля, результат наших действий,
для этого используются так называемые менеджеры БД. И самым
популярным менеджером для MySQL является phpMyAdmin.

Он установлен практически на любом хостинге, он бесплатный,


русскоязычный, его достоинство в том, что за долгое время развития с
помощью этого менеджера можно сделать практически всё, что угодно.
Вот есть официальный сайт (www.phpmyadmin.net), где полностью вся
информация о нем есть. Я сразу скажу, что фактически всё, что нужно
делать в phpMyAdmin, там настолько большое количество подсказок, что
всё достаточно самоочевидно. Понятно, что существуют еще менеджеры
БД, но именно в силу того, что phpMyAdmin есть везде, в любом случае
вам рекомендуется с ним ознакомиться.

В сборке uWamp данные для доступа в phpMyAdmin. Пользователь: root.


Пароль: root. Смотрите, как найти phpMyAdmin прямо в этой сборке. Это
группа Tools и вот phpMyAdmin. Нажимаем на него и получаем форму
входа. Пользователь и пароль: root. Нажимаем, вперед.

И теперь мы смотрим. Здесь все параметры, соответственно,


phpMyAdmin. Но нас интересует для начала, что слева существуют все
базы данных, которые нужны для самого функционирования
phpMyAdmin. Но обычно на хостинге вам уже будет предоставлена
некоторая БД, с которой вы будете работать. Есть такие тарифные
планы, где несколько БД, но вы будете начинать с такой минимальной,
там одна БД. Фактически она уже для вас создана и с ней можно
работать, но вот именно в phpMyAdmin нашей локальной сборки нет
ограничения на БД, можете задавать сколько угодно. Но давайте
научимся это делать. Для этого надо нажать БД сейчас.

89
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Сейчас вот тестовую мы удалим, потому что я создал ее для проверки.


Теперь давайте создадим БД Тест, пишем ее имя. И для сравнения нам
нужно выбрать utf8_general_ci.

Здесь ищем, вот она. Мы создаем БД с именем «Тест» и с кодировкой для


сравнения utf_general_ci. Нажимаем «Создать». База «Тест» создана.
Все, теперь, когда БД у нас создана, мы можем работать программно.
Давайте перейдем к нашей программе.

Это сайт 14, который соответствует уроку 4.3. И сначала мы научимся


сразу такому полезному приему, в чем он состоит? Подключение к БД. И
этот прием заключается в том, что так как параметры подключения на
локальном ПК и на хостинге обычно разные, то рекомендуется создавать
отдельный скрипт для подключения.

Например, с именем start_mysql.php


И в этом файле задаются параметры подключения к БД. При переносе
сайта на хостинг этот файл не копируется. То ест у вас будет один
start_mysql.php на вашем локальном компьютере, а один файлик на
хостинге. И таким образом там будут заданы разные параметры. Для
того, чтобы подключиться к БД, нам нужно задать следующие
параметры. Давайте их разберем.

Первое – нужно указать хост (‘host’). При этом, если серверы php и
mysql, а это чаще всего так, то localhost.
Дальше – имя пользователя (‘user’).
Пароль - ‘password’.
И имя БД - ‘test’.
И давайте посмотрим.

Вот у нас есть отдельный небольшой скрипт StartMysql, в котором


сделано следующее. Мы заводим некоторый указатель переменных $db –
от слова data base. То есть это та БД, с которой мы будем работать. При

90
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
том первая функция StartDB – это мы обращаемся к глобальной
переменной. И смотрите, что мы указываем: localhost, root, root
(пользователь и пароль) и мы указываем нашу БД Test. Если произошла
какая-то ошибка, то мы напишем, что не удалось подключиться и
выйдем. Если мы подключились, то мы для нашей БД, нам вернет $db,
мы для этой БД установим кодировку utf-8, чтобы использовать
кириллицу. И сюда же поместим функцию EndDB, которая опять же, зная
наш глобальный указатель на БД, она ее просто закрывает. Это вот
файл, который будет у нас всегда отдельно. А вот для файлика такого
же, но на хостинге, вы просто здесь и здесь введете тех пользователя и
пароль, которые вам выдаст хостер. И теперь давайте рассмотрим, что у
нас здесь происходит.

У нас следующие вещи. Мы рассматриваем подключение к БД. И у нас


сначала будет Start DB. Мы просто подключимся. Дальше InitDB, то есть
нам нужно создать таблицу. Переходим в main и смотрим нашу функцию
InitDB. Опять же берем глобальный указатель на БД. И дальше вот мы
выполняем запрос. Помните, я сказал, что с точки зрения программиста,
который знает язык SQL, ему нужно только понять, как выполняются
запросы. Как они выполняются в PHP?

Вы пишете mysqli_query, дальше к какой БД идет запрос и, собственно,


вот здесь написан SQL-запрос, который удаляет таблицу «Сотрудники»,
если она есть. Дальше если все нормально, если запрос вернул true, то
мы пишем, что таблица удалена. Если он вернул какую-то ошибку, то мы
пишем «ошибка» и пользуемся функцией mysqli_error, которой передаем
указатель на БД, а эта функция нам возвращает строчку, которая
описывает, что у нас за ошибка.

Дальше мы выполняем создание таблицы «Сотрудники». И вот здесь


давайте посмотрим, здесь чуть сложнее. Итак, здесь в обратных
кавычках первое поле: ‘N’ INT NOT NULL (INT – целое, NOT NULL –
значит, здесь не может быть значения NULL). Дальше следующее поле
пошло: ‘Фамилия’ VARCHAR (50) NOT NULL (VARCHAR – это переменное
знаковое поле размером 50 символов). Дальше: ‘Оклад’ INT NOT NULL.
Вот мы создаем эту таблицу. И здесь принцип такой. Вот мы выполняем
наш запрос SQL. Если все нормально, мы напишем: таблица создана,
если нет – ошибка. Дальше мы должны заполнить данными: PutDB.
Смотрим, как мы это делаем.

Мы, опять же, указатель и пишем наш запрос INSERT INTO Сотрудники,
мы в таблицу «Сотрудники» должны вставить три строчки для номера,
фамилии и оклада. И выполняем этот запрос, если всё нормально, пишем
– записи в таблицу вставлены, если нет – ошибка.

Следующее наше действие – получение данных. Теперь нам нужно


обратиться к таблице и посмотреть, получить данные. Вот наш запрос
SELECT, где мы говорим получить поля N. Фамилия, Оклад FROM
Сотрудники (из таблицы «Сотрудники»).

91
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Дальше, когда мы уже получаем именно некоторый запрос, то здесь


немного с ним работа сложнее. Во-первых, мы можем посмотреть,
сколько строк вернул нам наш запрос: mysqli_num_rows, то есть мы
здесь напишем число строк в запросе. Дальше нормальная практика в
PHP выводить таблицу в тег «таблица»: <table>, здесь он закончится -
</table>. И дальше начинается while, то есть мы начинаем получать
строки таблицы в ассоциативный массив. То есть вот этот result, который
мы получили в результате выполнения запроса query, мы из этого
результата запроса получаем ассоциативный массив. Дальше мы
печатаем начало строки и выводим поля: целое, строка и опять целое, и
обращаемся к нашему ассоциативному массиву через $row, здесь у нас
N, Фамилия, Оклад. Закрываем строку, закрываем таблицу и обратите
внимание. Когда мы получаем запрос именно через SELECT, то есть мы
получаем много данных, то нам нужно потом этот запрос освободить
память. И, соответственно, если не получится, опять же ошибка.

И после этого выполняем EndDB. Это просто закрытие нашей БД. Идем в
наш localhost. Сайт 14 и смотрим, что у нас произошло. Итак,
подключение к БД сделали. Дальше создание таблицы: сначала удалили
таблицу «Сотрудники», затем ее опять создали, заполнили данным,
вставили. Затем получили данные, увидели, что число строк в запросе
три и вот в качестве таблицы мы их вывели. После этого закрыли БД.
Давайте посмотрим это же.

То есть что мы в менеджере БД phpMyAdmin сделали. Вот наша БД Test.


Вот у нас есть таблица «Сотрудники». Причем здесь множество
действий, мы просто заходим в эту таблицу, вот номер, фамилия, оклад:
Иванов, Петров, Сидоров – здесь всё вставлено. То есть мы с помощью
phpMyAdmin можем посмотреть нашу БД. И задание для этого урока
следующее: измените программу так, чтобы в таблице «Сотрудники»
появилось поле «Должность». Напишите какие-то значения этого поля.

92
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
4.4 Реляционные базы данных
В этом уроке мы кратко рассмотрим реляционные БД. Напомню, что
полная информация – это целый курс, который я вам рекомендую
«Программирование БД на SQL». А здесь мы рассмотрим минимум,
потому что практически все сейчас сайты, которые сделаны на основе
PHP и MySQL используют как раз реляционные БД, и необходимо понять,
что это такое и в чем главная суть.

Реляционные базы данных – это БД, в которых таблицы связаны через


ключевые поля. И давайте рассмотрим. Первая таблица у нас «Товары»,
первое ключевое поле – Код товара, дальше идет Товар, Цена и Код
группы. И есть таблица «Группы», где есть ключевое поле Код группы,
само название Группы и Менеджер, который за это отвечает. И давайте
посмотрим вот на эту интересную связь.

Сразу скажу, что реляционные БД – сложная тема. Часто студенты


спрашивают, как в программе связать таблицы. В программе никак.
Таблицы в реляционных БД связываются через ключевые поля. Как
именно? Для того, чтобы связать товары и группы, мы заводим в таблице
«Товары» поле Код группы и смотрите, вот группа номер 1, если мы
посмотрим в другую таблицу - это Электроника. Если мы посмотрим
группу номер 2 - это Бытовая техника. Если мы можем по номеру, то есть
по ключу в одной таблице понять, какой записи соответствует этот ключ,
то мы эти две таблицы связали.

93
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

При этом есть понятие первичного ключа, в данном случае это Код
товара. Есть вторичный ключ – это в том случае, если мы модем по
вторичному ключу однозначно определить какую-то запись. И наконец
внешний ключ. В данном случае внешний ключ – это ключ, который
связывает нас с другой таблицей.

И более точно определение. Первичный ключ – это поле со значениями,


уникальными во всей таблице. По первичному ключу можно однозначно
установить нужную запись. Первичный ключ в таблице может быть
только один. Вторичный ключ – это поле с уникальными значениями, но
не совпадающее с первичным ключом. Вторичных ключей может быть
несколько. Внешний ключ – это поле, по которому можно однозначно
установить связанную запись в другой таблице.

При этом при вставке значений в таблицу первичный ключ опускается.

94
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Как же мы действуем с первичным ключом? Для первичного ключа


рекомендуется, есть разные способы, но я скажу, как рекомендуется, то
самый простой и надежный способ. Рекомендуется для любой таблицы
создавать служебное поле. Оно начинается со слова «Код…» и имеет
параметры:

AUTO_INCREMENT – автоматическое увеличение значения и PRIMARY KEY


- указание, что это первичный ключ. При этом служебные поля не
отображаются на сайте и требуются только для работы со связанными
таблицами. Это внутреннее дело программиста, которое никак не
связано с тем, что выводится на сайте.

Теперь возникает вопрос: как получить данные из связанных таблиц? И


если таблицы связаны, то можно выполнить соединение таблиц по
ключевому полю. Для обращения к полю конкретной таблицы нужно
использовать полное имя поля, которое состоит из имени таблицы, точки
имени поля: в данном случае Товары.’Товары’

При этом соединение JOIN включает запрос только те поля, где данные
совпадают. То есть мы выбираем из таблицы «Товары» поле Товар, поле
Цена и из таблицы «Группы» поле Группа (SELECT Товары.’Товар’,
Товары.’Цена’, Группы.’Группа’). И мы говорим, что хотим взять из

95
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
таблицы «Товары» эти поля, соединенные с таблицей «Группы» (FROM
Товары JOIN Группы). При этом ON – вот это условие, где код группы в
«Товарах» равен коду группы в «Группах» (ON Товары.’Код группы’ =
Группы.’Код группы’). То есть мы хотим, чтобы вот эта связь сработала.
И когда мы вот это делаем, то получаем данные из связанных таблиц.
Давайте это проверим на практике.

Итак, открывайте сайт 15. Что мы здесь делаем? Здесь то же самое, что и
в предыдущем уроке: мы подключаемся к БД (StratDB), создаем таблицы
(InitDB), заполняем их данными (PutDB), выводим эти данные (GetDB) и
закрываем таблицы (EndDB). И давайте смотреть main.

Начинаем сначала. InitDB. Итак, мы сначала удаляем таблицу «Товары»


и таблицу «Группы», если они существуют. Дальше создаем таблицу
«Товары» и вот смотрите, вот у нас AUTO_INCREMENT для кода товара и
PRIMARY_KEY. Дальше таблица «Товары» создана, все нормально.
Дальше создаем таблицу «Группы», здесь то же самое. Мы создаем Код
группы и те же самые параметры, что и выше и таблица «Группы»
создана. Дальше кладем значения – PutDB. В «Товары» добавляем
значения, добавлены. В «Группу» добавляем значения, добавлены. И вот
самое интересное, то есть вот тот запрос, который мы видели, мы его
здесь и готовим. После чего мы вводим в таблицу Товар, Цена и Группа.
И давайте это всё посмотрим.

Урок 4.4, делаем обновление и смотрим. Создание таблиц. То есть


«Товары» и «Группы» сначала удаляем, потом создаем. Записи
добавлены. И вот итоговый наш результат – мы получаем результат
нашего запроса. На самом деле, для проверки этого запроса его можно
сделать и в phpMyAdmin.

Давайте так и сделаем. Вот мы зашли в phpMyAdmin, нажали SQL. Вот


вставили наш запрос в одну строчку и нажимаем «Вперед». И вот
результат нашего запроса. Таким образом, мы можем работать с
реляционными таблицами. И вам домашнее задание: измените
программу так, чтобы в итоговой таблице появилось поле «Менеджер».

96
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
4.5 Работа с объектами MySQL
В этом уроке мы кратко познакомимся с основными операторами, с
которыми вы будете чаще всего работать.

Первое – это работа со структурой БД:


CREATE – создает объект БД (базу, таблицу, индекс и т.д.)
DROP – удаляет объект.
ALTER – изменяет объект.

Работа со структурой обычно делается относительно редко, обычно при


начале проекта. А вот работа с данными – то, что вы будете делать
постоянно:
SELECT – выборка данных.
INSERT – вставка новых записей.
UPDATE – обновление записей.
DELETE – удаление записей.

Теперь рассмотрим типы данных.

97
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

И хотя типов данных MySQL несколько, вы можете видеть эту таблицу.


Но так как у нас не является строго типизированным язык PHP, а
использует динамическую типизацию, то чаще всего используются
следующие типы:

INT – целое число.


DATETIME – Дата и время. Отображается в виде ГГГГ-ДДЧЧ:ММ:СС.
VARCHAR(M) – Строка произвольной длины до М (М<=255).

Остальные вы можете по необходимости также использовать.

Мы переходим к оператору SELECT. Чтобы понять оператор SELECT вот


такая таблица. Представьте себе, что у вас есть большая таблица тех же
самых сотрудников, у вас есть поля и у вас есть записи. Наша задача
выбрать определенные поля и записи. Как это делается? Вот общий вид
оператора:

98
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
SELECT Фамилия, Оклад (это те поля, которые нам нужны)
FROM Сотрудники (то есть из какой таблицы)
WHERE Оклад > 30000 (условие)
ORDER BY Оклад (сортировка)

Теперь если нам нужно всю таблицу выбрать, то мы просто пишем


SELECT * FROM Сотрудники. То есть при этом эта строка выведет всю
таблицу Сотрудники.

Дальше. Во время выборки мы можем группировать данные и


подсчитывать какие-то значения. Часто используемые:

AVG – средняя величина значений в определенном столбце.


COUNT – количество значений в этом столбце.
MIN – минимальное значение в столбце.
MAX – максимальное значение в столбце.
SUM – сумма значений в столбце.

Как это выглядит на примере. AS означает «дать название».

SELECT
SUM(Оклад) AS Сумма,
AVG(Оклад) AS [Средний оклад]
FROM Сотрудники

У нас появится столбец Сумма, в котором будет сумма всех окладов. А в


столбце Средний оклад будет среднее значение оклада из таблицы
Сотрудники.

Постраничный вывод.

99
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Вы наверняка много раз видели, что когда вы вводите поисковый запрос


в Яндексе или Гугле, то вам выводится 10 первых значений, а затем
можно постранично листать дальше. Это делается с помощью оператора
LIMIT в связке с оператором OFFSET. LIMIT задает максимальное число
возвращаемых записей. OFFSET – указание сдвига, с какого начинать. И
поэтому если нам нужно вывести, например, вторую страницу товаров и
мы выводим по пять значений, то мы пишем:

SELECT*
FROM Товары
LIMIT 5 OFFSET 5

Оператор INSERT. Оператор INSERT вставляет новые строки в таблицу.


Здесь приведена общая форма этого оператора, а мы рассмотрим просто
на примере: INSERT INTO Сотрудники(Фамилия, Оклад)
VALUES(‘Иванов’,20000). В поля Фамилия и Оклад мы хотим записать
значения Иванов и 20000. Как видите, все достаточно просто.

100
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Оператор UPDATE. Оператор UPDATE изменяет имеющиеся данные в


таблице. Опять же вот его полная форма. На примере:

UPDATE Выплаты
SET Месяц = “Август”, Год = 2018

Но учтите, что если вы не указываете WHERE, то будут обновлены все


строки таблицы! Поэтому чаще всего UPDATE используется в таком виде:

UPDATE Сотрудники
SET Оклад – 50000
WHERE [Код сотрудника]=1

Мы меняем таблицу Сотрудники. Устанавливаем оклад 50000, но не


всем, а только сотруднику с кодом 1.

И наконец оператор DELETE удаляет записи из таблицы. Здесь опять же


все просто. Если предложение WHERE отсутствует, удаляются все
записи. И вот как он выглядит:

101
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

DELETE FROM Выплаты


WHERE Год = 2018

Удалить все записи про выплаты 2018 года. Мы рассмотрели операторы.


Но доля того, чтобы перейти к примеру, мы познакомимся со следующей
очень полезной вещью.

Перенаправление на страницу.

Часто требуется выполнить скрипт и перейти на другую страницу сайта.


Вот для этого служит функция header. Она работает только для
внутренних страниц сайта, ее нельзя использовать для внешних сайтов.
У нее много возможностей и здесь они описаны, но мы сейчас не будем
разбираться. Мы рассмотрим два часто встречающихся примера.

header(“Location: edit_table.php”); // Переход на указанную страницу


header(“Location: “.$_SERVER[‘HTTP_REFERER’]); // Возврат на страницу
edit_table.php – пишем, какую страницу нам нужно сейчас вывести. Или
пишем во втором случае просто вторую страницу, с которой нас вызвали.
Вот это часто встречается и мы используем в примере и тот вариант, и
тот.

Давайте перейдем. Нас интересует сайт 16, и давайте посмотрим, что у


нас будет происходить. Начало стандартное. Мы подключаемся к БД,
создаем таблицы, заполняем их данными, выводим эту таблицу и вот,
что новенького - мы выведем таблицу, у которой данные уже можно
править. И начнем с перехода. Итак, мы переходим на сайт 16.

Подключились, создали таблицу, заполнили данными. Вот они, наши


данные. Мы здесь берем только таблицу Товары с двумя значениями для
простоты и вот наша ссылка. Нажимаем на ссылку. И мы видим Правку
таблицы товаров.

102
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Давайте посмотрим, что здесь происходит. Итак, edit_table (правка


таблицы). Открываем БД (StartBD), выводим нашу таблицу с
возможностью редактирования (EditDB) и вводим форму (AddDB).
Давайте посмотрим. Перейти к определению.

Итак, вот вывод формы для добавлении товаров. Смотрите, что мы


делаем. Мы получаем все товары, видите SELECT * FROM Товары,
выполняем этот запрос и дальше начинаем рисовать форму, которая
будет обработана скриптом add.php и здесь мы выводим название (item),
цену (price), то есть это поля, в которые надо будет что-то написать и
кнопочку Добавить. И возвращаемся смотрим.

Вот внизу наша форма. И давайте напишем, например, «Утюг» и цена


«1000». Нажимаем добавить. И мы переходим на форму Добавление
товара. Давайте посмотрим, что здесь происходит. Итак, мы получаем
через $_POST вот эти item и price, присваиваем их нашим переменным и
сначала мы их выводим, давайте смотреть.

Вот первые две строчки, мы получили: Товар – Утюг, Цена – 1000.


Дальше мы подготовили SQL-запрос INSERT INTO Товары (‘Товар’,
‘Цена’), куда мы вставим item и price. И дальше давайте напечатаем этот
запрос, вот он у нас напечатан. То есть «вставить товар», товар, цена,
утюг и 1000. После чего выполняем запрос, если всё нормально, пишем,
что записи добавлены и выводим ссылку для возврата таблицы. Ну и
закрываем БД. И давайте смотреть.

Да, записи в таблицу ‘Товары’ добавлены, вот она ссылка. В данном


случае мы используем переход по ссылке. Нажимаем. И вот наш утюг
добавился. Теперь переходим к правке, мы рассмотрели добавление,
теперь переходим к правке. Нажимаем на «Холодильник» - Открыть. Мы
перешли на форму edit.php. Причем видите здесь id-2. Давайте
посмотрим, что происходит в edit.

В edit (правка товара) мы получаем наш id, который передан через GET и
мы выбираем из таблицы Товары запись, где код товара равен этому id.
Дальше мы выполняем этот запрос, получаем массив и получаем Товар и
Цену. Что дальше? Дальше мы создаем форму, которая будет
обрабатываться скриптом UPDATE и в этой форме вводим в виде hidden
(это тип, который не будет отображаться на экране). И мы сюда
передаем код товара, он нам потом потребуется, чтобы по нему обновить
запись. И затем выводим в таблице Товар – значение товара, Цена –
значение цены. Освобождаем запрос и вводим кнопочку Изменить.
Давайте на нее посмотрим.

Вот она, кнопочка Изменить. Теперь, чтобы было понять сразу


добавляем единичку здесь и здесь, нажимаем Изменить. И вот у нас
Холодильник 1 – единичка добавилась. Мы уже оказались сразу на этой
же форме, а почему? Переходим сразу на UPDATE. Смотрите, что здесь у

103
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
нас происходит: открыли БД, получили из$_POST id, item, price.
Подготовили запрос “UPDATE Товары SET ‘Товар’=‘$item’, ‘Цена’=‘$price’
WHERE ‘Код товара’=’$id’”. И вот перенаправление, мы здесь говорим: а
теперь нужно перейти к странице edit_table.

Мы сюда перешли. И, наконец, после того, как мы рассмотрели


Добавление и Правку, рассмотрим Удаление. Здесь тот же принцип, это
ссылка, которой передается некоторый код. Допустим, Холодильник 1,
нажмем – вот Холодильник удалился. А теперь посмотрим, что
происходит.

Итак, вот у нас функция DELETE. Открываем БД, получаем id, который
надо удалить. Дальше готовим запрос DELETE FROM Товары WHERE ‘Код
товара’=’$id’. Выполняем этот запрос и здесь мы используем возврат
туда, откуда нас вызвали. Давайте посмотрим, допустим, Утюг.
Нажимаем Удалить, вот он удалился.

Давайте вернемся в начало. Вам будем задание: добавьте в таблицу


Товары поле Свойства и обеспечьте возможность его редактирования.
Таким образом, вы научились основным функциям по работе с объектами
в БД.

104
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
4.6 Работа с датой и временем
Для работы с датой и временем в PHP существует множество функций:
http://php.net/manual/ru/ref.datetime.php. Давайте на них посмотрим.

И так как время и дата – это очень важно с точки зрения разработки
сайта, то, конечно же, функций много. Мы рассмотрим самые базовые
для того, чтобы понять общий принцип работы с датой и временем. Итак,
для получения текущей даты и времени в PHP существует функция
time(). Она возвращает количество секунд, прошедших с начала эпохи
Unix (1 января 1970 00:00:00 GMT) до текущего времени.

Чем удобна функция time()? Тем, что она возвращает целое число в
количестве секунд, а следовательно можно очень легко делать
различные арифметические операции. Например, посчитать, сколько
занимает та или иная операция или диапазон времени и так далее.

Если нам нужно вывести какой-то формат даты, для этого существует
функция date(). Она форматирует вывод даты с помощью специальных
символов. http://php.net/manual/ru/function.date.php Давайте посмотрим
эти символы. Символов много, вы можете сформировать любой вывод
даты. Например, самый банальный. Мы если хотим написать date (день,
месяц, год) или наоборот и со временем.

date(“d.m.y”); // 20.12.18
date(“Y-m-d H:i:s”): // 2018-12-20 11:17:19 (формат MySQL DATETIME)

Второй формат будет совпадать с форматом MySQL DATETIME, но об этом


чуть позже.

105
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Если мы хотим обратиться к элементам времени, то есть очень удобная


функция getdate(), которая возвращает ассоциативный массив (array),
содержащий информацию о дате и времени.
http://php.net/manual/ru/function.getdate.php

Смотрите, какие значения в этом массиве. Все недели, месяц, год,


минута, секунда и так далее. И давайте посмотрим, как это работает.
Вот мы получили текущую дату и время ($today = getdate();) Дальше с
помощью функции print_r мы можем вывести весь массив, чуть позже мы
посмотрим, а можем обратиться только к одному элементу этого
ассоциативного массива, в частности к году. Мы можем взять год или
любой другой: Printf (“<h3>Текущий гол - %d</h3>”, $today[‘year’]; //
вывод только года.

Теперь дата и время в MySQL. В MySQL есть два вида хранения даты и
времени: DATETIME и TIMESTAMP.

106
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Нужно пояснить, в чем разница, потому что она связана с тем, что мы
разрабатываем сайты, а следовательно они могут быть доступны в любой
точке земного шара, а земной шар разделен на часовые пояса. И в
зависимости от того, нужен вам часовой пояс в вашей метке времени или
нет, вы выбираете тот или иной формат. Чаще всего выбирается формат
DATETIMЕ, который не зависит от часового пояса.

DATETIME хранит значение даты в формате “YYYY-MM-DD HH:MM:SS” и


не зависит от часового пояса. Рекомендуется для фиксированных дат,
например, даты рождения.

Что такое фиксированная дата? Некоторый человек зарегистрировался и


вписал свою дату рождения, находясь в какой-то стране. Затем он
приехал в другую страну, зашел на ваш сайт, а здесь как раз поменялся
часовой пояс, в одном месте сменился день, а в другом нет и он увидит,
что вы отображаете его возраст неверно. И вот чтобы этого избежать,
существует фиксированная дата, как он ввел, так оно всё и отобразится.

TIMESTAMP хранит метку времени, т.е. количество секунд, прошедших с


1 января 1970 года. Но при этом и при записи, и при выводе
учитывается часовой пояс. Рекомендуется для ситуаций, где важен
часовой пояс, например, дата и время обращения к сайту, потому что
здесь нам нужны записи именно с учетом часового пояса, потому что нам
надо знать и откуда к нам пришли и в какое точное время этого
пользователя с его часовым поясом. Если он поменяет часовой пояс, то у
него будут другие метки времени, то есть это время получается не
фиксированным.

И у этого штампа времени есть очень полезная функция. Этот тип


автоматически записывает текущую дату и время при выполнении
операций INSERT или UPDATE. При этом если несколько столбцов такого
типа, то только первый из них обновляется автоматически. Это
совершенно чудная вещь для различного рода статистик. Если нам
нужно вести журнал доступа к сайту, мы делаем вот этот самый штамп
времени и автоматически, больше нам ничего не надо делать, при
появлении каждой новой записи, у нас автоматически проставится
время.

Функция MySQL для работы с датами.

107
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Опять же, у MySQL точно также множество функций. Давайте на них


посмотрим, выбирайте все, что вам потребуется.
http://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

Давайте рассмотрим самые простые. Они используются через выборку


SELECT. Для текущей даты SELECT CURDATE(), для текущего времени
SELECT CURTIME().
А для форматированного вывода используется функция DATE_FORMAT(),
в которую вы можете вывести то, что вам нужно. Давайте сейчас на
примере это всё посмотрим.

Итак, открываем сайт 17. Урок 4.6 Работа с датой и временем. И мы то,
что мы перед этим говорили, мы сначала выводим форматированную
дату и время. Дальше мы получаем массив, его напечатаем, дальше
возьмем из этого массива только текущий год, выведем его. Дальше
открываем наши БД и в БД смотрите, что мы делаем. Мы в БД в таблицу
Сотрудники пишем только Фамилия, Дата рождения и мы здесь
используем формат DATETIME, Дата регистрации – это как раз
TIMESTAMP. И после этого мы записываем данные в Сотрудники –
Фамилию и Дату рождения, а Дата регистрации запишется
автоматически, так как мы используем INSERT. И после этого мы сначала
выведем данные так, как они есть, то есть Фамилия, Дата Рождения,
Дата регистрации, то есть так, как они находятся в базе, а затем
выведем второй форматированный запрос, где как раз используем этот
второй DATE_FORMAT. Ну и давайте посмотрим, как это работает.

Итак, вот Работа с датой и временем и давайте смотреть. Вывод даты и


времени, вот мы вывели 20.12.18, вот мы вывели вместе со временем:
2018-12-20 13:09:54. Вот он наш массив, в нем минуты, дни недели, год
и так далее. Мы выбрали только текущий год. Теперь первой получение
данных – то, что записалось в нашу таблицу. Вот значение Даты
рождения, вот значение Даты регистрации. А теперь форматированный

108
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
вывод: отсюда мы взяли только год, ну а здесь мы просто сделали
формат в нашем привычном виде:

И, собственно, задание: измените программу так, чтобы при выводе


таблицы Сотрудники появилось поле Возраст.

109
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
5. Работа с посетителями сайта
5.1 Как анализировать посетителя сайта
Есть такой популярный мем: «В Интернете никто не знает, что ты
собака».

Для большинства людей – это шутка, для PHP-программистов – это тоже,


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

И, собственно, что это за проблема. Урок 5.1 Как анализировать


посетителя сайта.

Проблема в том, что посетителями сайта могут быть самые разные и


люди, и программы. И в порядке увеличения желательности, кто это
может быть:

110
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
1. Хакеры, которые приходят на сайт с целью взломать сайт.
Соответственно, они могут задавать какие-то специальные неверные
данные, так называемые «инъекции» для того, чтобы взломать. Они
могут искать какие-то слабые места сайта, и так далее.
2. Боты – это программы для сбора данных. И здесь тоже возникает
большой вопрос, потому что есть полезные боты, например, поисковые
боты от Яндекса или Гугла. Если они к вам не приходят, это значит, что
сайт не будет доступен в поиске – это плохо. Но есть плохие боты,
которые точно так же, как и хакеры, ищут уязвимости и создают
нагрузку на сайт.
3. Случайные посетители, то есть посетители, которым сайт не
интересен, это не целевые посетители. Казалось бы, пришел и пришел.
Не совсем так. Они увеличивают нагрузку на сервер и при этом сайт
замедляется. Поэтому нужно тоже PHP-программисту смотреть. Если
вдруг совершенно неожиданно увеличилась нагрузка на сайт, но при
этом ничего не происходит, ни продаж, ни регистраций, то тоже вполне
возможно, что есть какой-то сбой на сайте.
4. Это уже хороший вариант – целевые посетители. Для них делается
сайт, они по нему ходят, читают статьи, регистрируются, может быть,
что-то покупают и переходят в пятую категорию.
5. Покупатели – посетители, благодаря которым сайт и существует.

Конечно, программист сайта должен уметь анализировать посетителей и


менять поведение скрипта, в зависимости от категории посетителей.

И первое, что мы должны узнать, что когда сервер обращается к сайту,


то он передает достаточно большое количество информации, которое
нам очень важно.

В PHP есть так называемая суперглобальная переменная $_SERVER – это


та переменная, которая доступна везде. Это ассоциативный массив,
содержащий информацию, передаваемую веб-сервером.
http://php.net/reserved.variables.server. Знать, конечно же, какая

111
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
информация передается, нужно, поэтому изучите эту страницу по
ссылке.

На основании этих данных можно создать статистику сайта и


отслеживать поведение посетителей. Обычно такая статистика
называется «лог сайта». И пара замечаний. Логи сайта предоставляет
хостер, но как правило, там очень много сырой информации и для
анализа этих логов требуются специальные лог-анализаторы. Есть
счетчики, которые позволяют не просто собирать логи, например,
Яндекс.Метрика или GoogleAnalytics, они строят графики, там
информации достаточно много, она хорошая, но вполне возможно, что
вам понадобится создавать свою собственную статистику и информацию,
которая нужная для функционирования именно вашего сайта.

Давайте мы посмотрим, как можно создавать какие-то логи на основании


данных сервера. Открываем сайт 18 и начнем сначала с того, какую же
информацию передает сервер. Так как переменная SERVER – это
ассоциативный массив, то с помощью цикла foreach мы можем вывести
все те значения, которые мы можем получить от сервера, давайте это
сделаем.

Заходим, обновляем и смотрим вот все, что мы получили от сервера.


Здесь информации достаточно много. Теперь вопрос: как на основании
этой информации построить статистику? Мы сделаем самый простейший
вариант: просто файл для простоты.

Понятно, что лучше всего статистику хранить в базе данных, в


различных разрезах ее показывать, но нам самое главное – понять
принцип. Для того, чтобы понять принцип, мы делаем такой stat.php,
такой скрипт, который фиксирует у нас при каждом посещении
некоторую информацию. И смотрите, что мы делаем. Мы заводим
переменную с именем файла stat.log, дальше ставим ограничение, чтобы
этот файл не уходил в бесконечность. Дальше берем текущую дату и
время, берем агента – это HTTP_USER_AGENT из массива сервера,
дальше имя сервера и запрашиваемый URL. Затем мы создаем пустую
переменную lines, и дальше если вот этот файл уже существует, мы
считываем lines из этого файла. Затем проверяем размер этого lines, если
он больше максимума, то мы с помощью array_shift, это функция,
которая уменьшает размер массива, мы его уменьшаем. И наконец
записываем наши значения date, agent, server и home, которые мы здесь
написали и записываем это все дело в файл.

Дальше этот файл stat.php мы просто добавляем в хедер, это значит, что
он появится на всех страничках нашего сайта. В данном случае у нас
будет одна страничка, но общий принцип, то есть с помощью
require_once. И зайдем. Сам этот скрипт ничего не отображает, он просто
что-то записывает в файл, Давайте посмотрим теперь, как его
посмотреть. Для этого у нас есть view_stat.php

112
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
И что, собственно, здесь происходит? Мы считываем всё из файла.
Дальше здесь пишем красиво: статистика посещения, задаем какие-то
параметры, и просто в таблице выводим в данном случае эти все наши
параметры. И давайте. У нас здесь есть «Смотреть статистику». Давайте
зайдем. И посмотрим. Вот наш самый простой вариант лога нашего
посещения сайта. Ну и вернемся на главную страницу.

Теперь вам задание: измените программу так, чтобы при выводе


статистики появился столбец «Порт сервера». Здесь есть значение
SERVER_PORT, которое вы можете для этого использовать.

113
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
5.2 Хранение данных о посетителе
Но прежде чем мы перейдем к технической стороне, хочу вас
предупредить, что еще существует юридический аспект данной темы, о
котором мы скажем в конце урока, и который программист должен знать.

Начнем с технической части. Итак, у HTTP-протокола есть особенность:


когда клиент посылает запрос, пишет имя сайта в браузере, то сервер
выдает HTML-документ и прекращает соединение. Этот подход ускоряет
процесс, благодаря чему веб-сервера могут обрабатывать миллионы
обращений в сутки. Это хорошо. Но есть и существенный недостаток –
сервер сразу «забывает» о клиенте и следующий запрос того же клиента
обрабатывает как запрос нового клиента.

Смотрите, что может быть. Клиент находится на сайте интернет-


магазина, сказал серверу, что хочет положить в корзину какой-то товар,
сервер говорит «хорошо» и тут же забывает про этот товар.
Соответственно, когда клиент захочет положить второй товар, сервер о
нем уже забыл. Это делает невозможным, например, формирование
покупательской корзины. Для этого были предложены некоторые
способы хранения данных, и мы сейчас рассмотрим три самых
распространенных, которые вы можете дальше использовать.

Итак, первое решение. Когда сервер выдает клиенту HTML-страницу,


одновременно с этим он устанавливает, записывает на компьютере
клиента так называемые cookie (в переводе с английского «печенье»).
Можно сказать, что он положил на компьютер маленькую печеньку. И
когда браузер выполняет запрос к тому же самому сайту, то он
одновременно отправляет и эту самую печеньку, и таким образом сервер
уже что-то знает про этого клиента. Самое примитивное использование
куки, если он на сайте где-то ввел имя Вася, то вот здесь записалось,
что имя клиента Вася и во время запроса сервер узнает, что к этому

114
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
сайту обращается клиент с именем Вася. Таким образом, можно вначале
написать какое-то приветствие.

Как вы понимаете, все, что вы размещаете на стороне клиенте, может


быть доступно, может быть изменено, подменено и так далее. Поэтому
следующий уровень – сессия. Это хранение данных на стороне сервера.
Принцип следующий – как только кто-то обратился, мы открываем
некоторую сессию и все, что происходит внутри нее, хранится. После
чего закрылся браузер, закрылась сессия. В данном случае элементарно
сформировать покупательскую корзину, потому что в сессию мы
записываем все товары, которые посетитель выбрал.

И самый мощный способ – использование базы данных и так называемая


регистрация посетителя. Когда мы предлагаем клиенту на сайте
зарегистрироваться, после чего выдаем ему логин и пароль, и в таблице
БД мы записываем таблицу Пользователи. И когда в следующий раз
человек зайдет, мы просим его ввести логин и пароль, если они
совпадут, мы считаем, что это зарегистрированный пользователь.
Дальше мы можем создать для него личный кабинет, где можем хранить
историю обращений, запросов, оплат, товаров и так далее. То есть
фактически в данном случае мы уже ничем не ограничены.

Давайте подведем некоторый итог.

Существуют три основных метода хранения данных о посетителе:

1. Куки (cookie – печенье) – данные, которые записываются на ПК


клиента.
2. Сессии (session) – это данные, которые записываются на стороне
сервера.
3. Регистрация посетителя – хранение логина и пароля в базе MySQL.

Конечно, можно хранить в любой базе, но так как мы изучаем MySQL, мы


будем хранить в ней. Но важное замечание: ни один из этих методов не
решает эту проблему на 100%. Почему?
115
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

 Куки – совсем слабый метод, они могут быть запрещены в браузере


или удалены.
 Сессии заканчиваются при выходе из браузера.
 Логин и пароль могут быть украдены.

Поэтому если вы делаете некоторый финансовый проект, то, конечно, у


вас должны быть еще способы обеспечения безопасности. Этот способ не
должен поспасть в руки злоумышленника, чтобы он не знал, что должен
обходить. Но если мы рассматриваем некоторый обычный сайт, то
уровня регистрации посетителей достаточно для безопасности.

И первый способ, который мы рассмотрим, это работа с куки. Почему


работу с куки нужно знать? Потому что она реализована на уровне HTTP-
протокола и поэтому она универсальна. Вы можете использовать куки на
любом языке веб-программирования, более того, вы можете
использовать куки даже без всякого программирования, просто на
уровне HTML-страницы. Это нужно понимать.

Куки – это команда HTTP-протокола браузеру о сохранении данных во


время отображения веб-страницы. Куки – это набор пар: «имя»-
«значение». Браузер сохраняет куки при посещении сайта и
предоставляет их при следующем посещении сайта. С точки зрения PHP-
программиста работа с куки заключается в трех вещах.

1. Установка куки. Самое простейшее, что мы можем сделать:


setcookie(“name”, “Вася”); // Хранится до закрытия браузера – в данном
случае у нас есть переменная name, значение Вася. Эта куки хранится о
закрытия бразуера. Мы можем продлить действие куки и для этого нам
нужно задат имя, когда куки должны исчезнуть. Мы говорим, что у нас
есть переменная test 1, значение - куки на час. Мы берем текущее время
и добавляем 3600, через час куки исчезнет: setcookie(“test 1”, “куки на
час”, time() + 3600); // 3600 – количество секунд в часе.

116
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
2. Получение куки. Чтобы получить куки, мы обращаемся к
суперглобальному массиву куки, которому просто говорим, какая
переменная нам нужна. Так как эта переменная была на компьютере
клиента, то лучше использовать очищение ее от всякой ерунды:
print’Привет,’ . htmlspecialchars($_COOKIE[“name”]) . ‘!’;
3. А для удаления куки достаточно написать setcookie(“name”), но
только не задать никакого значения и куки будет удалена.

Теперь рассмотрим недостатки куки, почему использование куки


недостаточно доля серьезной работы:

 Ограничение по формату: можно сохранить только пару – имя и


значение. Точнее несколько пар, но это все равно слишком мало.
 Ограничение по использованию: куки легко запретить или стереть.
 Низкая безопасность: куки легко посмотреть и подменить.

А теперь про юридический аспект использования куки, о котором я


предупредил вначале. Куки подпадают под действие законов
Европейского Союза. Более того, есть специальный сайт, который так и
называется «Закон о куки»: http://www.cookielaw.org/the-cookie-law/

И если ваш проект включает посетителей из Евросоюза, а скорее всего


так и будет, потому что на любой сайт есть международный доступ, то
вы должны соблюдать этот закон о куки-файлах. В России пока на 2018
год достаточно уведомления в Правилах сайта о том, что вы используете
куки. Но за этим аспектом вам нужно следить, за законодательством
следить и при необходимости вносить изменения в ваш сайт.

117
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
5.3 Сессии
Итак, сессия – это инструмент PHP, который позволяет сопровождать
посетителя на сайте.

Для отслеживания посетителя создается идентификатор сессии SID –


случайное число (128 бит), которое хранится в куки или в URL-адресе. К
этому идентификатору можно привязать любое число переменных,
которые хранятся на сервере и, что важно, посетителю недоступны.

Работа с сессиями состоит из 5 этапов:

1. Запуск сессии.
2. Установка значений переменных сессии.
3. Использование переменных.
4. Отмена переменных сессии.
5. Закрытие сессии.

118
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

И начнем с запуска сессии. Для запуска сессии используется функция


session_start(). Эта функция проверяет, существует ли идентификатор
сессии. Если его нет, то создается, если он есть, то эта функция
загружает зарегистрированные переменные. Сервер отправляет на ПК
пользователя куки с именем PHPSESSID. Если куки запрещены, то
PHPSESSID передается в адресе.

Также эта функция генерирует во временном каталоге файл для


хранения переменных сессии. Вот здесь нужно понимать, потому что
часто есть такая ошибка. В любом случае функция старта сессии
сработает, просто если куки можно, то туда будет отправлен PHPSESSID,
если куки запрещены, то PHPSESSID будет передаваться в адресе, но в
любом случае сессия работает.

И теперь еще один важный момент. Функция должна присутствовать на


любой странице, которая работает с зарегистрированными
пользователями. Вызов этой функции должен быть в самом начале
страницы (до <html>).
<? session_start(); ?>
<html>
Мы сначала включаем сессию и затем идет html.

Смотрите, в нашем примере, который мы будем рассматривать, это сайт


19, урок 5.3, смотрите самую верхнюю строчку. Мы сначала выполняем
запуске сессии, что-то такое делаем и потом уже выводим заголовок
файла. Это важно, потому что дальше мы будем смотреть все наши
примеры, они все будут начинаться со старта сессии. Это важный
момент.

119
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Регистрация переменных сессии. Для хранения переменных сессии


используется массив $_SESSION, в котором просто задается некоторая
переменная user, обратите внимание, что здесь нет знака доллара. И
когда вы присваиваете этой переменной какое-то значение, то она
регистрируется внутри сессии. И после регистрации эта сессия доступна
на любой странице, использующей сессию: $_SESSION[‘user’] = ‘Вася’.

Вывести все переменные сессии можно командой: print_r($_SESSION).


Как вы уже знаете – это вывод массива. Все функции для работы с
сессиями вы может посмотреть на сайте:
https://secure.php.net/manual/ru/ref.session.php. Их достаточно много, но
большинство из них не очень важны.

Закрытие сессии. Если вы хотите отменить регистрацию какой-то


переменной сессии, то нужно просто выполнить функцию
unset($_SESSION[‘user’]). Обращаю внимание, что переменная внутри
сессии не содержит знака доллара. А для отмены всех переменных
сессии используется функция session_unset().

120
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

По умолчанию сессия существует, пока открыт браузер. Для


принудительного закрытия сессии используется функция
session_destroy(). Так как мы не знаем, где посетитель захочет работу с
сайтом, то рекомендуется эту функцию выполнять по специальной
ссылке «Выход».

И теперь давайте перейдем к нашему уроку. Урок у нас будет сразу


использование куки и сессии. Куки очень простая вещь, поэтому давайте
быстро его рассмотрим. Потому что использование куки фактически
состоит в следующем: мы проверяем, существуют ли куки с именем
name, если оно существует, то мы пишем привет name. И затем вот этой
вот функцией setcookie (“name”) мы эти куки удаляем и пишем, что куки
удалены. А если куки нет, то мы устанавливаем setcookie (“name”,
“Вася”) и пишем, что куки записаны.

С куки очень просто. Сейчас куки записаны. Мы записали Вася¸ сейчас


обновили страницу, но куки удалены. Поэтому если мы сейчас сделаем
обновление, то куки записаны. Вот два таких простых действия:
установка куки и получение куки.

Теперь использование сессии. Использование сессий – это немножко


сложно. Первое – в самом начале страницы мы должны стартовать
сессию. Теперь мы проверяем, установлены ли у нас переменная сессии
с именем user. И в самом начале, пока мы ничего не сделали, мы пишем,
что пользователь неизвестен.

Вернемся сюда. Мы говорим, что пользователь неизвестен. Если мы


зарегистрируем пользователя, он у нас будет, мы напишем «Привет,
пользователь» и дадим ему вход в закрытую зону. Собственно, для чего
чаще всего и используются сессии. А если он неизвестен, мы переходим
на страницу регистрации. Ну и закрытую зону регистрации мы сделаем
на одной странице, которая будет называться user.php, то есть закрытая
зона.

И здесь происходит что? Сначала мы проверяем регистрацию. Есть ли


наш пользователь, и если он есть, то мы еще добавляем к сессии
переменную count, которая будет считать число посещений закрытой
зоны. Вот раз он есть, мы ее добавляем, выводим число посещений
закрытой зоны и мы можем его перебросить либо на главную, то есть
дать ссылку или на выход, где сессия будет завершена.

Если пользователь еще не зарегистрирован. Тогда мы проверяем, было


ли передан нам username из формы. Если да, то мы в нашу сессию
записываем тот юзернейм, который на был передан и обнуляем счетчик.
С каждой новой регистрацией счетчик будет обнулен. И пишем, что
пользователь зарегистрирован. А если нам еще ничего не передано, что
мы выводим форму «Введите имя для регистрации». Ну и наконец
exit.php – это самый простой в данном случае файлик, где мы, опять же,

121
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
стартуем сессию, убираем все переменные, завершаем сессию и
возвращаем на главную страницу.

Итак, смотрим использование сессий. В самом начале всё понятно,


пользователь неизвестен и у нас есть регистрация. Переходим. Это у нас
файл user, закрытая зона. Мы хотим зарегистрироваться, пишем Вася,
войти. Пользователь зарегистрирован. Мы можем перейти на главную.
Так как сессия уже работает, мы говорим «Привет, Вася» в закрытой
зоне.

И вот теперь в закрытой зоне мы говорим «Привет, Вася» и начинаем


считать посещения. Мы можем обновлять, и с каждым посещением число
будет увеличиваться. Сейчас 4, если мы перейдем на главную и опять
войдем в закрытую зону, то здесь будет число 5. Мы с помощью сессий
уже решили проблему, мы теперь отслеживаем поведение посетителя и
можем, в зависимости от того, что он делает, считать какую-то
статистику по нему.

Теперь мы хотим принудительно завершить сессию. По нажатию выход


мы попадаем на главную страницу. При этом пользователь неизвестен.
Если мы теперь зарегистрируемся, как Коля. Войти. То теперь число
посещений началось с 1. И таким образом мы можем создать сессию,
можем отследить все перемещения пользователя и закрыть сессию.

Домашнее задание: измените программу так, чтобы подсчитывалось и


посещение главной страницы. Сейчас мы подсчитываем число
посещений user.php, а вам надо изменить программу так, чтобы
подсчитывалось и посещение главной страницы, то есть index.php.

122
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
5.4 Регистрация посетителей
Конечно же, для любого серьезного сервиса необходимо именно
регистрировать посетителей в базе данных, после чего мы будем
накапливать всю информацию, которая к этим посетителям относится.

Но прежде чем мы будем рассматривать, как происходит регистрация,


здесь нам нужно различать два процесса, которые чрезвычайно важны, с
точки зрения устойчивости нашего сервиса к взлому:

 процесс аутентификации,
 процесс авторизации.

Аутентификация – это процесс проверки подлинности посетителя. В этом


процессе мы должны удостовериться, что это именно тот человек, за
которого себя выдает. Этот процесс сложен и обычно выполняется
некоторый минимальный уровень проверки (логин и пароль). Но вообще
говоря, если у вас особенно какие-то финансовые данные, такой
проверки недостаточно. Чуть позже мы поговорим о приемах именно
дополнительных аутентификаций.

Но есть другой процесс, с точки зрения программирования более


понятный и простой – это авторизация.

Авторизация – это предоставление прав на определенные действия. Если


человек «авторизован» - это значит, что мы предоставили ему
некоторые права. Этот процесс прост с точки зрения программиста: если
выполняется некоторое условие, то действие разрешено. В данном
случае, есть логин и пароль, мы просто сравниваем, есть ли логин такой
в базе и пароль ему соответствует, это значит, что человек авторизован
и имеет доступ к веб-странице.

Приемы аутентификации.

123
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Конечно же, их придумано много. Я просто скажу два самых


распространенных. Например, прием аутентификации, который
называется двойная авторизация:

1. Сначала пользователь вводит логин и пароль.


2. Если все правильно, ему высылается код проверки (посредством
Email или SMS), который он должен ввести. Это вторая авторизация,
если он ввел код.

С точки зрения программиста, здесь мы должны проверить логин, пароль


и код, в этом случае человек авторизован. Или, например, хранение
дополнительных данных. Мы в базе сохраняем такие данные как IP
посетителя, браузер, время входа и т.д. И на основании этих данных
принимается решение об аутентификации. Если что-то сильно
поменялось, мы можем послать ему Email, что сейчас был произведен
вход с такого-то IP-адреса. Таких приемов много.

И на самом деле, если у вас такой серьезный сервис и вы начинаете


использовать эти приемы, то когда несколько таких уровней вы
выстраиваете, то злоумышленнику приходится сложнее. Но как вы
понимаете, любые приемы неудобны для порядочного посетителя и
таким образом вы ваш сервис делаете менее доступным.

В большинстве случаев для аутентификации используется проверка


«логин-пароль». И мы сейчас поговорим о том, как правильно работать с
паролем, потому что тоже не все так просто. Хранить и обрабатывать
пароли в открытом виде нельзя, потому что их легко взломать. Поэтому
для хранения паролей используется шифрование. Существует несколько
методов шифрования. На данный момент в официальной документации
PHP рекомендуется использовать «хэширование паролей».

124
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Хэширование – это выполнение определенного алгоритма над строкой, в


результате которого получается другая строка, которая называется
«хэш». Хитрость в том, что нет алгоритма, по которому, имея хэш, можно
получить исходную строку. Если злоумышленник получил хэш каким-то
образом, он не может простым алгоритмом получить обратный пароль.
Поэтому в БД хранятся не пароли, а их хэши.

Но есть еще один момент. Для того, чтобы вы были уверены, что
хэширование выполняется именно так, как надо, существуют в PHP две
функции, которые содержат в себе мощные криптостойкие алгоритмы,
поэтому рекомендуется использовать именно встроенные функции:

password_hash() – используется для хэширования пароля.


password_verify() – используется для проверки пароля на соответствие
хэшу.

125
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Важный момент, так как в базе данных вы будет хранить хэш, то вы
должны выделять строку в 255 символов. Хотя на данный момент хэш
имеет длину 60 символов, но раз это рекомендуется, то так и следует
сделать. По ссылке вы можете почитать всю информацию по
хэшированию паролей: http://php.net/manual/ru/book.password.php. Но
пользоваться этими функциями очень легко, потому что есть всего два
действия.

Мы получаем хэш (password_hash), указываем наш пароль и говорим,


что в данном случае использовать некоторый алгоритм шифрования по
умолчанию и в результате мы получали хэш, который можем поместить в
базу данных. А для проверки хэша используем password_verify, где мы
сравниваем тот пароль, который ввели, с хэшем. И эта функция делает
хэш от этой – от введенного пароля, сравнивает полученный с
сохраненным хэшем и в зависимости от этого выдает либо ложь, либо
истину. Пароль либо неправильный – ложь, либо правильный – это
истина. Но есть момент, который используется в документации и нужно
понимать, что это за аргументы.

Это использование «соленых» паролей так называемых. Если вы будете


читать описание этих функций, вы прочитаете про соль и «радужные»
таблицы. Что это такое? Смотрите. Хотя нет способа получить алгоритм
обратного преобразования из хэша в пароль, но существует метод
взлома хэшей по «словарю». Как это делается? Причем сейчас это
распространенная практика хакеров. И если вы будете использовать
какие-то несоленые пароли, пресные пароли, они будут взламываться
очень легко. Как это выглядит?

Итак, «радужная таблица», в ней содержатся все самые


распространенные пароли, а пользователи достаточно ленивые люди и
используют одни и те же пароли, типа 123456 или password, или год
рождения. И, соответственно, уже с помощью функции сформированы
эти хэши. Таким образом, взлом хэша занимает совсем немного времени,

126
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
потому что по словарю подбираются соответствующие хэши и мы
моментально получаем исходный пароль.

Как же в данный момент шифруются пароли? Для защиты от взлома по


«словарю» в пароль добавляют так называемую «соль». Это случайный
набор символов. Иногда эта процедура называется «посолить пароль». И
при этом шифруется не сам пароль, а строка «пароль+соль». Даже если
взломать пароль по словарю, то пароль не подойдет, потому что это на
самом деле неправильный пароль, а пароль плюс соль. Функции
password_hash() и password_verify() используют «соленые» пароли.

И еще одно замечание по рекомендациям документации PHP. Сейчас в


сети много рекомендаций как сделать «соленый» пароль
самостоятельно. Но вот документация не рекомендует это делать, потому
что если вы будете неправильно добавлять соль, то злоумышленники
могут это достаточно быстро распознать и вскрыть. Поэтому
рекомендуется использовать стандартные функции. Ну а как это
конкретно применять, мы рассмотрим в следующем уроке.

127
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
5.5 Организация работы с паролями
Вам нужно знать, что на практике уже устоялась некоторая общая схема
организации работы с паролями, которая применяется на многих сайтах.
Поэтому пользователь ее уже ждет. Конечно, вы может придумать свою,
но тогда у пользователя будут трудности.

Какие же функции должны быть в системе работы с паролем. Она


включает следующие функции:

1. Регистрация пользователя с выбором логина и пароля.


2. Вход по паролю в некоторую защищенную область сайта.
3. Выход из защищенной области.
4. Пользователи должны иметь возможность менять пароль.
5. Должна быть возможность высылки пароля по почте. Для этого
генерируется новый пароль. Это если пользователь забыл, мы пароль
восстанавливаем.

128
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Общая схема выглядит приблизительно так. Голубым цветом показаны


страницы, на которых неавторизованный пользователь находится. И
зеленым, на которым работает авторизованный пользователь. Голубые –
вход в систему, регистрация, если пользователь забыл пароль. Зеленым
– работа с системе, смена пароля и выход. Мы всю схему реализовывать
не будем, мы посмотрим основные моменты.

Для этого переходим на 20 сайт и смотрим, что у нас здесь происходит.


Мы для начального создания таблицы, в том числе и таблицы паролей, у
нас будет отдельная ссылка. Дальше если пользователь не
авторизовался, он может только смотреть данные, а для того, чтобы их
править, у нас будет ввод логина и пароля. И перейдем к программе.
Наша стандартная начальная страница, она отличается тем, что у нас
появляется CheckLogin(), где мы в зависимости от того, ввел
пользователь логин и пароль, авторизовался или нет, дадим доступ к
правке данных. Теперь посмотрим.

Сначала нам нужно создание таблицы. Для разнообразия таблицу с


паролями назовем латиницей, то есть Users. Здесь тот же принцип: если
она есть, мы ее удаляем и затем создаем по новой. И она состоит из:
iduser – это код пользователя, login, password (здесь задаем длину 255,
как это и рекомендовано для хэш-паролей) и здесь еще делаем
TIMESTAMP для того, чтобы следить, когда пользователь
зарегистрировался. Всё, таблица Users создана. Теперь переходим на
CheckLogin, что здесь происходит.

Мы смотрим. Если был введен логин, когда мы зашли на эту страницу, то


мы здесь покажем, что введены логин и пароль, мы выполняем login и
password. Если человек ее прошел, то мы показываем, что у нас есть
ссылка на таблицу редактирования. А если пароль не прошел, то мы
напишем «Доступ запрещен. Введите логин и пароль повторно».

129
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Соответственно, если ничего не было введено, то появляется это
сообщение, которое есть сейчас.

Для правки данных введите логин и пароль. Если мы на не нажимаем,


мы попадаем на страницу login.php, где нам нужно будет ввести логин и
пароль. Давайте я что-нибудь такое наберу. И смотрите, пароль у нас
отображается звездочками. Сейчас посмотрим, как это делается. Нам
нужен login, для того, чтобы отображались звездочки, мы здесь пишем,
что это поле type=”password”, тогда будут отображаться звездочки.

Вот сейчас мы что-то ввели случайно. Нажимаем войти. И мы пишем, что


был введен логин и пароль. Нет такого логина. Доступ запрещен.
Введите логин и пароль повторно. Хорошо. Мы сейчас не
зарегистрированы. Нажимаем «Регистрация». Мы попадаем на страницу
регистрации register.php, давайте посмотрим, что здесь происходит.

У нас в самом начале мы проверяем, была ли нажата кнопка


регистрации. В самый первый раз еще нет, поэтому мы просто выводим
таблицу, где просим ввести логин, пароль и повторить пароль. Давайте
я сейчас наберу просто, нажму зарегистрироваться. Здесь пользователь
с указанным логином уже зарегистрирован. Поэтому я сейчас сделаю
начальное создание таблиц, все удалю. Опять регистрация. Давайте 1, 1,
1 – зарегистрироваться. Вы успешно зарегистрированы в системе и вы
сейчас будете переадресованы к странице авторизации.

Как сделано это? Вот смотрите. Мы проверили, что нажата кнопка


регистрации. Дальше мы проверяем, что пароли совпали, дальше
выполняем регистрацию и дальше у нас есть такая вещь, как функция,
которая обновляет страницу. При этом этой функции нужно перейти на
другую страницу. Соответственно, через пять секунд произойдет переход
на другую страницу: ‘Refresh: 5; URL = index.php’. Теперь смотрим
функцию RegUser, то есть что у нас происходит во время регистрации.

Во время регистрации мы проверяем, есть ли у нас логин. Если нет, мы


возвращаем с ошибкой, если у нас пароль, мы проверяем, не
зарегистрирован ли уже у нас этот пользователь. Делаем запрос к БД,
если ответ «да», то пишем, что уже зарегистрирован и возвращаем
ошибку, а вот если такого пользователя нет, то здесь мы выполняем
функцию хэширования. И эту функцию мы уже рассмотрели
(password_hash) и результат хэширования мы записываем в таблицу
Users, то есть user_login и результат хэширования. После чего говорим,
что пользователь зарегистрирован и возвращаем уже истину.

Здесь, если мы вернули истину, то здесь происходит вот это сообщение.


И давайте еще посмотрим в phpMyAdmin. Мы посмотрим, как выглядит
наш пароль. Заходим для этого в таблицу Users. Смотрим, вот iduser, вот
наш login и вот так выглядит хэшированный пароль. И у нас здесь есть
время регистрации. Таким образом, когда мы зарегистрировались, ввели

130
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
пароль и логин, нажмем войти, то пароль у нас совпадает. И мы можем
перейти на правку таблицы Товары.

И теперь задание. Добавьте условие, что логин не может быть короче 6


символов. И таким образом вы уже знаете, как в целом работать с
паролями.

131
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
5.6 Администрирование сайта
Доля управления сайтом обычно создают специальный раздел, куда
имеет доступ только администратор сайта.

Кроме того, могут быть определены разные виды доступа у


администраторов. Например, в панели администрирования WordPress
можно задать следующие уровни доступа:

 Администратор – имеет полный доступ.


 Редактор – управляет содержимым сайта, но не пользователями.
 Автор – может править только свой текст.
 Участник – может писать статьи и отправлять на утверждение.
 Подписчик – может править только свой профиль.

Такое разделение показывает свою практическую ценность, поэтому


рекомендую, если вы уже делаете администрирование сайта,
использовать такое разделение на уровни доступа. Тем более, что для
этого достаточно завести поле с названием level от 1 до 10, где 1 –
начинающий подписчик, а 10 – администратор. И затем, в зависимости
от задачи, просто проверять уровень доступа.

Как же реализуется панель администрирования, чаще ее называют


админка.

132
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Как правило, она имеет свою папку, например, admin, и представляет


собой по сути отдельный сайт. Потому что там может быть и свой стиль
достаточно простой, потому что администраторам красивые навороты не
нужны. При этом при создании таблицы сразу добавляется запись с
правами администратора. Прочие пользователи с различными правами
доступа к панели администрирования создаются уже администратором в
панели управления сайтом. Мы сейчас рассмотрим простой вариант, где
у нас просто будет панель, где мы будем смотреть на пользователей.

Открываем сайт 21 и смотрим, что мы имеем. А мы здесь кроме папки


«Site 21» внутри имеем еще папочку admin. В каждой из этих папок есть
свой index, свой main и так далее. Как я говорю, фактически свой сайт.

Что на главной? У нас на главной просто добавляется ссылочка


Администрирование сайта <a href=”./admin/index.php”>Войти</a>,
которая собственно ведет в админку. Вот наше администрирование сайта
и оно ведет в админку. Создадим начальное создание таблиц. Перейдем
на главную и давайте еще создадим какого-нибудь пользователя.
Зарегистрируемся. Сейчас окажемся на главной и теперь смотрите.

Сейчас мы зарегистрировались, как 1.1 и нажимаем Войти в


администрирование сайта. Мы получаем сообщение, что нет прав для
доступа. Давайте смотреть, что происходит. Итак, вот это у нас основной
наш сайт. А вот этот индекс – это панель администрирования. Открываем
БД, проверяем, действительно ли сюда зашел админ и закрываем после
того, как заканчиваем работать. И теперь CheckAdmin, то есть мы идем в
main.

Мы переходим на документы и начинаем смотреть, что здесь происходит.

Первой – мы проверяем, есть ли у нас регистрация и логин. Допустим,


она есть, тогда мы проверяем пароль админа и если всё нормально, мы
вводим список пользователей. Если ненормально, доступ запрещен,
введите логин и так далее. А что такое проверка пароля админа? Мы
получаем запрос к БД, смотрим, есть ли такой администратор или нет. А

133
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
вот если он есть, мы проверяем статус и в данном случае нас интересует,
чтобы статус был равен 10, если меньше, то мы пишем «нет прав для
доступа». И, наконец, если статус есть и пароль совпадает, мы можем
вывести ShowUsers.

Теперь, как задать начальное значение InitDB. Мы создали таблицу


Users, мы сюда добавили level – это число. И сразу после того, как
создали ту таблицу, мы добавляем запись администратора. Мы создаем
хэш пароля admin и дальше записываем в таблицу Users значение логин
- admin и пароль у нас будет хэшированный. И уровень 10. Мы создаем
эту таблицу. Итак, возвращаемся, вводим теперь логин и пароль: admin,
admin. Нажимаем войти, попадаем на нашу страницу заходим в
Администрирование сайта.

И вот наша админка – панель администрирования, видим, что у нас есть


admin с уровнем доступа 10. Дата и время регистрации. Вот 1 и 1,
который мы зарегистрировали, причем мы как администратор можем его
спокойно удалить и вернуться на главную. Таким образом работает
панель администрирования сайта. И вам домашнее задание: добавьте
при регистрации пользователей поле «Уровень доступа». Конечно, это
должен делать админ, но для простоты пусть сам пользователь, кода
регистрируется, указывает свой уровень доступа.

134
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
6. Графическая библиотека GD
6.1 Проверка наличия GD
Несколько слов об этой главе. Дело в том, что для интернета и сайтов
графика имеет очень большое значение, для дизайна, для вывода какой-
либо информации. Поэтому всё, что связано с графикой в PHP
достаточно хорошо развито. И существует графическая библиотека,
которую мы сейчас и рассмотрим. Но нужно понимать, что работа с
графикой немножко отличается, потому что особенность PHP в том, что
есть вставка некоторого кода, который выводится на странице. И
графическая библиотека не совсем обычная, она динамическая, графика
формируется в момент формирования веб-страницы. И вот эту
особенность просто нужно учитывать.

Библиотека GD (Graphics Draw) – это библиотека с открытым исходным


кодом для динамической работы с графикой. Библиотека написана на С,
поэтому очень быстро работает. Поддерживает все самые популярные
графические форматы: PNG, JPEG, GIF, WebP, XPM, BMP. Обычно
используется для генерации диаграмм, графики, миниатюр и всего
остального в момент генерации веб-страницы. Есть официальный сайт:
https://libgd.github.io/

Но в большинстве случаев официальный сайт вам будет не нужен,


потому что эта библиотека уже встроена в поставку PHP. И поэтому вот
документация PHP: http://php.net/manual/ru/book.image.php. Это та
документация, которая вам будет в основном нужна.

Проверка наличия GD. Для этого существует функция gd_info(), которая


возвращает ассоциативный массив с настройками библиотеки.

135
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

При этом для вывода массива рекомендуется использовать тег


форматированного текста.

<pre>
<?php print_r(gd_info()); ?>
</pre>

И давайте перейдем, у нас сейчас сайт 22, смотрим index, у нас сейчас
урок 6.1. И вот как раз информация о библиотеке. Мы ставим тег pre,
вызываем нашу функцию gd_info, она возвращает ассоциативный
массив, который мы выводим командой print_r. И давайте посмотрим
результат. Итак, вот у нас информация о библиотеке, мы видим, что она
присутствует и на что вы должны обратить внимание, чтобы у вас, когда
уже вы будете работать на хостинге, какие два момента вы должны
посмотреть.

1. Проверить, что версия библиотеки не ниже второй. Смотрим, вот у


нас версия 2.1.0. Это очень хорошо. Bundled – означает, что эта
библиотека совместима с PHP. Это значит, что у вас никаких проблем не
будет и все команды PHP по работе с GD будут прекрасно работать.
2. И второй момент, на который стоит обратить внимание, который,
скорее всего, конечно, будет. Дело в том, что для веб, для картинок
рекомендуемый формат – PNG. Поэтому должна быть строка, что у вас
поддерживается PNG: [PNG Support] => 1. Смотрим, есть эта строка. Ну
и вы видите, что остальные версии тоже поддерживаются и их можно
использовать.

Теперь рассмотрим, как же все-таки происходит динамическая работа


графики.

136
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Для рисования совершенно необязательно иметь графический файл. На


веб-странице мы указываем ссылку на изображение в виде PHP-файла.
Изображение формируется «на лету» и отображается в браузере. У нас в
тексте нашей программы на PHP будет вот такая вот ссылка: <img
scr=”pic1.php”>.

А уже в файле pic1.php, формируется картинка. Причем вот этот файл


должен начинаться вот таким заголовком, где указывается, что мы хотим
выбрать. Image – графическое изображение, мы берем его в формате
png. При этом графическое изображение координаты верхнего левого
угла - 0, 0:
<?php
header(“Content-type: image/png”); // Устанавливаем тип изображения

?>
Левый верхний угол имеет координаты 0, 0.

И теперь давайте посмотрим минимальный скрипт GD.

137
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Итак, вот у нас открылся PHP, дальше мы смотрим заголовок, который


мы сейчас рассмотрели. Дальше мы создаем новую картинку 300 на 200,
это важно, потому что в первой версии этой библиотеки поддерживалась
только цветовая палитра на 256, что достаточно мало. И дальше мы
получили идентификатор нашей картинки. Дальше ImageColorAllocate –
это цвет, который формируется, мы указываем картинку, которую
создали, и дальше три числа – это RGB (то есть красный, зеленый,
синий). И цифры от 0 до 255 - это яркость. Соответственно, если мы
выбираем 255, 0, 0 – это значит, что мы задали только красный цвет.
Поэтому мы этот цвет записали в переменную red.

Дальше заливаем область выбранным цветом, в данном случае, красным.


И вот передать изображение в браузер, как будто это просто картинка
png и после этого обязательно освободить память. Почему это важный
момент? Потому что как мы уже говорили, памяти для скриптов
выделяется не очень много. Поэтому если у вас большое количество
картинок на странице, то вы можете быстро исчерпать всю доступную
память.

Теперь вы можете задать, вот здесь мы задали цвет с помощью


ImageColorAllocate, но вы можете задать цвет прямо внутри вашей
функции с помощью шестнадцатеричной записи. Каждым двум цифрам
соответствует один цвет. FF – это максимум, 00 – это минимум. Итак, мы
здесь раскомментируем, точнее уже информации библиотеки нам не
нужна, мы ее закомментируем. Нас интересует только рисование. Итак, в
рисовании мы просто вызываем pic1.php, давайте на нее посмотрим, это
то, что мы только что рассмотрели.

Установили заголовок, создали новую картинку, задали цвет, залили


цвет, передали изображение и удалили память и давайте посмотрим, как
это выглядит. Итак, вот наш прямоугольник, который мы нарисовали с
помощью библиотеки GD. Задание этого урока: измените программу так,
чтобы прямоугольник был синего цвета.

138
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
6.2 Графические примитивы
Разберем сначала, как нарисовать простейшие фигуры геометрические с
помощью GD. То есть мы указываем точку, это идентификатор нашего
рисунка. Дальше координаты точки и цвет. Линия, опять же, начальные
координаты, конечные и цвет. Прямоугольник, либо просто
прямоугольник, тогда координаты одного угла, другого и цвет, либо
закрашенный прямоугольник. И эллипс, опять же, координаты центра,
широта, высота и эллипс может быть обычный или с заливкой.

И теперь вопрос: как определять цвет? Как этот цвет брать? И вам тут
поможет программа KompoZer. Она находится у вас в сборке, и когда вы
находитесь в нем, нужно нажать Меню – Формат – Цвет текста. И
появляется такая удобная панель для выбора цвета, где вы можете
выбрать любой цвет и самое главное, если вам нужен RGB, вот красный,
зеленый, синий. А если в шестнадцатеричном виде, вы можете
скопировать это значение и просто вместо решетки написать 0х.

Сейчас мы перейдем к нашей программе. Это сайт 23. И начнем


рисование с точек, и в данном случае мы сейчас будет использовать еще
генератор случайных чисел. Посмотрим, как он работает.

Итак, рисование точек. Мы создаем пустой холст, заполняем фоновым


цветом и дальше у нас пойдет цикл рисования точек и мы будем
использовать генератор случайных чисел, который выглядит так. Это
функция rand, которой нужно передать максимальное и минимальное
число и она сгенерирует случайное число в этом диапазоне. Поэтому для
цвета мы берем случайную RGB и получаем какой-то случайный цвет. И
для рисования точки мы задаем случайные координаты, где максимум –
это ширина и высота нашего холста. Соответственно, в индексе у нас, в
самом начале – это просто рисование точек. И давайте посмотрим.

139
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Вот у нас случайным образом мы нарисовали точки, причем если нажмем
на обновление, точки будут постоянно меняться, потому что они
генерятся случайно.
Дальше следующее у нас линии. Переходим. Здесь мы комментируем,
открываем линии pic2 и смотрим. Что мы здесь делаем.

Здесь то же самое – случайный цвет, случайные координаты х1, у1, х2,


у2. И рисуем случайные линии. Единственное – мы следим, чтобы начало
линии находилось в диапазоне от 0 до 150, а концовка – от 150 до 300.
Обновляем. Вот мы получили линии.

Дальше нарисуем прямоугольники. Комментируем, открываем


прямоугольники. Смотрим, как мы их рисуем. Опять же случайный цвет,
случайные координаты. Дальше мы здесь будем просто заполненные
прямоугольники рисовать. Обновляем, вот наши прямоугольники.

И наконец последнее – круги. Открываем круги, смотрим. Здесь всё то


же самое, всё случайное. И единственное только вот, мы рисуем с
помощью эллипса, но так как нам нужен круг, мы просто ставим х2 – это
одинаковую ширину и высоту. Сохраняем и выводим круги. Вот наши
круги.

И в конце можем вывести все графические примитивы, сохранить,


обновить. Вот они все наши графические примитивы. И добавим
домашнее задание. Измените программу так, чтобы вместо кругов были
нарисованы эллипсы.

140
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
6.3 Текст и трансформации
Сначала простые функции.

Для вывода текста служат функции в библиотеке GD:

ImageString() – вывод горизонтального текста.


ImageStringUp() – вывод вертикального текста.

Они достаточно похожи, им нужно передать указатель на нашу картинку,


номер шрифта, координаты, вводимую строку и ее цвет: ImageString (
resource $image , int $font , int $x , int $y , string $string , int $color). При
этом font – это встроенные шрифты, которые обозначаются номерами от
1 до 5. И что для нас, конечно, неудобно, они имеют кодировку latin2, не
содержат кириллицы. И важный момент в этой функции, координаты х и
у – это координаты верхнего левого угла символа.

Давайте попробуем сначала вывести текст с помощью функции


ImageString, для этого переходим на сайт 24. Смотрим, тут самое первое
– встроенные шрифты, вывод горизонтально, то ест pic1. Смотрим pic1.
Что мы делаем? Начало стандартное: создаем пустой холст, создаем
фоновый цвет. Дальше мы делаем черный цвет и в цикле мы сейчас
переберем все встроенные шрифты. Мы сейчас зададим font и номер и
вот смотрите ImageString, картинка, мы задаем здесь номер шрифта, 0 –
это начало координат, здесь мы будем смещаться. Здесь мы будем
выводит нашу строки и черным цветом. Давайте посмотрим.

Вот шрифты, вывод горизонтально, то есть font от 1 до 5. Теперь то же


самое мы сделаем для вывода вертикального текста. Для этого здесь
уберем комментарий. И pic2 у нас то же самое, только здесь
используется ImageStringUp. Сохранить, обновить. И вот мы видим, как
выводится вертикально шрифт. Но нас, конечно же, интересует вывод
кириллицы и что же делать в этом случае?

141
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Для использования кириллицы нам нужно использовать бесплатные


шрифты Google Fonts: https://fonts.google.com/. Вот давайте посмотрим,
что это такое.

Итак, существуют бесплатные шрифты Google Fonts, которые вы можете


использовать в ваших проектах. Здесь около 900 шрифтов, которых
хватит на все случаи жизни и вам нужно выбирать шрифты с
кириллицей. И в данном случае мы просто выберем шрифт Roboto. Для
того, чтобы выбрать его, нужно нажать плюс, вот у нас он добавился. И
такой момент. Этот шрифт на самом деле могут использовать дизайнеры
с помощью задания стиля CSS и с помощью команд CSS можно все эти
шрифты использовать. Но наша задача именно использовать не в CSS, а
в PHP. Поэтому нам нужно загрузить, нажав на эту кнопочку.

И дальше поместить загруженный шрифт в нашу папку с нашим


скриптом. Давайте посмотрим. Сюда в сайт 24 я загрузил в папку Fonts/.
Я загрузил шрифт Roboto, вот все его варианты. Таким образом, нам
нужно как-то к нему обратиться, давайте посмотрим, как. Для вывода
текста с кириллицей используется функция: array ImageTtfText (
resource $image , float $size, float $angle , int $x , int $y , int $color , string
$fontfile , string $text)

ImageTtfText – это вывод шрифтf Ttf. Здесь несколько аргументов, нас


пока интересуют координаты х и у – это координаты левого нижнего
угла символа. Обратите внимание, здесь в ImageString х и у – это
верхний угол. А здесь – это левый нижний угол. И fontfile – это имя
файла шрифта с кириллицей. Давайте посмотрим.

Итак, мы комментируем эти строчки. Открываем шрифт Google Fonts и


давайте посмотрим, как мы с ним работаем. Здесь всё стандартно, цвет
получаем, здесь какой-то текст задаем и самая главная строчка Font. Мы
должны здесь указать имя файла с шрифтом ttf. И мы говорим «точка» -
это значит отсчитываем от текущей папки: ‘./Fonts/Roboto-Black.ttf’. И

142
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
дальше то же самое, мы здесь выведем в цикле несколько размеров
этого текста. Сохраняем и обновляем.

И как видите, вот у нас появилась кириллица, всё достаточно удобно.


Мы можем выбрать любой шрифт и с ним делать графические надписи.

Теперь размер и поворот текста.

Для указания размера и угла поворота текста служат аргументы float


$size и float $angle. И еще такой момент, что вот эта функция
ImageTtfText возвращает массив из 8 элементов, представляющих 4
точки – координаты углов рамки, обрамляющей текст. Точки
представлены в таком порядке: левый нижний угол, правый нижний,
верхний правый, верхний левый. Если нам нужно сначала определить
эту рамку для того, чтобы вписать текст куда-либо, мы можем не
рисовать текст, а использовать функцию, которая только рассчитывает
эту рамку, но ничего не рисует: array ImageTtfbBox ( float $size, float
$angle , string $fontfile, string $test )

Тут нужно передать размер, угол поворота, имя шрифта и строку и эта
функция вернет эту рамку. Но пока нас интересует не рамка, а именно
поворот текста. Тогда мы включаем поворот шрифта и смотрим, что мы
делаем. Начало то же самое, мы задали имя нашего шрифта, случайный
цвет, случайный поворот и размер. И смотрим, что получается.

Мы заходим, обновляем и вот у нас поворот шрифта. И теперь домашнее


задание. Мы его сейчас раскомментируем, обновим. Итак, домашнее
задание – измените программу так, чтобы вместо шрифта Roboto
использовался шрифт Open Sans.

143
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
6.4 Работа с графическими файлами
Мы уже говорили о том, что библиотека GD работает с многими
графическими форматами, основной – PNG. И сейчас мы разберемся, как
с этими файлами работать.

Для вывода графического файла используются функции:

ImageCreateFromPng($filename) – создание холста из некоторого файла


изображения.
Если в этом файле есть альфа-канал или канал прозрачности, то мы
должны либо выбрать, что мы сохраняем этот альфа-канал, то есть у нас
так и будет прозрачность. Либо мы должны включить альфа-блендинг
или режим сопряжения изображения. То есть у нас должно быть выбрано
либо одно, либо другое. На примере потом рассмотрим.
ImageSaveAlpha($pic, TRUE) – сохранение альфа-канала.
ImageAlphaBlending($pic, FALSE) – режим сопряжения изображения.
LoadPNG($filename) - вывод файла формата PNG на этот самый холст.

Для получения размеров изображения используется функция:


array GetImageSize(string $filename)
Она возвращает массив различных значений.

И давайте начнем работать. Итак, для работы нам нужно открыть сайт
25. И давайте начнем с первого. Что мы делаем? У нас в этом примере
появилась папка Pics, в которой находится два файла: ornament.png и
water-lily.jpg. Чтобы просто показать, что с другими форматами принцип
работы тот же. Начнем с файла ornament.png. В данном случае мы хотим
получить просто сначала информацию о графическом файле. Мы задаем
имя файла: $filename – “./Pics/ ornament.png”. И дальше мы выполняем
функцию GetImageSize, которая нам вернет массив. Чтобы напечатать
массив лучше использовать тег <pre>.

144
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Давайте зайдем и посмотрим. Итак, информация о графическом файле,
ассоциативный массив. Вначале идет ширина и высота, дальше тип
нашего файла. Здесь в текстовом виде ширина и высота, сколько бит у
нас записывается изображение и в каком формате оно находится. То
есть мы получили всю информацию об этом файле.

Давайте это закомментируем и сейчас этот файл увидим. Итак, теперь


нам нужно этот файл вывести. Что мы для этого делаем? Идем в pic1.
Здесь мы говорим о том, что создаем файл image.png. Имя файла,
создаем картинку на основе png и сохраняем альфа-канал. И теперь мы
эту картинку выводим и, соответственно, дальше удаляем изображение,
чтобы очистить память. Сохраняем и обновляем. Итак, вот у нас
вывелось наше изображение. Если мы не будем сохранять альфа-канал.
Что тогда у нас получится? У нас получится вот такая картинка,
получается, что место альфа-канала будет заполнено черным цветом.
Поэтому альфа-канал мы сохраним.

Следующая тема – это если нам нужно изменить размер изображения.

Для изменения размера изображения используется функция:


bool imagecopyresampled ( resource $dst_image, resource $src_iamge, int
$dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w,
int $src_h )

Она копирует прямоугольную часть одного изображения на другое


изображение с сохранение качества изображения. И давайте посмотрим,
как ее использовать. Комментируем, открываем pic 2. Сначала мы задаем
имя файла, затем задаем максимальную ширину и высоту, которые мы
будем использовать. Но здесь нужно понимать, что в зависимости от
того, картинка у нас может иметь портретное расположение или
альбомное, то в зависимости от этого, мы должны правильно посчитать,
какой именно параметр мы должны поменять. И здесь обращу ваше
внимание на следующий оператор языка PHP, мы его еще не
использовали.

145
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

GetImageSize нам дает ассоциативный массив, из которого нам сейчас


нужны только ширина и высота. И вот этот лист – это такая функция,
которая копирует из ассоциативного массива те элементы, которые нам
нужны. В данном случае ширину и высоту. Дальше мы считаем наше
отношение и смотрите, что дальше происходит. Наш основной, исходный
файл мы создаем на его основе холст, который называется pic. А для
нашего измененного мы создаем pic_r, то есть resized.

Мы создаем отдельный холст с теми параметрами, которые мы посчитали


относительно наших коэффициентов объединения. Дальше мы
выключаем на нашем новом полученном холсте режим сопряжения. И мы
включаем и на исходной, и на измененной картинке режим сохранения
альфа-канала. Дальше мы выполняем функцию ImageCopyResampled, то
есть мы задаем, куда будем копировать и откуда. Получается, что мы
копируем от 0 до тех размеров, которые мы посчитали. После чего мы
выводим изображение измененное и потом удаляем уже холсты, потому
что они нам не нужны. Сохраняем. И обновляем. Итак, вот мы изменили
размер, получился размер, который нам нужен. Это самая частая
функция, которая вам потребуется при работе с изображениями.

Но, конечно, есть такая ситуация, когда у вас файлы будут другого
формата, например, jpg. Тоже очень популярный формат И давайте
посмотрим, как будет отличаться работа с форматом jpg. Это у нас pic3.
Ну и давайте посмотрим первое.

Мы задаем, что у нас тип контента – jpg. Дальше имя файла – jpg.
Дальше расчеты те же самые, создаем мы изображение
ImageCreateFromJpeg, как мы задавали. У нас нет на jpg альфа-канала,
поэтому мы можем его не задавать. Дальше делаем копию resampled и
вместо ImagePng пишем ImageJpeg. И давайте посмотрим, что у нас
получится. Итак, мы вывели сжатую картинку jpg. Принципы работы
остались те же самые.

Теперь домашнее задание. Мы вывели сжатую картинку, а вам нужно


вывести полную картинку, полное изображение этой лилии.

146
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
6.5 Трансформация изображений
Мы рассмотрим сейчас следующие виды трансформации.

Обрезка изображений или crop она еще называется, когда мы просто


вырезаем из некоторого оригинала кусочек изображения. Дальше мы
можем повернуть изображение с помощью функции ImageRotate на
некоторый угол. И мы можем сделать зеркальное отражение с помощью
функции ImageFlip, которой могут быть заданы параметры, как мы хотим
зеркально отразить:

IMG_FLIP_HORIZONTAL по горизонтали;
IMG_FLIP_VERTICAL по вертикали;
IMG_FLIP_BOTH одновременно и по горизонтали и по
вертикали.

И переходим к сайту 26. Итак, давайте посмотрим. Сначала мы хотим


просто вывести оригинал. У нас есть в папке Pics единственный файл
графический, с которым мы будем работать. Давайте сначала мы его
просто выведем.

Как вы уже помните, всё, что нам нужно – это задать имя, создать холст
и вывести эту картинку. Давайте это и сделаем. Вот у нас картинка
некоторого моста. Теперь переходим к следующему. Это обрезка
изображения. Что мы делаем? Фактически мы используем тот же самый
ImageCopyResampled, только теперь мы уже не рассчитываем, как нам
это изображение хитро преобразовать, а мы просто задаем координаты
обрезки, это откуда нам взять. Мы берем сейчас 0, 0, х и у и просто
обрезаем. Давайте посмотрим, что произойдет. Обновить.

Итак, мы из исходного оригинального изображения просто вырезали


некоторый кусочек. Всё достаточно просто. Теперь переходим к

147
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
следующему. Это поворот изображения Поворот изображения, pic3.
Берем это изображение. И дальше смотрите, что мы делаем. Мы
выполняем функцию ImageRotate, но в результате этой функции
появляется новая картинка, потому что при повороте размеры картинки
меняются. Здесь мы задаем размер – 45 градусов. И фон, который нужно
наложить на получившееся новое изображение. Давайте посмотрим
сначала, как это будет выглядеть, а потом, что будет, если убрать этот
фон.

Итак, вот у нас обрезка, вот поворот. Теперь если мы уберем этот фон.
Здесь сделаем ноль. То у нас при повороте возникает черный такой фон.
Поэтому нам нужно здесь задавать правильный цвет фона.

И заключительный – это зеркальное отражение. Мы используем


ImageFlip. Но так как зеркальное отражение нам не меняет картинку, то
мы можем использовать ту же самую картинку, которая у нас есть, мы
просто говорим, что нам нужно вертикально ее отразить. Сохраняем.
Здесь тоже открываем. Нажимаем сохранить. И вот наше зеркальное
отражение.

Теперь добавим наше задание: изменить программу так, чтобы


отражение было горизонтальное.

148
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
6.6 Совмещение изображений
Часто встречаются ситуации, когда программисту по просьбе дизайнера
нужно совместить какие-то изображения.

Для совмещения изображения служит функция:


bool imagecopymerge ( resource $dst_im, resource $src_im, int $dst_x, int
$dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct )

У нее множество аргументов проще разобрать их на примере. Итак,


переходим на сайт 27, урок 6.6. У нас в этом уроке есть два изображения
frame.png и cats.png. Наша задача их совместить. Давайте пойдем по
порядку.

Первое действие – вывести рамку. Pic1, вывод рамки, здесь у нас уже
всё известно. Задаем имя, создаем холст, сохраняем альфа-канал и
выводим картинку. Вот рамка. Мы просто вывели картинку. Теперь идем
дальше.

Нам нужно совместить изображения с помощью нашей функции. Как мы


действуем? Сначала мы загружаем источник, нашу картинку cat. И
получаем ширину и высоту этой картинки. Затем мы загружаем frame и
то, что мы перед этим сделали. И вот теперь начинается наша функция
ImageCopyMerge.

Итак, смотрите, мы указываем. Вот рамка, в нее надо скопировать,


добавить наш источник, в точку 83, 150 и дальше пошло, что именно из
картинки надо скопировать. В данном случае у нас картинки совпадают,
поэтому мы пишем, что 0, 0, точнее совпадает вставляемая картинка с
тем местом, в которое мы ее будем ставить. Поэтому мы ее целиком
берем, 0, 0 – вот ширина и высота, которые мы здесь получили. Здесь
мы пока ставим 100, потом посмотрим, как это будет действовать. И

149
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
после этого выводим нашу рамку. Давайте посмотрим, что у нас
получится. Обновить.

Итак, вот наша рамка, а вот совмещение изображений. Вот у нас в рамке
появилось наше изображение кота. И теперь посмотрим, как влияет
параметр. Мы вот сейчас зададим не 100%, а 50% и попробуем вывести.
Вот видите, кот затемнился. В данном случае, если нам нужно делать
такое наложение, чтобы было затемнение, то мы начинаем уменьшать
этот параметр. Обычно нам все-таки нужно 100.

Следующая тема – это нанесение водяных знаков.

Часто владелец сайта считает, что если у него оригинальное фото,


которое он сделал сам для своего сайта, то для защиты от копирования
лучше нанести водяные знаки. Вообще водяных знаков может быть
сколько угодно. Самое простое – в фотошопе их сделать. Но точно так
же, как программисты, мы это можем делать программно.

Существует много способов нанесения водяных знаков, но наиболее


распространенные следующие:

 нанесение полупрозрачной картинки с именем сайта (это то же


самое, что мы только рассмотрели в совмещении изображений);
 надпись с именем сайта.

Давайте это и сделаем. У нас здесь есть наш любимый шрифт Roboto. И
давайте pic3 откроем. Сразу с заданием. Откроем его и посмотрим, что
здесь происходит. Здесь сначала всё то же самое до копирования и
наложения нашего фото. И вот, собственно, пошел водяной знак.

И для расчета, если мы хотим поместить водяной знак точно в центр, мы


как раз используем ту самую функцию ImageTtfbBox, которая нам это
позволит сделать. Итак, получаем ширину и высоту нашего изображения

150
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
frame. Дальше ставим текст frogtips.ru, наш шрифт и размер нашей
надписи.

Дальше получаем boх, нашу рамку, в которую будет вписан текст. И на


основании этой рамки получаем х и у¸ которые, если мы разместим
точно в х и у, эта надпись появится в центре. В данном случае нам не
очень хочется, чтобы это нам перекрывало кота, поэтому мы сделаем со
смещением х и у. И после этого, собственно, выводим на frame наш
текст. И давайте это посмотрим.

Вот водяной знак. Вот здесь у нас появилась надпись


frogtips.ru,повернутая на 45 градусов. И домашнее задание: измените
программу так, чтобы водяной знак выводился вертикально.

151
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
7. Разработка веб-сервиса
7.1 Регистрация на хостинге
В этой главе мы разработаем каркас веб-сервиса. В качестве примера
возьмем сервис хранения визуальных закладок сайта.

Сразу скажу: если у вас есть какой-то веб-проект, то перед началом


этого проекта рекомендую посмотреть какие-то истории или примеры
уже готовых проектов близкой тематики, для того чтобы посмотреть,
какие были успешными, какие неуспешными. Преимущество интернета в
том, что это сделать можно быстро: набрали вашу идею в поисковой
системе, и вот вы уже нашли всю информацию, которая вам нужна.

В частности, сервис хранения визуальных закладок. Есть пример очень


успешного стартапа, когда Джошуа Шахтер 24 сентября 2003 года
создал сервис хранения закладок Delicious, а уже 9 декабря 2005 года
сервис был куплет компанией «Yahoo». Сделку оценивают в районе 15-
30 млн. долларов США. Позже компанией «Yahoo» по разным причинам
сервис был закрыт. Но именно с точки зрения стартапа: человек
придумал какой-то сервис, причем логика этого сервиса достаточно
проста, понятна любому человеку, и за 2 года на этом сервисе
заработал, даже если брать по минимуму, 15 млн. долларов США.

Конечно, это особенность именно интернета, что стартапы выстреливают


очень быстро. Конечно же, тут срабатывает много факторов, и если вы
начнете повторять какой-либо сервис, то вы уже столько не заработаете.
Тут важно именно то, что человек должен придумать новую и хорошо
востребованную идею. Иллюстрацию, как вы можете дальше действовать
достаточно быстро, если у вас есть идея разработать веб-сервис,
рассмотрим в этой главе.

Начнем с регистрации на хостинге.

152
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Очень важный момент: начинать веб-проект нужно сразу же с проверкой


на хостинге, чтобы любые проблемы проявились еще на этапе
проектирования. А какие проблемы? Проблем может быть сколько
угодно: разная настройка на локальном хостинге и на хостере;
ограничения, которые вводятся на вашем тарифном плане; различные
глобальные переменные, и т.д. Поэтому у PHP-программиста есть
особенность: сразу нужно делать готовый результат на хостинге.
Разумеется, на локальном хостинге идет основная разработка, но как
только закончили очередной блок, вы его выкладываете в интернет и
проверяете там.

Теперь вопрос: какой хостинг выбрать для начинающего PHP-


программиста? Для платного хостинга (как и в курсе «Как сделать сайт»)
я рекомендую хостинг «HandyHost». В чем его главное достоинство? Это
достаточно дешевый хостинг (всего 68 рублей в месяц – это совсем
дешево), при этом уже на этом дешевом тарифе предоставляется панель
управления ISPmanager – сейчас это лучшая профессиональная панель
управления сайтом. Поэтому я рекомендую начинать с этого хостинга.

Но в нашем курсе, так как нас интересует только учебная ситуация, нам
лучше начать с совсем бесплатного хостинга, для того чтобы что-то
проверить бесплатно, и это будет достаточно быстро и просто. У
«HandyHost» нет бесплатного хостинга, но есть у «Beget». Сразу скажу,
что у меня есть проекты и на «HandyHost», и на «Beget», и оба хостинга
я рекомендую. Там хорошая техническая поддержка, пожалуйста,
можете работать.

Переходим к бесплатному хостингу. Вот он бесплатный хостинг. Всё, что


вам нужно для регистрации – ввести ваши ФИО, телефон и поставить
галочку и нажать на «Зарегистрировать аккаунт». Сейчас вы это
сделаете, и уже на следующем уроке мы посмотрим, что делать дальше.

153
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
7.2 Знакомство с хостингом
После регистрации вы получите логин и пароль к личному кабинету.
Сохраните их в менеджере паролей keepass.

Вообще, если уже работать серьезно, то нужно завести карточку сайта, о


чем я подробно рассказывал в курсе «Как сделать сайт», и поэтому я
отправляю вас к этому курсу. Наша задача пока намного проще: всё, что
нам нужно – это выложить наш проект, который сейчас у нас на
локальном хостинге, на официальный хостинг. Для этого многого знать
не нужно. Когда вы получили это сообщение, записали логин и пароль,
нажимаете кнопочку «Начать работу». Вы попадаете в панель
управления, но нас на самом деле интересует только малая часть – 2
раздела: «Файловый менеджер» и «MySQL».

Но прежде чем мы пойдем дальше, смотрите: здесь есть сервер – это


название вашего сайта. Вы можете его скопировать и перейти. Смотрите,
что на данный момент на вашем бесплатном сайте находится. Здесь
находится страничка-заглушка, которая автоматически была создана для
вас «Beget». Когда вы свой проект сюда скопируете, то здесь уже будет
ваш проект работать. Чуть позже мы это сделаем.

154
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Если вы нажмете на «Файловый менеджер», то перейдете в простую,


знакомую панельную систему работы с файлами, и вас должно
интересовать вот это: «public_html». Здесь и будет находиться ваш сайт.
А здесь, где написано: «index», «php», и будет находиться ваш
«index.php».

Что мы делаем дальше?

Чтобы у нас все заработало, мы должны сделать 4 действия:

1. создать базу данных (в панели управления мы должны перейти в


«MySQL»);
2. проверить работу phpMyAdmin (при этом, когда мы перейдем в
панель управления MySQL, то ссылка на phpMyAdmin здесь
присутствует);
3. перенести файлы проекта в папку «public_html»;
4. в файле «start_mysql.php» изменить логин, пароль и имя базы
данных (у нас сейчас: “root”, “root”,“test” (логин, пароль и база данных).

155
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
А пока мы сделаем первые 2 шага. Мы должны создать базу данных –
для этого мы переходим в панель управления MySQL и попадаем в базу
данных. В данном случае, на бесплатном хостинге у вас одна база
данных – этого вполне достаточно. Вам нужно будет (здесь я просто уже
создал базу данных) добавить ваш доступ: в «Имя базы» после
подчеркивания добавьте «main»; напишите пароль и обязательно его
запомните, и нажмите кнопочку «Добавить». У вас появится база
данных. После того, как вы создали базу данных, вам нужно будет
нажать на «phpMyAdmin» и перейти на phpMyAdmin. Вот она ваша база
данных, и в данном случае таблиц в базе данных не обнаружено – так и
должно быть, потому что мы эти таблицы еще не создали. А как создать
эти таблицы, мы рассмотрим уже в следующем уроке.

156
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
7.3 Перенос проекта на хостинг
Итак, у нас всё готово для того, чтобы наш проект запустить на боевом
сервере. Что нам нужно сделать?

Первое, что нам нужно – зайти в «File Manager», где будет происходить
вся работа, и убедиться, что вы зашли в папку «public_html». Нажмите
на иконку «Загрузить файлы» и выберите папку «Site28». Вот у нас
«Загрузить файлы», «Browse», и вот «Site28». Вам нужно выбрать все
файлы и нажать «Открыть», а потом нажать «Загрузка» (т.к. я уже все
загрузил, я этого делать не буду).

Далее нам нужно создать папку «Pics».

Для этого нажмите на иконку «Новая папка» (я уже создал, поэтому


создавать не буду). Теперь нам нужно подготовиться к созданию таблиц.

157
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Для этого вы должны зайти в файл «start_mysql.php» (нажмите на него
дважды), и вот в этой строке вам нужно правильно внести изменения.
Когда вы создавали базу данных, у вас было имя этой базы данных и
пароль. Смотрите, что вы делаете: вместо первого «”root”» пишете имя
базы данных, вместо второго «”root”» пишете пароль, и вместо «”test”»
пишете имя базы данных.

Дальше нам нужно создать таблицы.

Для этого вы должны зайти в файл «index.php» и найти там строку


«//InitDB();». Давайте это сделаем. И нужно убрать комментарии,
«Закрыть» и «Сохранить». Дальше вы должны перейти на сайт. Я уже
показывал вам, где находится имя вашего сайта, и оно уже
сдублировано вот здесь – вы должны перейти по этому имени. Заходим,
смотрим, что вот здесь есть какие-то надписи о том, что были удалены,
созданы таблицы. Если они появились, то у вас всё хорошо. После этого
опять заходите в файл «index.php» и либо удаляете, что я рекомендую,
либо пока можете поставить комментарии. Всё, ваш сервис готов к
работе.

Давайте проверим, как он работает. Здесь нужно вводить имя сайта, по


умолчанию здесь уже что-то подставлено. Нажимаем «Добавить сайт», и
у нас появляется визуальная закладка. Теперь вводим: «progtips.ru»,
нажимаем «Добавить сайт», и у вас появляется следующая визуальная
закладка. Причем если мы зайдем в правку закладок, то мы можем
посмотреть, что они существуют. Удаляем «yandex», и у нас наш сайт
готов, здесь можно написать: «php.net». «Добавить сайт».
Соответственно, вот он появился.

Таким образом, у нас по этому адресу работает наш сервис. В


следующем уроке мы посмотрим, как он устроен.

158
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
7.4 Реализация проекта
Рассмотрим, как у нас реализован данный сервис. Для вас это будет
достаточно просто, потому что я использовал все те приемы, которые мы
уже рассматривали. И я вам рекомендую всегда это делать, особенно
при разработке веб-сервисов. Старайтесь не создавать что-то с нуля, а
брать уже готовые шаблоны, готовые куски ваших предыдущих проектов
и менять их под текущую задачу.

Единственное, что нужно пояснить – это таблицы базы данных. Мы


будем использовать 3 таблицы:

1. Закладки (где будут храниться все закладки: Код закладки,


Закладка (имеется в виду ее заголовок, название сайта), Адрес сайта
(URL), Скриншот, Код клиента (к которому относится), Код групп (что
закладки можно разбивать по группам));
2. Группы (Код группы, Группа, Код клиента (который создал группу);
3. Клиенты (Код клиента, Логин, Пароль, Доступ (уровень доступа),
Регистрация).

Всё это у нас есть в файле «main» в функции «Init» базы данных. И
здесь наш стандартный принцип создания – то, что мы выполнили. Если
эти таблицы существуют, то они удаляются, и дальше создается таблица
«Закладки». Нужно отметить, что URL может быть размером не больше
2048 символов, поэтому под адрес отведено столько. Дальше мы создаем
таблицу «Группы» – здесь всё понятно; и в таблицу «Группы» мы
добавим запись «Общая» таблица. Это для того, чтобы тогда, когда
человек без регистрации, он всё равно мог бы что-то добавлять. Таблица
«Клиенты» тоже нам хорошо знакома. Опять же, мы сюда добавляем
клиентов: «’admin’» с паролем «’admin100’», с условным новичком
(человек, который не ввел пароль – «‘1’, ‘1’, ‘1’» – мы считаем, что это
человек без регистрации). Как вы видите, записи тоже добавлены.

159
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Когда мы добавили записи, посетитель сайта находится здесь и он хочет
добавить сайт. За это отвечает функция «addtab». Давайте посмотрим,
как она работает. Она получает наш «’taburl’» (адрес сайта). Дальше мы
должны получить заголовок сайта («SiteTitle»). У нас есть функция
«SiteTitle», которая считывает файл по адресу, который мы передали,
ищет то, что находится между тегами «<tltle>» и «<\/tltle>», после этого
чистит от различных спецсимволов и возвращает заголовок нашего
сайта. Мы его получили в «tab», и потом мы его запишем в название
закладки.

Получение скриншота. Здесь мы используем сторонний сервис –


функция «SiteScreenshot». Как она выглядит? Есть сторонний сервис,
который называется «s-shot.ru». Если ему передать сайт, он вернет
картинку со скриншотом. Чтобы получить уникальное имя сайта, мы его
закодируем. Мы получаем имя. Все скриншоты хранятся у нас в папке
«pics». Если этот файл уже существует, то мы просто выдаем его, а если
еще не существует, то мы готовим запрос к этому сайту, получаем
скриншот от этого сайта и сохраняем его в файл, после этого выдаем
этот файл.

Таким образом, мы получили заголовок сайта, скриншот сайта. Так как


человек не зарегистрировался, здесь мы пишем: «1» (группа первая,
общая), получаем код новичка, у которого пароль равен 1, и после этого
добавляем в закладки. Отображает закладки функция «ShowTabs()». Что
она делает? Берет первые 9 закладок и с помощью блоков «div» выводит
на экран сами картинки скриншотов, но делает их ссылками. Если вы
подведете мышку, то увидите, что по каждому скриншоту можно перейти
на соответствующий сайт. Здесь еще есть редактирование таблиц и
закладок – тоже наша знакомая тема, где можно посмотреть, что у нас за
закладки и открыть, удалить и т.д.

Что еще не сделано и остается в качестве вашего домашнего задания


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

160
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
7.5 Развитие проекта
Этот урок очень важен. Может быть, это даже самый важный урок с
точки зрения того, сколько вам сэкономят времени, усилий, денег и т.д.
те советы, которые я вам дам. Потому что я уже давно в теме разработки
сайтов, у меня множество реализованных проектов, есть очень
прибыльные проекты. И так как я в этой теме уже много лет, я вижу
типовые ошибки у различных разработчиков. Давайте с ними
разберемся.

Первое, что вы должны понимать – множество веб-проектов остаются


абсолютно незамеченными и не приносят никакой пользы. Они не
приносят пользы ни посетителям, потому что не нужен этот проект,
оказывается, ни самому автору: у вас нет посетителей, вы не можете
получить деньги никоим образом ни за сам проект, ни за рекламу на
этом проекте. Поэтому важный момент: не следует тратить много усилий
на разработку сервиса до тех пор, пока сервисом не начнут
пользоваться.

В том проекте, который мы сейчас рассмотрели, который мы выложили


на хостинг, я сознательно не стал пока делать функцию регистрации, и
не рекомендую делать ее с самого начала. Зачем? Сначала просто
предложите какой-то функционал, и если люди вообще заходят,
пользуются, что-то делают – отлично, тогда, конечно же, следующим
шагом нужно делать регистрацию. Но если на ваш сайт вообще никто не
заходит (или если даже заходит, но ничего не делает) – это говорит о
том, что что-то с функционалом не так. По этой же причине лучше
начинать с бесплатного аккаунта.

Это у разработчиков какая-то мания, когда они начинают с самого


начала вкладывать много денег, и потом говорят (это часто можно
встретить в интернете): «У нас деньги на разработку, на хостинг, на

161
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
дорогие сервера». Это дикость. Вам ни в коем случае не нужны какие-то
выделенные сервера в самом начале. До тех пор, пока ваша
посещаемость не превысит 1000 человек в сутки, ни о каких дорогих
хостингах даже и не думайте. Самый минимальный тарифный план,
допустим, тот, который есть на «HandyHost», но я бы даже начал с
бесплатного аккаунта. Потому что если вы на бесплатном аккаунте
сделали тест, проверили и видите, что это вам ничего не дает, люди на
него не ходят, то вы просто сделали пробу и сильно не потратились.

Теперь рассмотрим последовательный план, как правильно развивать


веб-проект. Первое –общий настрой: даже если вам кажется, что идея
очень удачная – идея-то, может быть, и удачная, но сейчас, в данный
момент люди ее не понимают. Вы понимаете идею, а люди ее не
понимают. Есть очень яркий пример, когда на заре развития интернета
один из крупных (в то время) руководителей сказал, что поисковые
системы в интернете не нужны, потому что когда человек найдет сайт,
он его добавит в закладки, и после этого будет пользоваться только
своими закладками, и зачем ему тогда какие-то поисковые системы? Это
показывает, что люди ошибаются в своих прогнозах, и поэтому вы тоже
можете ошибиться в своей идее. Поэтому смотрите общий подход к
развитию сервиса, который включает 3 больших шага.

1. Предложить минимальный функционал и посмотреть на реакцию


посетителей. Я рекомендую начинать со своих знакомых. Вы можете
своим приятелям в соц.сетях сказать: «Я тут что-то накропал, посмотри,
это вообще интересно или нет». Если ваши знакомые скажут, что это
ерунда, то это говорит о том, что, возможно, вы что-то не так понимаете.
Но если хотя бы парочка из них заинтересовалась и что-то там начали
делать, то можно прорекламировать его на каком-то бесплатном сайте,
где можно делать всякие объявления, или на форумах, или выложить на
своей страничке, сказав, что вы что-то сейчас развиваете.

2. Внимательно смотрите статистику посещений. Вы можете поставить


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

3. После этого, если вы видите, что люди начали что-то делать, вы


начинаете постепенно добавлять функционал и просить отзывы
посетителей. Если в какой-то момент вы чувствуете, что те люди,
которые начали пользоваться, они именно пользуются (не пару раз
зашли и потом пропали), то с этого момента вы уже начинаете
вкладываться в проект. В этот момент вы уже создаете сайт – не
бесплатный, а нормальный сайт, купив доменное имя. При этом, если вы
решили остаться на «Beget», вы можете перейти на платную основу. Я
рекомендую на «HandyHost». И дальше вы начинаете серьезно работать,
потому что вы знаете, что это в перспективе вам принесет какой-то

162
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
доход, ваши усилия многократно окупятся. Максимальный успех – если
это всё превратится в стартап – когда людям настолько понравилась
ваша идея, у вас идет большой взрывной рост, и вы зарабатываете
много денег, чего я вам и желаю.

Но еще рано думать о больших деньгах, и в следующем уроке мы


поговорим о том, с чего надо начинать работу PHP-программиста.

163
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
7.6 Развитие профессионализма
В этом уроке мы поговорим о том, как максимально эффективно
продвинуть себя в сфере PHP-программирования или в сфере разработки
сайта.

Что нужно знать? Разработка сайтов – это очень динамичная сфера:


постоянно появляются новые идеи, взлетают стартапы, рынок постоянно
меняется. И в этих условиях очень важно не очень долго готовиться и
учиться. Есть традиционный путь: когда человек хочет чему-то
научиться, он идет в институт и 5 лет там учится. Сразу скажу, что в
сфере сайтов такой человек безнадежно отстанет. Даже из своего опыта
скажу, что когда я работал преподавателем в ВУЗе, я читал курс
«Электронная коммерция», и мне каждый год приходилось этот курс
переделывать полностью, потому что настолько всё быстро менялось.
Потом, когда я уже занялся бизнесом и сделал множество проектов, всё
время, когда начинаешь новый проект через пару лет придумывать,
выясняется, что подходы изменились, уже что-то по-другому. Поэтому
нужно сразу идти в реальный проект, и уже в процессе придумывать и
внедрять свои идеи. Запустил один проект, второй, посмотрел, проверил,
попробовал, и дальше уже, что называется, проверка боя.

Какие же рекомендуемые шаги именно для профессионализма?

1. Я всегда рекомендую сделать любой бесплатный сервис. Даже если


вы потом собираетесь работать PHP-программистом. Прекрасно, у вас
будет портфолио, которое вы легко продемонстрируете вашему
потенциальному работодателю. Это лучшая визитная карточка, это
лучшая ваша рекомендация. Потому что в теме программирования
(особенно программирования сайтов) давно уже не смотрят на какие-то
корочки, а смотрят на реальный проект. Поэтому бесплатный сервис
нужно делать обязательно, и не один.
2. Смотреть статистику и отзывы.
3. Если вы чествуете, что проект пошел, то попробуйте добавить
платные функции и посмотреть, можете ли вы монетизировать этот
проект.

Если вас больше интересует не свой проект, а работа по найму,


выполнение коммерческих заказов, то все-таки сначала наберите
портфолио, а затем уже переходите к выполнению коммерческих
заказов. В любом случае, не стоит сразу брать деньги с людей, если вы
еще не имеете конкретного опыта.

164
Константин Шереметьев www.sheremetev.info
__________________________________________________________________

Какие же пути есть у PHP-программиста?

1. То, о чем мечтают миллионы программистов – это, конечно, сделать


стартап. На наших глазах многие миллиардные проекты делались
энтузиастами, затем набирали множество поклонников и продавались за
миллиарды. Это реальность, поэтому, конечно, пожалуйста, идите сюда.

2. Сейчас очень популярно делать плагины для известных сайтов.


Очень популярны плагины для «Wordpress». И для любых сайтов,
которые связаны с электронной коммерцией, сейчас особенно
востребована интеграция разных сервисов. Например, есть сайт,
который занимается продажей, а есть сайт службы доставки, и вот
написать интеграцию между этими сайтами. Это тоже очень
востребовано.

3. Писать веб-приложения на заказ. Спрос огромный, разработчиков


практически нет. Единственное, скажу по опыту, что очень многие PHP-
программисты считают, что они PHP-программисты и что-то могут, но
если реально с ними взаимодействовать, выясняется, что
профессионально они очень слабенькие. И именно поэтому я
возвращаюсь к первому совету: набирайте портфолио, потому что если
вы просто так куда-то приходите и говорите: «Я вам сделаю сайт», то
доверия вам будет не очень много.

4. Работать по найму. Успех в этой ситуации очень сильно зависит от


нанимателя. Следите, чтобы проект был современный. Тогда вы можете
многому научиться, и это для вас будет хорошим трамплином. Почему?
Есть такая тенденция именно в сфере PHP-программирования, когда у
людей есть старенький проект 10-летней давности, они нанимают
человека, который должен за этим проектом следить, что-то там менять.
Но те решения, которые были при этом выбраны, уже давно устарели, и
вы можете на таком устаревшем проекте просидеть 10 лет и ничему не
научиться, устареть вместе с этим проектом тоже на 10 лет. Поэтому,

165
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
когда вы собираетесь куда-то наниматься, обязательно посмотрите, что у
них за сайт, какие решения они используют, и, уже в зависимости от
этого, принимайте решение о том, идти к ним или нет.

В любом случае, PHP-программирование сейчас – максимально


востребованное направление, поэтому занимайтесь, учитесь, создавайте.
Желаю вам всяческих успехов. Спасибо за то, что прослушали данный
курс.

166
Константин Шереметьев www.sheremetev.info
__________________________________________________________________
Заключение
Поздравляю! Вы только что завершили изучение курса
«Программирование на PHP и MySQL». А знаете ли вы, что для того,
чтобы получать более крупные заказы, любому программисту
необходимо освоить работу с базами данных на высоком уровне?

Поэтому я рекомендую вам освоить видеокурс


«Программирование баз данных на SQLite»! В курсе
по PHP и MySQL я даю основы работы с языком SQL,
в курсе по программированию баз данных мы
изучаем их максимально подробно. В нём в простой
и доступной форме изложен материал целого года
обучения в ВУЗе.

Узнайте все подробности здесь <<<

167

Вам также может понравиться