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

Программирование

на PHP/MySQL
Глава 1. Основы языка PHP
Язык программирования PHP - это самый популярный язык для создания
сайтов и веб-сервисов. Рейтинг можно посмотреть здесь:
https://www.wappalyzer.com/categories/programming-languages
1.1 Установка среды PHP-express
1. Скопировать файл PHP-express.zip в папку c:\Prog
2. Распаковать файл PHP-express.zip в папку c:\Prog
3. Запустить файл c:\Prog\UwAmp\UwAmp.exe

Если сервер не запустился, то запустить программу


c:\Prog\UwAmp\lib\vc12_redist.exe
и повторить пункт 3.
Если сервер опять не запустился, то запустить программу
c:\Prog\UwAmp\lib\vc17_redist.exe
и повторить пункт 3.
Разрешение доступа
При первом запуске появятся оповещения Windows. Нажмите “Разрешить доступ”
Удаление сборки PHP-express
Сборка PHP-express содержит три независимых программы,
каждая в своей папке:

● Geany
● Kompozer
● UwAmp

Для полного удаления нужно удалить все три папки.

Также можно удалить и переустановить любую из программ.


1.2 Технологии Интернета

Динамические сайты PHP/MySQL

Всемирная паутина (WWW)

Интернет (TCP/IP)

Сети

Компьютеры
Всемирная паутина
Всемирная паутина World Wide Web (WWW) - это система
размещения гипертекстов с общемировым доступом.
PHP
Язык PHP позволяет создавать эти гипертексты динамически, то
есть гипертекст создается при обращении к сайту.

WWW базируется на трех технологиях:


● URL - унифицированный указатель ресурса
● HTTP - протокол передачи гипертекста URL, HTTP, HTML
● HTML - язык разметки гипертекста
Технология URL
Основой WWW является сайт – выделенное место на сервере
провайдера, снабженное адресом, по которому это сайт может быть
доступен. Выделенное место находится на компьютере провайдера, а
сам процесс выделения места называется хостингом.

У каждого узла в Интернете есть IP-адрес. Он уникален в пределах


Интернета.

Адрес IP состоит из четырех чисел, разделенных точками, каждое из


которых меньше 256. Например, 112.53.34.77

Внутри узла могут быть свои IP-адреса.


Как правило, хостинг на одном IP-адресе размещает тысячи сайтов.
Указатель URL
Для точного указания сайта используется система доменных имен (DNS),
которая преобразует символьное имя в IP-адрес.

Указатель URL имеет вид:


<протокол>://<пользователь>:<пароль>@<хост>:<порт>/<путь>#<закладка>

https://progtips.ru/kursy#i

https - защищенный протокол


:// - признак адреса
progtips - имя сайта
.ru - доменная зона России
/kursy - подпапка на сайте
# - признак закладки
i - имя закладки
1.3 Протокол HTTP
Данные в Интернете передаются по специальным протоколам.

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


он называется клиентом.
Другой предоставляет информацию - он называется сервером.

Клиент Сервер

Запрос

Ответ
Как устроен HTTP
Протокол HTTP (HyperText Transfer Protocol, протокол передачи гипертекста)
использует модель “запрос-ответ”.

● Клиент запрашивает информацию по URL.


● Сервер выдает информацию по этому адресу клиенту.

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

В последнее время по рекомендации Google идет переход к защищенному


протоколу HTTPS, в котором передаваемая информация шифруется.

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


клиенту сервер сначала выполняет программу на PHP.
Программы для работы с HTTP
Программа для сервера называется веб-сервер,
а программа для клиента - браузер.

Наиболее популярными веб-серверами являются серверы Apache и nginx.


Наиболее популярным браузерами являются Google Chrome и FireFox.

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


частности с интерпретатором PHP и СУБД MySQL.

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


WAMP - это сокращение от слов Windows, Apache, MySQL, PHP.
В курсе используется комплект UwAmp.
Порядок разработки сайта на PHP
Интернет
Ваш компьютер Хостинг

Шаг 1. Локальная разработка.


Шаг 2. Перенос сайта на
хостинг.
Локальная разработка
Для локальной разработки используется специальный адрес localhost или IP-
адрес 127.0.0.1

Для проверки локального веб-сервера напишите этот адрес в строке браузера.

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


c:\Prog\UwAmp\www\
1.4 Язык разметки HTML
Язык разметки HTML (HyperText Markup Language - язык разметки гипертекста)
- это язык, в котором блоки текста обрамляются тегами.

Так как текст в Интернете передается последовательно, то язык HTML


позволяет отображать текст сразу после появления конца тега.

Каждый тег обозначается некоторым кодом и имеет начало и конец. Каждый тег
начинается знаком "<код параметры>" и заканчивается знаком "</код>".
Например, текст, выровненный влево, выглядит так:

<p align="left"> Пример текста </p>

Этот тег обозначает начало (<p>) и конец (</p>) параграфа.


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

Первая страница должна иметь имя:

index.html

Остальные страницы доступны по ссылкам.

Если в файле содержится программа на PHP, то файл должен иметь


расширение php. И первая страница должна иметь имя.

index.php
Минимальная веб-страница на HTML
<html> <html> - страница
<head> <head> - данные для браузера
<title>Заголовок страницы</title> <title> - заголовок
</head> <body> - тело страницы
<body> <p> - параграф
<p>Текст страницы</p>
</body>
</html>

Для проверки страницы сохраните этот текст в файл index.html и поместите в


папку:
c:\Prog\UwAmp\www\site1\
Затем перейдите в браузере по адресу:
http://localhost/site1/
Визуальный HTML-редактор CompoZer
Для быстрой разработки веб-страниц обычно используются визуальные
редакторы. CompoZer - это бесплатный русифицированный портабельный
редактор, который позволяет быстро создать веб-страницу.
1.5 Минимальная программа на PHP
Программа на PHP представляет собой скрипт, который вставляется в HTML-
файл.

<html>
<head>
<title>Заголовок страницы</title>
</head>
<body>
<p>Текст страницы</p>
<?php
print "Сегодня - ".date("d-m-Y",time());
?>
</body>
</html>
Среда разработки Geany
Для разработки PHP-программ самыми популярными средами разработки
являются Notepad++ и Geany.

Обе этих программы построены на одном движке Scintilla, но Geany является


кросс-платформенной и доступна для следующих операционных систем: BSD,
Linux, Mac OS X, Solaris и Windows. Поэтому в курсе будем использовать Geany.
Работа с Geany
Geany - это текстовый редактор со множеством удобных
инструментов для программиста.
1.6 Модель языка PHP
Причиной популярности языка PHP является уникальная модель языка.

Стандартный язык Язык PHP

Веб-страница Веб-страница пишется на


формируется средствами HTML, а на PHP пишутся
языка. динамические элементы -
PHP-скрипты.

Это дает возможность быстрой разработки. За короткое время можно набросать


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

Верстальщики формируют шаблон веб-страниц и добавляют небольшие вставки


кода. Этот код вызывает программы-обработчики, которые пишут PHP-
программисты.
Описание языка PHP
PHP - это интерпретатор, который выполняется на стороне сервера. Сервер
берет страницу на PHP, выполняет все скрипты на этой странице и отправляет
клиенту чистый HTML-код.

Сейчас PHP бурно развивается и получает всё больше возможностей. Но


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

Язык PHP написан на языке Си и много элементов взял из языка Си.


Глава 2. Функции и типы данных
Так как PHP постоянно развивается, то есть проблема с версиями PHP.
Программисту нужно следить, чтобы версии PHP на локальной машине и на
сервере совпадали.

Также нужно быть в курсе и учитывать изменения в языке.

Справочник по языку PHP находится на официальном сайте:


http://php.net/manual/ru/index.php
2.1 Ключевые особенности PHP
Ключевые особенности языка PHP:
● Функциональный подход (код пишется в виде y = f(x);).
● Отсутствует типизация (тип переменной устанавливается по контексту).
● Исходный код программы на PHP располагается прямо на веб-странице.

<p>Здесь нет PHP</p>


<?php print 'Есть PHP'; ?>
<p>Опять нет PHP</p>
Комментарии
Комментарии в PHP могут быть:
● Однострочные (//)
● Многострочные (/* */).
● В стиле UNIX (#).

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

Комментарии в HTML
<!-- комментарий -->
Подготовка к уроку
Перед каждым уроком нужно убедиться:
1. Сервер UwAmp запущен и работает.
2. Исходный текст сайта для урока скопирован в папку
C:\Prog\UwAmp\www
3. Исходный текст урока открыт в программе Geany.
4. В браузере открыт localhost.
2.2 Переменные и функции
Имена переменных обозначаются знаком $.

$a = 5; // Переменной $a присвоить значение 5.

Имена переменных в PHP являются регистрозависимыми, то есть $a и $A - это


разные переменные.

Программист не устанавливает тип переменной. Это делает PHP во время


выполнения программы в зависимости от контекста.
$a = TRUE; // логический
$a = "Строка"; // строка
$a = 12; // целое число
Вывод строк
В PHP две возможности вывода строк:
● print - выводит одну строку, строку можно получить конкатенацией.
● echo - многострочный вывод, перечисление через запятую.

print "a=$a<br>"."b=$b<br>";
echo "a=$a<br>","b=$b<br>";
Вывод документа
print <<<END
Для вывода большого текста с подстановкой переменных $a используется
синтаксис "режим документа".
Закрывающий идентификатор должен располагаться в отдельной строке!
END;

Совет. Если вы используете режим документа без переменных, то эффективнее


использовать чистый html.
Вместо
print <<<END
Наша компания на рынке с…[большой текст]...”
END;
проще написать
?>
<p>Наша компания на рынке с…[большой текст]...</p>
Функции в языке PHP
Имя функции

Аргументы
функции
function MaxNumber($x, $y)
{
if ($x>$y) return $x; Возвращаемое
else return $y; значение
}

Функции могут быть вложенными: y=f1(f2(f3($x)));


Могут не иметь параметров и возвращаемых значений.
2.3 Сборка веб-страницы
Эффективное использование PHP предполагает, что веб-страница собирается из
отдельных фрагментов. Часть этих фрагментов повторяется по всему сайту.

Для сборки используется специальная конструкция.


require [имя_файла];

Перед запуском программы интерпретатор заменит эту конструкцию на указанный


файл и затем выполнит всю программу. Файл при этом рассматривается как новый
PHP-файл и для интерпретации требует конструкции <?php … ?>

Есть вариант такой конструкции


include [имя_файла];

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


рекомендуется только в том случае, если это реально необходимо.
Пример сборки
header.php

<html>
index.php <head>
<title>Заголовок</title>
<?php </head>
require "header.php"; <body>
print "Сборная веб-страница";
require "footer.php";
footer.php
?>
<br>&copy; Company, 2018.
</body>
</html>

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


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

Для этого в браузере нажмите Ctrl+U.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


<html>
<head>
<title>Урок 2.3</title>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
</head>
<body>
Сборная веб-страница<br>
&copy; Company, 2018.
</body>
</html>
2.4 Использование функций в PHP
На выходе -
На входе - аргументы возвращаемое значение

Функция используется как «черный ящик».


Программисту неважна реализация,
а только то, что у функции на входе и на выходе.
Особенности функций PHP

Имена функций PHP, в отличие от переменных, регистронезависимы, то есть a() и


A() - это одна функция.

PHP содержит множество стандартных функций.

Их можно найти в официальном справочнике.


http://php.net/manual/ru/funcref.php
Область видимости переменных
В отличие от языка Си $a = 1; $a = 1;
глобальные переменные function test() function test()
недоступны внутри функции. { {
print $a; global $a;
} print $a;
Для доступа к глобальной test(); // Ничего не выведет }
переменной внутри функции test(); // Выведет единицу
применяется ключевое слово
global.
function test()
{
Для сохранения значения static $a = 1;
локальной переменной }
используется слово static. Но print $a; // Ошибка
она недоступна вне функции.
Декомпозиция задач

function GetXY()
{
...
}
function FindMax()
{
GetXY(); function MaxNumber()
MaxNumber(); {
ShowMax(); …
} }

function ShowMax()
{
...
}
Организация вызова функций

Как правило, на текущей веб-странице используется только вызовы функций, а их


определения содержатся в отдельном файле.

index.php main.php

<?php require "main.php"; ?> function a() { … }


<p>Текст веб-страницы</p> function b() { … }
<?php a() ?> ...
<p>Текст веб-страницы</p>
<?php b() ?>
2.5 Типы данных
Так как PHP не имеет строгой типизации, то программист должен хорошо понимать
работу с типами и постоянно следить за правильностью использования типов.

В зависимости от контекста PHP может присвоить следующие типы данных:

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


2. integer (целые числа)
3. float (числа с плавающей точкой)
4. string (строки)
5. NULL (пустой тип)
6. object (объекты) - экземпляры классов
7. resource (ресурсы) - хранение ссылки на внешний ресурс
8. array (массивы)
Логический тип

Тип boolean имеет всего два значения — TRUE (истина) и FALSE (ложь). Эти два
значения являются константами и регистронезависимы.

$found = TRUE;
$error = false;
Логический тип обычно используется в условном операторе:
if ($found)
{
print "Найдено";
}
else
{
print "Не найдено";
}
Целый тип
Тип integer представляет целое число со знаком размером в 32 бита (от -2 147 483
648 до 2 147 483 647).

$a = 5;
$b = -6;

Для записи в других системах счисления используются:


$int_8 = 034; // восьмеричное число, начинается с 0
$int_2 = 0b11100; // двоичное число, начинается с 0b
$int_16 = 0x1C; // шестнадцатеричное число, начинается с 0x
Числа с плавающей точкой
Размер числа с плавающей точкой float зависит от платформы. Максимально
возможное значение, как правило, составляет ~1.8e308 с точностью около 14
десятичных цифр.

$a1 = 1.56;
$a2 = 2.43e4; // Это означает 2.43 умноженное на десять в четвертой степени
Строки
Тип string - это последовательность символов внутри кавычек: "Привет!". В отличие
от Си, строки могут содержать в себе также и нулевые символы, что никак не
повлияет на программу. Иными словами, строки можно использовать для хранения
бинарных данных. Максимальный размер строки составляет 2 Гбайт, но по
умолчанию на PHP-скрипт выделяется 128 Мб.

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


Строки в одинарные кавычках не обрабатываются.
В двойных кавычках обрабатываются переменные и спецсимволы.
$a = 1;
print '<br>$a = 1';
print "<br>$a = \$a";
Пустой тип
Пустой тип NULL означает, что значение для переменной не задано. Константа
регистронезависима.
$a = NULL;

Переменная не имеет значения, если:

● Переменной не было присвоено какое-либо значение.


● Был присвоен тип NULL.
● Значение было удалено с помощью функции unset().

Для проверки используется функция


bool is_null (mixed var)
Возвращает TRUE, если var является null, FALSE - в ином случае.

Функция unset() полезна, когда скрипт оперирует объемными данными, и их размер


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

Применение ООП в PHP затруднено, так как ООП требует стиль “водопада” для
реализации проекта, при котором сначала разрабатываются базовые классы,
потом они наследуются, а потом уже реализуется конечный функционал.

Так как веб-сервисы постоянно переделываются, то модель “водопада”


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

Существует направление PHP-програмирования - использование фреймворков, в


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

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


http://php.net/manual/ru/resource.php
2.6 Массивы
Понятие массива существенно отличается от языка Си. В PHP массив - это
упорядоченное отображение, которое устанавливает соответствие между ключем
(key) и значением (value).

array $a = array $a =
( ( [
key1 => value1, "роза" => "цветок", "один" => "первое",
key2 => value2, "цветок" => "роза", "два" => "второе",
key3 => value3, ); "три" => "третье",
... ];
)
key может быть либо типа
integer, либо типа string.
value может быть любого
типа.
Виды массивов
Массивы могут быть нумерованными или ассоциативными, одномерными или
многомерными.

// Пустой массив
$a1 = array();

// Одномерный нумерованный массив


$a2 = array("Иванов","Петров","Сидоров");
print $a2[1];

// Одномерный ассоциативный массив


$a3 = array("Иванов"=>"Иван", "Петров"=>"Петр", "Сидоров"=>"Сидор");
print $a3["Петров"];
Многомерный нумерованный массив
$cars = array (
array("Мерседес",2017,"черный"),
array("БМВ",2018,"белый"),
array("Ауди",2017,"красный")
);

Мерседес 2017 черный

БМВ 2018 белый

Ауди 2017 красный

Доступ к массиву:
print $cars[0][0].", год выпуска - ".$cars[0][1].", цвет - ".$cars[0][2]."<br>";
Многомерный ассоциативный массив
$a = array(
"Иван" => array("Фамилия"=>"Иванов", "Возраст"=>"34", "Должность"=>"инженер"),
"Петр" => array("Фамилия"=>"Петров", "Возраст"=>"29", "Должность"=>"вебмастер"),
"Сидор" => array("Фамилия"=>"Сидоров", "Возраст"=>"37", "Должность"=>"программист"));

Иванов 34 инженер

Петров 29 вебмастер

Сидоров 37 программист

Доступ к массиву:
print "Фамилия: ".$a["Петр"]["Фамилия"]."Должность: ".$a["Петр"]["Должность"]."<br>";
Для точного указания на элемент массива можно использовать фигурные скобки {}.
Приведение типов
В PHP можно использовать явное приведение типов.
(int), (integer) - приведение к integer, например
(bool), (boolean) - приведение к boolean
(float), (double), (real) - приведение к float
(string) - приведение к string
(array) - приведение к array
(object) - приведение к object
(unset) - приведение к NULL

$a = 10; // $a - это целочисленный тип


$b = (boolean) $a; // $b - это логический тип
Рекомендуется всегда явно указывать приведение типов
$a = 5 * "10 обезьян"; // $a получит значение: целое число 50
Глава 3. Разработка программ
PHP - это скриптовый язык. Скрипт - это программа, которая работает в
определенном контексте.

Задача PHP - сформировать веб-страницу, которая будет отображена в браузере.


Это накладывает множество ограничений на PHP-программы.

Для эффективной работы программиста нужно учитывать эти ограничения:


● Ограничение по объему выделяемой памяти (128 Мб)
● Ограничение по скорости (комфортное время отображения страницы - 1 с.)
● Ограничение по сессии (после закрытия браузера данные исчезают)
3.1 Структура проекта
Проект на PHP - это обычно набор папок, каждая из которых отвечает за отдельный
функционал программы.

Например, Wordpress
https://ru.wordpress.org/
имеет следующие стандартные папки:
wp-admin - админка сайта
wp-content - содержание сайта
wp-includes - отображение сайта

Папка wp-content содержит папки:


languages - переводы
plugins - плагины
themes - темы
uploads - медиа-файлы
Программирование в юнитах
Ограничение на скрипты PHP привело к тому, что вместо единой программы
используется следующая технология: веб-сервис представляет собой небольшое
ядро и набор юнитов.

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

Одно из популярных направлений PHP-программирования - разработка плагинов


для других веб-сервисов.
Получение данных
Для получения данных от пользователя PHP использует формы.
Минимально полезный юнит на PHP имеет две страницы: форму и результат.
Например:
google.com
ya.ru

Форма имеет вид


<form action="hello.php" method="get">
Имя: <input type="text" name="firstname" size="20">
<input type="submit" value= "ok">
</form>

Получить данные формы можно через суперглобальный ассоциативный массив


$_GET. Термин суперглобальный означает, что он доступен внутри функции.
Защита от взлома
При получении данных хакер может написать код, который нарушит работу сайта.

Например:
<script>alert('ok');</script>

Простая защита состоит в использовании функции htmlspecialchars(), которая


переводит скрипты в неработоспособное состояние.
Методы GET и POST
Существует два метода передачи данных: GET и POST.

Метод GET передает данные в строке браузера. Это удобно, потому что можно
сохранить эту строку и потом опять вызывать со всеми параметрами. Недостаток в
том, что данные открыты.

Метод POST передает данные скрытно, но сохранить и повторить запрос нельзя.

Получить данные формы можно через суперглобальный ассоциативный массив


$_POST.
3.2 Константы и операторы
Константы отличаются от переменных тем, что их значение не может изменяться
во время выполнения скрипта. Кроме того, они не могут принимать значение NULL.
Константы задаются командой
bool define( string $name, mixed $value [ , bool $case_insensitive = false])
define(NUMBER, 5);
Для проверки существования константы служит функция
bооl defined(string $name)
Константы доступны везде.

Правила написания элементов PHP:


Ключевые слова языка - регистронезависимы (рекомендуется - строчные буквы).
Имена функций - регистронезависимы (рекомендуется - CamelStyle).
Имена переменных - регистрозависимы (рекомендуется - строчные буквы).
Имена констант - по выбору (рекомендуется - заглавные буквы).
Предопределенные константы
Есть ряд констант, которые предопределены в PHP, но их значение меняется от
контекста.
Полный список находится здесь:
http://php.net/manual/ru/reserved.constants.php

Часто используются следующие:


__FILE__ - Полный путь и имя текущего файла. Если используется внутри
подключаемого файла, то возвращается имя данного файла.
__DIR__ - Папка файла. Если используется внутри подключаемого файла, то
возвращается папка этого файла.
Операторы языка PHP
+ Сложение == Равно

- Вычитание != Неравно

* Умножение < Меньше


/ Деление > Больше
% Остаток
<= Меньше или равно
++ Инкремент
>= Больше или равно
-- Декремент
=== Эквивалентно
** Возведение в
степень !== Не эквивалентно
Побитовые и логические операторы

& Побитовое пересечение - И (AND) AND Логическое И

| Побитовое объединение - ИЛИ (OR) OR Логическое ИЛИ

^ Побитовое исключающее ИЛИ (XOR) ! Логическое отрицание

~ Побитовое отрицание (NOT)

<< Сдвиг влево

>> Сдвиг вправо

$a <=> $b - возвращает число меньше, больше или равное нулю, когда $a


соответственно меньше, больше или равно $b
Операторы циклов и ветвления
Оператор Действие

for ( выражение 1; выражение 2; выражение 3 ) Цикл с переменной


оператор

foreach($array as [$key =>] $vaIue) оператор Цикл по ассоциативному массиву

while (выражение) оператор Цикл с предусловием

do оператор while (выражение) Цикл с постусловием

if(выражение) оператор Условное выполнение

switch (выражение) оператор Оператор выбора

break Завершение цикла и выбора switch.

continue Переход на повторение цикла.


Перебор ассоциативного массива
Цикл последовательно обходит элементы массива $array с первого до последнего,
помещая на каждой итерации цикла ключ в переменную $key, а значение - в пере-
менную $value.
Переменная $key для ключа массива необязательна.

$arr = [ foreach ($arr as $key => foreach ($arr as $value)


'first' => 'Яблоко', $value) print "$value <br>";
'second' => ' Груша ', print "$key = $value ";
'third' => 'Слива'
];

Для того, чтобы напрямую изменять элементы массива внутри цикла, переменной
$value должен предшествовать знак &. В этом случае значение будет присвоено по
ссылке.
3.3 Язык описания стилей CSS
CSS является аббревиатурой от английского Cascading Style Sheets, что в
переводе на русский значит "каскадные таблицы стилей".

В настоящее время CSS - это развитый инструмент верстки сайта и обычно


используется верстальщиками.

Программисту необходимо знать только основы CSS.

Официальный сайт CSS:


https://www.w3.org/Style/CSS/Overview.ru.html
Базовый синтаксис CSS
Язык HTML отвечает на вопрос: “Что это?”
Язык CSS отвечает на вопрос: “Как это отобразить?”

CSS - это набор конструкций следующего вида:


селектор {свойство: значение;}

Существуют три варианта применения CSS

1. В теге HTML
<body style = "background-color: #FF0000;">
2. В заголовке страницы
<style>
body { background-color: #FF0000; }
</style>
Применение CSS к сайту
Третий и рекомендуемый способ использования CSS - это единая таблица стилей
для всего сайта.

В этом случае в заголовке веб-страницы нужно указать ссылку на css-файл


<link rel="stylesheet" href="style.css" >

CSS-файл - это текстовый документ, который содержит описание стилей для всех
элементов сайта.

body { background-color: #FFCC66; }

h1 { color: #990000; background-color: #FC9804; }


Базовые стили CSS
При создании CSS рекомендуется использовать некоторый единый и простой стиль
отображения.

Иллюстрация того, как делать не надо:


https://badhtml.com

Можно не писать CSS самому, а использовать базовые стили CSS:


https://www.w3.org/StyleSheets/Core/
для этого нужно вставить строку
<link rel="stylesheet" href="http://www.w3.org/StyleSheets/Core/Modernist">
Доступно 8 основных стилей:
Chocolate, Midnight, Modernist, Oldstyle, Steely, Swiss, Traditional, Ultramarine
3.4 Основы верстки
Верстка сайта - это размещение элементов сайта согласно некоторому макету
сайта. Макет сайта обычно разрабатывается дизайнером.

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


от больших экранов до мобильных телефонов. И в разных браузерах: Firefox,
Opera, Safari, Google Chrome и Internet Explorer.

Поэтому нет единственного верного подхода к верстке. Как правило, верстка


требует принятия ряда решений, в которых участвует и программист сайта.

Посмотреть сайт на разных устройствах можно в сервисе


http://quirktools.com/screenfly/
Выбор верстки
Существует два вида верстки - табличная и блочная.

Преимущество табличной верстки - Блочная верстка отображается по


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

Также существует два вида реакции на размер экрана - фиксированная и


резиновая. Фиксированная верстка имеет или пустые поля, или горизонтальную
прокрутку, но выглядит так, как нарисовал дизайнер. Резиновая верстка
растягивается на весь экран.
Общий вид сайта
Шапка Случайный текст для заполнения:
https://ru.lipsum.com/

Меню

Левый Центр Правый


блок блок

Подвал
3.5 Работа со строками
В силу важности обработки строк при программировании сайта PHP содержит
большой диапазон средств работы со строками.

http://ru.php.net/manual/ru/book.strings.php

strlen - возвращает длину строки


int strlen ( string $string )

trim - удаляет пробелы (или другие символы) из начала и конца строки


string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )

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


многобайтовой кодировкой. Эти функции имеют префикс "mb_":
http://php.net/manual/ru/book.mbstring.php
Поиск в строке
substr - возвращает подстроку
string substr ( string $string , int $start [, int $length ] )
substr("abcdef", 2); // возвращает "cdef"
substr("abcdef", -2); // возвращает "ef"

strpos - возвращает позицию вхождения строки


int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

strrpos - возвращает позицию последнего вхождения строки


int strrpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

strstr - возвращает часть строки


string strstr ( string $haystack , mixed $needle [, bool $before_needle = FALSE ] )

substr_count - возвращает число вхождений подстроки


int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] )
Преобразование строки
number_format - возвращает строку, представляющее число в заданном формате
string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string
$thousands_sep = "," )

$n = 1234.56;
print number_format($n, 2, ".", " ");
1 234.56

strtolower - преобразует строку в нижний регистр


string strtolower ( string $string )
strtoupper - преобразует строку в верхний регистр
string strtoupper ( string $string )
Работа с URL
parse_url - возвращается массив из компонентов URL-адреса
mixed parse_url ( string $url [, int $component = -1 ] )
Возможные ключи в массиве:
scheme - например, http
host
port
user
pass
path
query - после знака вопроса ?
fragment - после знака решётки #
Если компонента нет, то значение элемента массива - NULL.
3.6 Работа с файлами
В целях безопасности многие провайдеры по умолчанию запрещают работу с
файлами в UNIX. Для включения работы с конкретным файлом выставить атрибуты
полного доступа.

Основные функции работы с файлами:


1. file_exists - проверка существования файла
2. fopen - открытие файла
3. fread - чтение из файла
4. fwrite - запись в файл
5. fclose - закрытие файла

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


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

if ( !file_exists("somefile.txt") ) exit("Указанный файл не существует");

$file = fopen ("somefile.txt", "r");


while ($line = fgets($file, 4096) )
{
$line.="\n";
print $line;
}
fclose ($file);
Глава 4. Основы MySQL
В основе большинства сайтов находится некоторая база данных (БД).
Например:
● Википедия - это база терминов.
● Booking - база отелей.
● Kinopoisk - база фильмов.
● Любой интернет-магазин - это база товаров.

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


управления базами данных (СУБД) MySQL.

Для подробного описания работы с базами данных рекомендую курс:


“Программирование баз данных на SQLite”.
4.1 Взаимодействие PHP и MySQL
MySQL – компактный многопоточный сервер БД. Это означает, что для каждого
посетителя создается свой процесс, который не зависит от других посетителей.
Обычно один сайт работает на одной БД.

Официальный сайт:
www.mysql.com
Расширение MySQL Improved
Важное замечание!

До четвертой версии MySQL в PHP использовалось расширение с названием MySQL.


Большинство книг по PHP/MySQL описывают именно это расширение.

Начиная с четвертой версии было предложено расширение MySQL Improved (MySQLi),


которое и рекомендуется к применению.

Описание расширения
http://php.net/manual/ru/book.mysqli.php

Отличить это расширение можно по символу “i” в конце функции.


Старое расширение - mysql_connect
Новое расширение - mysqli_connect
4.2 Язык запросов SQL
СУБД MySQL поддерживает язык запросов SQL.

Язык SQL предназначен для унифицированной работы с реляционными БД. В SQL не


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

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

Практический совет
Если некоторую функцию можно реализовать или в PHP, или через SQL-запрос, то
нужно учитывать, что SQL-запрос будет работать намного быстрее.
Схема работы с БД
Таблица “Сотрудники” Поле “Оклад”

Запись “Петров”
№ Фамилия Оклад Год рождения

1 Иванов 10000 1980

2 Петров 15000 1985

3 Сидоров 20000 1990

Таблица - это перечень сходных объектов. Например: “Сотрудники, отделы,


счета, товары”.
Запись - это строка таблицы, которая относится к одному объекту.
Поле - это столбец таблицы, который отражает одно свойство объекта.
Например: “Фамилия, оклад, год рождения”.
Простые SQL-запросы
Удалить таблицу “Сотрудники”, если она есть.

Создать таблицу “Сотрудники”


DROP TABLE IF EXISTS Сотрудники; с тремя полями.
CREATE TABLE Сотрудники(`N`,`Фамилия`,`Оклад`);

INSERT INTO Сотрудники (`N`,`Фамилия`,`Оклад`) Добавить записи.


VALUES ('1', 'Иванов', '35000'),
('2', 'Петров', '40000'),
('3', 'Сидоров', '45000');
Получить набор записей из
SELECT * FROM Сотрудники; таблицы.
Использование кириллицы в БД
Начиная с MySQL 5.0 использование кириллицы в именах объектов БД MySQL
допустимо. Но это может вызвать сложности с библиотеками и утилитами
сторонних разработчиков.

Если в проекте планируется их использовать, то нужно писать имена объектов БД


латиницей.

Для использования кириллицы нужно задавать кодировку “utf8” и способ сравнения


“utf8_general_ci”.

SELECT Фамилия, Оклад SELECT Employee, Salary


FROM Сотрудники FROM Employees
WHERE Оклад > 30000 WHERE Salary > 30000
4.3 Менеджер БД phpMyAdmin
Для работы с БД используются так называемые менеджеры БД. Самым
популярным менеджером для MySQL является phpMyAdmin. Он установлен
практически на любом хостинге.

Официальный сайт:
www.phpmyadmin.net

В сборке uWamp данные для


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

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


В этом файле задаются параметры подключения к БД.

При переносе сайта на хостинг этот файл не копируется.

$db = mysqli_connect(
'localhost', // Хост (если серверы php и mysql на одном ПК, то localhost)
'user', // Имя пользователя
'password', // Пароль
'test'); // Имя БД
4.4 Реляционные базы данных
Реляционные базы данных - это БД, в которых таблицы связаны через ключевые
поля.

Код товара Товар Цена Код Код Группа Менеджер


группы группы

1 Телевизор 20000 1 1 Электроника Иванов

2 Холодильник 45000 2 2 Бытовая Петров


техника
3 Диктофон 5000 1
Работа с ключами
Код Отдел Руководитель
группы

1 Электроника Иванов
Первичный Вторичный Внешний
ключ ключ ключ 2 Бытовая Петров
техника

Код товара Товар Цена Код


группы

1 Телевизор 20000 1

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

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


Служебное поле
Рекомендуется для любой таблицы создавать служебное поле. Оно начинается со
слова “Код..” и имеет параметры:
AUTO_INCREMENT - автоматическое увеличение значения
PRIMARY KEY - указание, что это первичный ключ.

Служебные поля не отображаются на сайте и требуются только работы со


связанными таблицами.
Получение данных из связанных таблиц
Если таблицы связаны, то можно выполнить соединение таблиц по ключевому полю.

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

Товары.`Товар`

Соединение JOIN включает запрос только те поля, где данные совпадают.

SELECT Товары.`Товар`, Товары.`Цена`, Группы.`Группа`


FROM Товары JOIN Группы
ON Товары.`Код группы` = Группы.`Код группы`
4.5 Работа с объектами MySQL
Работа со структурой БД:
CREATE - создает объект БД (базу, таблицу, индекс и т.д.)
DROP - удаляет объект.
ALTER - изменяет объект.

Работа с данными:
SELECT - выборка данных
INSERT – вставка новых записей
UPDATE – обновление записей
DELETE – удаление записей
Типы данных
Тип Описание

INT Целое число

TINYINT Маленькое целое число (-127 до 128 или от 0 до 255)


FLOAT Вещественное число с плавающей точкой

DATE Дата. Отображается в виде ГГГГ-ММ-ДД


TIME Время. Отображается в виде ЧЧ:ММ:СС
DATETIME Дата и время. Отображается в виде ГГГГ-ММ-ДДЧЧ:ММ:СС
YEAR[(2|4)] Год. Можно определить двух- или четырехциферный формат
CHAR(M) Строка фиксированной длины М (M<=255)
VARCHAR(M) Строка произвольной длины до М (M<=255)
TEXT Длинные текстовые фрагменты (<=65535)
BLOB Большие двоичные объекты (изображения, звуки)
Оператор SELECT
Самый популярный оператор языка SQL -
это оператор SELECT.

Общий вид оператора:


SELECT Фамилия, Оклад
FROM Сотрудники
WHERE Оклад > 30000
ORDER BY Оклад

Оператор SELECT возвращает набор


записей из БД в соответствии с
заданными критериями. Вывод всей
таблицы выглядит так:
SELECT * FROM Сотрудники
Группировка данных
В SQL существуют функции для работы с группой данных.
Часто используемые:

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


COUNT - количество значений в этом столбце.
MIN - минимальное значение в столбце.
МАХ - максимальное значение в столбце.
SUM - сумма значений в столбце.

SELECT
SUM(Оклад) AS Сумма,
AVG(Оклад) AS [Средний оклад]
FROM Сотрудники
Постраничный вывод
Оператор LIMIT задает максимальное число возвращаемых записей. Может
использоваться с оператором OFFSET для указания сдвига первого значения.

SELECT *
FROM Товары
LIMIT 5 OFFSET 5
Оператор INSERT
Оператор INSERT вставляет новые строки в таблицу.

INSERT INTO <имя таблицы>[(<имя столбца>,...)]


{VALUES (< значение столбца>,…)}
| <выражение запроса>
| {DEFAULT VALUES};

INSERT INTO Сотрудники(Фамилия, Оклад) VALUES('Иванов',20000);


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

UPDATE <имя таблицы>


SET {имя столбца = {выражение для вычисления значения столбца
| NULL
| DEFAULT},...}
[ {WHERE <предикат>}];
При отсутствии предложения WHERE будут обновлены все строки таблицы!

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

UPDATE Сотрудники
SET Оклад = 50000
WHERE [Код сотрудника]=1
Оператор DELETE
Оператор DELETE удаляет записи из таблицы:

DELETE FROM <имя таблицы > [WHERE <предикат>];

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

DELETE FROM Выплаты


WHERE Год = 2018
Перенаправление на страницу
Часто требуется выполнить скрипт и перейти на другую страницу сайта. Для
этого служит функция header.

Она работает для внутренних страниц сайта, ее нельзя использовать для


внешних сайтов.

http://php.net/manual/ru/function.header.php

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

header("Location: ".$_SERVER['HTTP_REFERER']); // Возврат на страницу


4.6 Работа с датой и временем
Для работы с датой и временем в PHP существует множество функций:
http://php.net/manual/ru/ref.datetime.php

Для получения текущей даты и времени в PHP существует функция time().


Она возвращает количество секунд, прошедших с начала эпохи Unix (1 января
1970 00:00:00 GMT) до текущего времени.

Для вывода текущей даты и времени существует функция date(). Она


форматирует вывод даты с помощью специальных символов.
http://php.net/manual/ru/function.date.php

date("d.m.y"); // 20.12.18
date("Y-m-d H:i:s"); // 2018-12-20 11:17:19 (формат MySQL DATETIME)
Обращение к элементам времени
Функция getdate() возвращает ассоциативный массив (array), содержащий
информацию о дате и времени.

http://php.net/manual/ru/function.getdate.php

$today = getdate(); // получение массива даты и времени

print_r($today); // вывод всего массива


printf ("<h3>Текущий год - %d</h3>", $today['year']); // вывод только года
Дата и время в MySQL
В MySQL есть два вида хранения даты и времени: DATETIME и TIMESTAMP.

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


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

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


января 1970-го года. Рекомендуется для ситуаций, где важен часовой пояс,
например, дата и время обращения к сайту.

Тип TIMESTAMP автоматически записывает текущую дату и время при


выполнении операций INSERT или UPDATE. При наличии нескольких столбцов
типа TIMESTAMP только первый из них обновляется автоматически.
Функции MySQL для работы с датами
Для работы с датами и временем MySQL имеет множество функций:
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

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


SELECT CURDATE();
SELECT CURTIME();

Для вывода даты используется функция DATE_FORMAT()


SELECT DATE_FORMAT('2018-12-31', '%d.%m.%Y'); // 31.12.2018
SELECT DATE_FORMAT('2018-12-31', '%d %M %Y'); // 31 December 2018
Глава 5. Работа с посетителями сайта
Есть популярный мем: “В Интернете никто не знает, что ты собака”. Для
большинства людей - это шутка, а для PHP-программистов - это иллюстрация
реальной проблемы.
5.1 Как анализировать посетителя сайта
Посетителями сайта могут быть:
1. Хакеры - с целью взломать сайт.
2. Боты - программы для сбора данных.
3. Случайные посетители - посетители, которым сайт не интересен.
4. Целевые посетители - именно для них и делается сайт.
5. Покупатели - посетители, благодаря которым сайт существует.

Программист сайта должен уметь анализировать посетителей и менять


поведение скрипта в зависимости от категории посетителей.
Данные сервера
Суперглобальная переменная $_SERVER - это массив, содержащий
информацию передаваемую веб-сервером.

http://php.net/reserved.variables.server

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


поведение посетителей. Обычно такая статистика называется “лог сайта”.

Также логи сайта предоставляет хостер.


5.2 Хранение данных о посетителе
У HTTP-протокола есть особенность: когда клиент посылает запрос, то сервер
выдает HTML-документ и прекращает соединение.
Преимущество - это ускоряет процесс.
Недостаток - сервер сразу “забывает” о клиенте и следующий запрос того же
клиента обрабатывает как запрос нового клиента. Это делает невозможным,
например, формирование покупательской корзины.

Клиент Сервер БД

Запрос

Ответ

Куки Сессия Регистрация


Методы хранения данных
Существует три основных метода хранения данных о посетителе:
1. Куки (cookie - печенье) - данные, которые записываются на ПК клиента.
2. Сессии (session) - данные, которые записываются на стороне сервера.
3. Регистрация посетителя - хранение логина и пароля в базе MySQL.

Ни один из этих методов не решает проблему на 100%.


● Куки могут быть запрещены в браузере или удалены.
● Сессии заканчиваются при выходе из браузера.
● Логин и пароль могут быть украдены.
Работа с куки
Куки - это команда HTTP-протокола браузеру о сохранении данных во время
отображения веб-страницы. Куки - это набор пар: “имя”-“значение”. Браузер
сохраняет куки при посещении сайта и предоставляет их при следующем
посещении сайта.

Установка куки
setcookie("name", "Вася"); // Хранится до закрытия браузера.
setcookie("test 1", "куки на час", time() + 3600); // 3600 - количество секунд в часе

Получение куки
print 'Привет, ' . htmlspecialchars($_COOKIE["name"]) . '!';

Удаление куки
setcookie("name");
Недостатки куки
Использование куки недостаточно для серьезной работы:
● Ограничение по формату: можно сохранить только пару: имя и значение.
● Ограничение по использованию: куки легко запретить и стереть.
● Низкая безопасность: куки легко посмотреть и подменить.

Также куки подпадают под действие законов Европейского Союза:


https://www.cookielaw.org/the-cookie-law/

В России достаточно уведомления в Правилах сайта о том, что вы используете


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

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


1. Запуск сессии
2. Установка значений переменных сессии
3. Использование переменных
4. Отмена переменных
5. Закрытие сессии.
Запуск сессии
Для запуска сессии используется функция session_start(). Эта функция
проверяет, существует ли идентификатор сессии.
Если его нет, то создается, если он есть, то она загружает зарегистрированные
переменные.
Сервер отправляет на ПК пользователя куки с именем PHPSESSID. Если куки
запрещены, то PHPSESSID передается в адресе.
Также эта функция генерирует во временном каталоге файл для хранения
переменных сессии.

Данная функция должна присутствовать на любой странице, которая работает


с зарегистрированными пользователями. Вызов этой функции должен быть в
самом начале страницы (до <html>).
<? session_start(); ?>
<html>
Регистрация переменных сессии
Для хранения переменных сессии используется массив $_SESSION..
$_SESSION['user'] = 'Вася';

После регистрации эта переменная доступна на любой странице,


использующей сессию.

Вывести все переменные сессии можно командой:


print_r($_SESSION);

Все функции для работы с сессиями можно посмотреть здесь:


https://secure.php.net/manual/ru/ref.session.php
Закрытие сессии
Для отмены регистрации переменных используется функция
unset($_SESSION['user']);

Для отмены всех переменных сессии используется функция session_unset().

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


закрытия сессии используется функция session_destroy(). Так как мы не знаем,
где посетитель захочет закончить работу с сайтом, то рекомендуется эту
функцию выполнять по специальной ссылке «Выход».
5.4 Регистрация посетителей
При работе с посетителями нужно различать два процесса:
● аутентификация,
● авторизация.

Аутентификация - это процесс проверки подлинности посетителя. То есть, в


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

Авторизация - это предоставление прав на определенные действия. Если


человек «авторизован» - это значит, что мы предоставили ему права. Этот
процесс прост: если выполняется некоторое условие, то действие разрешено.
Приемы аутентификации
Двойная авторизация
1. Сначала посетитель вводит логин и пароль.
2. Ему высылается код (посредством Email или SMS), который он должен
ввести.

Хранение дополнительных данных


В базе сохраняется такие данные как IP, браузер, время входа и т.д. На
основании этих данных принимается решение об аутентификации.
Шифрование паролей
В большинстве случаев для аутентификации используется проверка “логин-
пароль”.

Хранить и обрабатывать пароли в открытом виде нельзя. Это легко можно


взломать. Для хранения паролей используется шифрование. Существует
несколько методов шифрования. На данный момент PHP рекомендует
использовать “хэширование паролей”.

Хэширование - это выполнение определенного алгоритма над строкой, в


результате которого получается другая строка, которая называется “хэш”. Нет
алгоритма, по которому имея хэш, можно получить исходную строку.

Поэтому в БД хранятся не пароли, а их хэши.


Хэширование паролей
Для хэширования используются следующие функции
password_hash() - используется для хэширования пароля.
password_verify() - используется для проверки пароля на соответствие хэшу.
Рекомендуется для для хранения хэшей выделять 255 символов, хотя на
данный момент хэш имеет длину 60 символов.
http://php.net/manual/ru/book.password.php

// Получаем хэш
$hash = password_hash("secretword", PASSWORD_DEFAULT);
// Проверяем хэш
if (password_verify('secretword', $hash))
print 'Пароль правильный!';
else
print 'Пароль неправильный!';
Использование “соленых” паролей
Существует метод взлома хэшей по “словарю”. В этом случае создаются
“радужные” таблицы, в которых содержатся самые распространенные пароли и
их хэши.

В этом случае взлом хэшей занимает немного времени.

Для защиты от взлома по словарю в пароль добавляют так называемую “соль”


- случайный набор символов. То есть шифруется строка “пароль+соль”. Даже
если взломать пароль по словарю, то пароль будет неверен. Функции
password_hash() и password_verify() используют “соленые” пароли.
5.5 Организация работы с паролями
На практике устоялась некоторая общая схема организации работы с
паролями, которая применяется на многих сайтах.

Она включает следующие функции:


1. Регистрация пользователя с выбором логина и пароля.
2. Вход по паролю в защищенную область сайта.
3. Выход из защищенной области.
4. Пользователи должны иметь возможность менять пароль.
5. Должна быть возможность высылки пароля по почте. Для этого
генерируется новый пароль.
Схема работы с паролями

Вход в систему
login.php

Регистрация Забыли пароль?


register.php forget.php

Работа в системе
index.php

Смена пароля Выход


changepass.php exit.php
5.6 Администрирование сайта
Для управления сайтом обычно создают специальный раздел, куда имеет
доступ только администратор сайта.

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


Например, в панели администрирования WordPress можно задать следующие
уровни доступа:
● Администратор - имеет полный доступ.
● Редактор - управляет содержанием сайта, но не пользователями.
● Автор - может править только свой текст.
● Участник - может писать статьи и отправлять на утверждение
● Подписчик - может править только свой профиль.
Панель администрирования
Обычно панель администрирования имеет свою папку (например, admin) и, по
сути, представляет собой отдельный сайт.

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


Прочие пользователи с правами доступа к панели администрирования
создаются уже администратором.
Глава 6. Графическая библиотека GD
Библиотека GD (Graphics Draw) - это библиотека с открытым исходным кодом
для динамической работы с графикой. Библиотека написана на C, поэтому
очень быстро работает. Поддерживает форматы: PNG, JPEG, GIF, WebP, XPM,
BMP. Обычно используется для генерации диаграмм, графики, миниатюр и
всего остального в момент генерации веб-страницы.

Официальный сайт: https://libgd.github.io/


Документация: http://php.net/manual/ru/book.image.php
6.1 Проверка наличия GD
Для получения информации о GD существует функция gd_info(), которая
возвращает ассоциативный массив с настройками.

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


текста.
<pre>
<?php print_r(gd_info()); ?>
</pre>

Необходимо проверить, что версия библиотеки не ниже второй:


[GD Version] => bundled (2.1.0 compatible)
Рекомендуемый формат для веб - это формат PNG, в списке настроек должна
быть строка:
[PNG Support] => 1
Использование GD
GD - поддерживает динамический подход к графике. Это означает, что для
рисования не обязательно иметь графический файл. На веб-странице
указывается ссылка на изображение в виде php-файла. Изображение
формируется “на лету” и отображается в браузере.

Ссылка на динамическое изображение:


<img src="pic1.php">

В файле pic1.php формируется картинка:


<?php
header("Content-type: image/png"); // Устанавливаем тип изображения
...
?>
Левый верхний угол имеет координаты 0, 0.
Минимальный скрипт GD
<?php
header("Content-type: image/png"); // Устанавливаем тип изображения
$pic = ImageCreateTrueColor(300, 200) // Создаем новую картинку 300x200

$red = ImageColorAllocate($pic, 255, 0, 0); // Устанавливаем красный цвет


ImageFill($pic, 0, 0, $red); // Заливаем область выбранным цветом
ImagePNG($pic); // Передаем изображение в браузер

ImageDestroy($pic); // Освобождаем память


?>

Другой вариант задания цвета:


ImageFill($pic, 0, 0, 0x000080);
6.2 Графические примитивы
// Точка
ImageSetPixel(pic, x, y, color )

// Линия
ImageLine ( pic, x1, y1, x2, y2, color )

// Прямоугольник
ImageRectangle (pic, x1, y1, x2, y2, color )
ImageFilledRectangle (pic, x1, y1, x2, y2, color )

// Эллипс
ImageEllipse(pic, x, y, width, height, color)
ImageFilledEllipse(pic, x, y, width, height, color)
6.3 Текст и трансформации
Для вывода текста служат функции:
ImageString() - вывод горизонтального текста
ImageStringUp() - вывод вертикального текста

ImageString ( resource $image , int $font , int $x , int $y , string $string , int $color )

Эти функции используют встроенные шрифты $font, которые обозначаются


номерами 1, 2, 3, 4, 5 и имеют кодировку latin2.

Координаты x и y - это координаты верхнего левого угла символа.


Использование кириллицы
Для вывода текста с кириллицей нужно загрузить бесплатные шрифты Google
Fonts.
https://fonts.google.com/

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


array ImageTtfText ( resource $image , float $size , float $angle , int $x , int $y , int
$color , string $fontfile , string $text )

Координаты x и y - это координаты левого нижнего угла символа.

fontfile - это имя файла шрифта с кириллицей


Размер и поворот текста
Для указания размера и угла поворота служат аргументы float $size и float
$angle.

Функция ImageTtfText возвращает массив из 8 элементов, представляющих 4


точки - координаты углов рамки обрамляющей текст. Точки представлены в
таком порядке: левый нижний угол, правый нижний, верхний правый, верхний
левый.

Для расчета рамки, обрамляющей текст, служит функция


array ImageTtfbBox ( float $size , float $angle , string $fontfile , string $text )
6.4 Работа с графическими файлами
Для вывода графического файла используются функции:
ImageCreateFromPng($filename) - создания холста из файла
ImageSaveAlpha($pic, TRUE) - сохранение альфа-канала
ImageAlphaBlending($pic, FALSE) - режим сопряжения изображения
LoadPNG($filename) - вывод файла PNG

Для получения размеров изображения используется функция:


array GetImageSize(string $filename)
Изменение размера
Для изменения размера изображения используется функция:
bool imagecopyresampled ( resource $dst_image, resource $src_image, int $dst_x,
int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h )

Эта функция копирует прямоугольную часть одного изображения на другое


изображение с сохранением качества изображения.
6.5 Трансформация изображений
Функция ImageCopyResampled также может использоваться для обрезки
изображений (crop).

Для поворота изображения используется функция ImageRotate.

Для зеркального отражения используется функция ImageFlip.


Могут быть заданы следующие параметры:

IMG_FLIP_HORIZONTAL По горизонтали.
IMG_FLIP_VERTICAL По вертикали.
IMG_FLIP_BOTH По горизонтали и вертикали.
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 )

Она копирует часть src_im и помещает скопированное на dst_im,


начиная с координат src_x, src_y с шириной src_w и высотой src_h.
Скопированная часть помещается на координаты dst_x и dst_y.

Параметр pct может варьироваться от 0 до 100. Когда pct = 0, наложения


не происходит.
Нанесение водяных знаков
Существует несколько способов нанесения водяных знаков на
изображение.

Два наиболее распространенных:


● нанесение полупрозрачной картинки с именем сайта
● надпись с именем сайта
Глава 7. Разработка веб-сервиса
В качестве примера веб-сервиса разработаем сервис хранения
визуальных закладок сайтов.

Пример успешного стартапа.

Джошуа Шахтер 24 сентября 2003 года создал сервис хранения закладок


Delicious.

9 декабря 2005 сервис был куплен компанией Yahoo. Сделку оценивают


в 15-30 млн долларов США. Позже сервис был закрыт.
7.1 Регистрация на хостинге
Начинать веб-проект нужно сразу с проверкой на хостинге, чтобы любые
проблемы проявились еще на этапе проектирования.

Для платного хостинга я рекомендую хостинг https://handyhost.ru/, так как


уже для самых дешевых тарифов предоставляется панель управления
ISPmanager.

Для бесплатного хостинга рекомендую хостинг Beget.


https://beget.com/ru/free-hosting
7.2 Знакомство с хостингом
После регистрации вы получите логин и пароль к личному кабинету.
Сохраните их в менеджере паролей keepass.
Разделы панели управления
Работа с сайтом происходит в панели управления. Основные разделы:
● Файловый менеджер
● MySQL
Порядок работы с хостингом
1. Создать БД
Панель управления - MySQL

2. Проверить работу phpMyAdmin

3. Перенести файлы проекта в папку


public_html

4. В файле start_mysql.php изменить


логин, пароль и имя базы данных.
7.3 Перенос проекта на хостинг
Для загрузки проекта нажмите на иконку “Загрузить файлы” и выберите
папку “Site28”.
Подготовка базы данных
Нажмите на иконку “Новая папка” и создайте папку “Pics”

Зайдите в файл start_mysql.php

В строке
$db = mysqli_connect("localhost","root","root","test");
внесите изменения:
"root" - замените на имя БД,
"root" - замените на пароль к БД,
"test" - замените на имя БД.
Создание таблиц
Зайдите в файл index.php

В строке
//InitDB();
уберите знаки комментария “//”

Перейдите на сайт. Убедитесь, что все таблицы созданы.

После этого зайдите в файл index.php и удалите строку


InitDB();
7.4 Реализация проекта
Проектирование сервиса начинается с описания таблиц базы данных.

Мы будем использовать три таблицы:


Закладки(Код закладки, Закладка, Адрес, Скриншот, Код клиента, Код
группы)
Группы (Код группы, Группа, Код клиента)
Клиенты ( Код клиента, Логин, Пароль, Доступ, Регистрация)
7.5 Развитие проекта
Множество веб-проектов остаются незамеченными и поэтому не
приносят никакой пользы. Поэтому не следует тратить много усилий на
разработку сервиса до тех пор, пока сервисом не начнут пользоваться.

По этой же причине лучше начинать с бесплатного аккаунта.

Общий подход к развитию сервиса


1. Предложить минимальный функционал и посмотреть на реакцию
посетителей.
2. Внимательно смотреть статистику посещений и востребованные
функции.
3. Добавлять функционал постепенно и просить отзывы посетителей.
7.6 Развитие профессионализма
Разработка сайтов - это очень динамичная сфера. Постоянно появляются
новые идеи. Взлетают стартапы. Рынок постоянно меняется.

В этих условиях важно не долго готовиться и учиться, а сразу идти в


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

Рекомендуемые шаги:
1. Сделать бесплатный сервис.
2. Смотреть статистику и отзывы.
3. Добавить платные функции.

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


выполнению коммерческих заказов.
Пути развития PHP-программиста
1. Сделать стартап
Многие миллиардные проекты делались энтузиастами, а затем набирали
множество поклонников.

2. Делать плагины для известных сайтов


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

3. Писать веб-приложения на заказ


Спрос огромный. Разработчиков практически нет.

4. Работать по найму
Здесь многое зависит от нанимателя. Следите, чтобы проект был
современный. Тогда вы можете многому научиться.