Uploaded by Виктор Николаевич Данин

LabR PM.02 MDK.02.04

advertisement
Министерство образования и науки Российской Федерации
федеральное государственное бюджетное
образовательное учреждение высшего образования
«Российский экономический университет имени Г. В. Плеханова»
Московский приборостроительный техникум
УТВЕРЖДАЮ
Заместитель директора
по учебной работе
_______________ /Д.А. Клопов/
«31» августа 2017 г.
ВАРИАНТЫ ЗАДАНИЙ
ЛАБОРАТОРНЫХ РАБОТ
По МДК: МДК 02.04 Сетевые языки
Специальность: 09.02.02 «Компьютерные сети»
Форма проведения: лабораторная работа
Составил:
Вилков А.Н., преподаватели ФГБОУ ВО РЭУ им. Г.В. Плеханова
РАССМОТРЕНО
На заседании цикловой методической комиссии ПМ 09.02.02 и 09.02.06
Протокол № 1-17/18 КС от «31» августа 2017 г.
Предметом оценки служат умения и знания, предусмотренные ФГОС по
МДК: «Сетевые языки», направленные на формирование общих и
профессиональных компетенций.
В результате выполнения лабораторных работ по учебной дисциплине
осуществляется комплексная проверка нижеследующих умений и знаний.
Таблица 1
Результаты обучения: умения, знания
Уметь:
-
администрировать локальныевычислительные сети;
принимать меры по устранению возможныхсбоев;
устанавливать информационную систему;
создавать и конфигурировать учетные записиотдельных пользователей и
пользовательских групп;
регистрировать подключение к домену, вестиотчетную документацию;
рассчитывать стоимость лицензионногопрограммного обеспечения сетевой
инфраструктуры;
устанавливать и конфигурироватьантивирусное программное обеспечение,
программное обеспечение баз данных,программное обеспечение мониторинга;
обеспечивать защиту при подключении кинформационнотелекоммуникационной сети"Интернет" (далее - сеть Интернет) средствами
операционной системы;
Знать:
-
основные направления администрирования
компьютерных сетей;
типы серверов, технологию "клиент-сервер";
способы установки и управления сервером;
утилиты, функции, удаленное управление сервером;
технологии безопасности, протоколы авторизации, конфиденциальность и
безопасность при работе в web;
порядок использования кластеров;
порядок взаимодействия различных операционных систем;
алгоритм автоматизации задач обслуживания;
порядок мониторинга и настройки производительности;
технологию ведения отчетной документации;
классификацию программного обеспечения сетевых технологий, и область его
применения;
порядок и основы лицензирования программного обеспечения;
оценку стоимости программного обеспечения в зависимости от способа и
места его использования.
Время выполнения работ
Лабораторные задания выполняются с использованием реального
оборудования и содержат 40 работ, рассчитанные на всю дисциплину.
Критерии оценки
-
срок выполнения работы;
качество выполнения работы;
защита отчета.
Перечень лабораторных работ
Всего (80 часов)
1. Создание базовой страницы. (2 часа)
2. Таблицы HTML. (2 часа)
3. Размещение графики на странице. (2 часа)
4. Форматирование страницы на основе CSS. (2 часа)
5. Разметка страницы на основе блоков CSS. (2 часа)
6. Установка web-сервера Apache2 и модуля PHP. (2 часа)
7. Переменные и операторы PHP. (2 часа)
8. Условные операторы и циклы PHP. (2 часа)
9. Массивы PHP. (2 часа)
10. Ассоциативные массивы PHP. (2 часа)
11. Функции PHP. (2 часа)
12. Работа с файлами в PHP. (2 часа)
13. Работа с файловой системой в PHP. (2 часа)
14. Формы HTML. (2 часа)
15. Обработка формы в PHP. (2 часа)
16. Создание калькулятора на PHP. (2 часа)
17. Загрузка файла в PHP. (2 часа)
18. Загрузка нескольких файлов в PHP. (2 часа)
19. Cookie и сессии PHP. (2 часа)
20. Создание класса в PHP. (2 часа)
21. Создание производного класса в PHP. (2 часа)
22. Создание интерфейса в PHP. (2 часа)
23. Получение данных из БД MySQL. (2 часа)
24. Добавление данных в БД MySQL. (2 часа)
25. Изменение данных в БД MySQL. (2 часа)
26. Добавление и получение данных из MySQL. (2 часа)
27. Создание формы редактирования объекта. (2 часа)
28. Работа с cookiees из PHP. (2 часа)
29. Работа с сессиями из PHP. (2 часа)
30. Создание механизамааутентификаии на PHP. (2 часа)
31. Создание формы редактирования списка объектов. (2 часа)
32. Создание класса в PHP. (2 часа)
33. Создание производного класса в PHP. (2 часа)
34. Создание базового класса формы. (2 часа)
35. Создание класса формы добавления данных. (2 часа)
36. Создание класса формы обновления данных. (2 часа)
37. Создание интерфейса в PHP. (2 часа)
38. Получение данных из БД MongoDB. (2 часа)
39. Добавление данных в БД MongoDB. (2 часа)
40. Изменение данных в БД MongoDB.(2 часа)
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 1
«Создание базовой страницы»
(время на выполнение - 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
1. Цель работы.
В процессе выполнения практической работы необходимо изучить и научиться
применять основные HTML теги для создания простых Web-страниц.
2. Теоретические сведения.
О языке HTML.
HTML не является языком программирования, он предназначен для разметки
текстовых документов (т.е. с помощью него мы размечаем текст, таблицы, картинки и т.д.
на нашей странице). То, как будут выглядеть картинки, текст и другие элементы на вашей
странице, и как они будут располагаться относительно друг друга, определяют метки (tags
или теги). Все, что находится между <tags>- это тег.
Таблица 1.
Главные теги HTML
Название
<html>…</html>
<head>…</head>
<body>…</body>
Описание
Является контейнером, который заключает
в себе все содержимое веб-страницы
Предназначен для хранения элементов, цель
которых - помочь браузеру в работе с
данными.
Предназначен для хранения содержания
веб-страницы, отображаемого в окне
браузера. Информацию, которую следует
выводить в документе, следует располагать
именно внутри тела.
Основные правила расположения тегов:
1. Только такая очередность закрывающих тегов верна: тег, который мы открыли
первым - закрываем последним, второй – предпоследним и т.д.
<tags1><tags2><tags3> ... </tags3></tags2></tags1>
2. К одному фрагменту текста может применяться сразу несколько тэгов.
<tt><b><i>текст</i></b></tt>
Создание HTML-документа:
1. Создать каталог для дальнейших файлов Web-страницы.
2. Открыть текстовый редактор «Блокнот» и набрать следующий текст:
3. Сохранить документ названием index.html (Открыть меню Файл - Сохранить как,
затем указать имя файла index и указать расширение .html);
4. Открыть получившийся файл в браузере.
Работа с текстом.
Заголовки.
HTML предлагает шесть заголовков разного уровня, которые показывают
относительную важность секции, расположенной после заголовка. Так, тег <h1>
представляет собой наиболее важный заголовок первого уровня, а тег <h6> служит для
обозначения заголовка шестого уровня и является наименее значительным. По
умолчанию, заголовок первого уровня отображается самым крупным шрифтом жирного
начертания, заголовки последующего уровня по размеру меньше. Теги <h1>…<h6>
относятся к блочным элементам, они всегда начинаются с новой строки, а после них
другие элементы отображаются на следующей строке. Кроме того, перед заголовком и
после него добавляется пустое пространство.
Упражнение 1
1. Выделить заголовком 1-го уровня предложение «Это моя первая страница» при
помощи тега <h1>;
2. Теперь выделить это же предложение заголовком 3-го уровня при помощи тега
<h3>;
3. Попробовать применение всех типов заголовков;
4. Выполните перенос строки с помощью тега <br>.
Текстовый абзац и строка.
Тег <p>…</p> определяет текстовый абзац. Тег <p> является блочным элементом,
всегда начинается с новой строки, абзацы текста идущие друг за другом разделяются
между собой отбивкой. Величиной отбивки можно управлять с помощью стилей. Если
закрывающего тега нет, считается, что конец абзаца совпадает с началом следующего
блочного элемента.
Тег <span> предназначен для определения строчных элементов документа. В
отличие от блочных элементов, таких как <p> и других, с помощью тега <span> можно
выделить часть информации внутри других тегов и установить для нее свой стиль.
Например, внутри абзаца (тега <p>) можно изменить цвет и размер первой буквы, если
добавить начальный и конечный тег <span> и определить для него стиль текста.
Упражнение 1.2
1. Наберите произвольный текст (минимум 40 символов) с использованием тега
<p>…</p>;
2. Далее наберите ещё раз произвольный текст (минимум 20 символ) с
использованием тега <p>…</p>;
3. Наберите текст (около 15 символов, верхнем регистром) с использованием тега
<span>…</span>;
4. Сравните разницу в использование тегов.
Форматирование текста.
Для форматирования текста используются следующие теги:
Таблица 2.
Название
<b>…</b>
Описание
Устанавливает жирное начертание шрифта.
Устанавливает курсивное начертание
<i>…</i>
шрифта.
<u>…</u>
Добавляет подчеркивание к тексту.
<s>…</s>
Отображает текст как перечеркнутый
Увеличивает размер шрифта на единицу по
<big>…</big>
сравнению с обычным текстом.
Уменьшает размер шрифта на единицу по
<small>…</small>
сравнению с обычным текстом.
Отображает шрифт в виде верхнего
индекса. Шрифт при этом отображается
<sup>…</sup>
выше базовой линии текста и
уменьшенного размера.
Отображает шрифт в виде нижнего индекса.
Текст при этом располагается ниже базовой
<sub>…</sub>
линии остальных символов строки и
уменьшенного размера.
Допустимо использовать эти тег совместно с другими тегами, которые определяют
начертание текста.
Упражнение 1.3
1. Выполнить форматирование текста базовыми тегами. Применять перенос строк;
2. Добавить текст «Верхний индекс» и вывести данный текст верхним индексом при
помощи тега <sup>;
3. Добавить текст «Нижний индекс» и вывести данный текст нижним индексом при
помощи тега <sub>;
Изображения.
Добавление изображения на страницу.
<img> - тег предназначен для отображения на веб-странице изображений в
графическом формате GIF, JPEG или PNG. В атрибуте src, в двойных кавычках,
указывается путь к Вашему изображению относительно папки с Web-страницей, где это
изображение будет выведено.Необходимо учитывать регистр и названия файла и его
расширения.Не допускается использования любых цифр, пробелом и имён на кириллице в
название файлов. Так же полный путь к картинке прописывать не надо.
Упражнение 2.1
1. Создать в папке с вашей основной Web-страницей папку с названием «img» для
хранения изображений;
2. Скопировать небольшое в размерах изображение (не более 500 пикселей в ширину
и высоту) в папку «img»;
3. Вставьте картинку на страницу при помощи тега <img>.
Атрибуты для тега <img>.
Align.
Для изображений можно указывать их положение относительно текста или других
изображений на веб-странице. Способ выравнивания изображений задается атрибутом
align.
Таблица 3.
Название
top
right
bottom
left
middle
Описание
Верхняя граница изображения
выравнивается по самому высокому
элементу текущей строки.
Выравнивает изображение по правому краю
окна.
Выравнивание нижней границы
изображения по окружающему тексту.
Выравнивает изображение по левому краю
окна.
Выравнивание середины изображения по
базовой линии текущей строки.
Упражнение 2.2
1. Настроить обтекание вашего изображения текстом справа при помощи атрибута
alignдля тега <img>;
2. Добавить произвольный текст (не менее 50 символов) после изображения;
3. Вставить ниже ещё 4 изображения и применить к каждому из них свой тип
обтекания текстов из представленных;
Hspace и vspace.
Для любого изображения можно задать невидимые отступы по горизонтали и
вертикали с помощью атрибутов hspace и vspace. Особенно это актуально при обтекании
рисунка текстом. В этом случае, чтобы текст не «наезжал» плотно на изображение,
необходимо вокруг него добавить пустое пространство.
Таблица 4.
Название
hspace
vspace
Описание
Расстояние между текстом и рисунком по
горизонтали.
Расстояние между текстом и рисунком по
вертикали.
Упражнение 2.3
1. Настроить расстояние между текстом и изображением, при помощи атрибутов
vspaceи hspace.
Alt.
Атрибут alt устанавливает альтернативный текст для изображений. Такой текст
позволяет получить текстовую информацию о рисунке при отключенной в браузере
загрузке изображений. Поскольку загрузка изображений происходит после получения
браузером информации о нем, то замещающий рисунок текст появляется раньше. А уже
по мере загрузки текст будет сменяться изображением.
Упражнение 2.4
1. Задать описание картинки, которое будет видно при наведении курсора мыши, при
помощи атрибута alt.
Width и height.
Для изменения размеров изображения средствами HTML предусмотрены атрибуты
height и width. Допускается использовать значения в пикселах или процентах. Если
установлена процентная запись, то размеры изображения вычисляются относительно
родительского элемента - контейнера, где находится тег <img>. В случае отсутствия
родительского контейнера, в его качестве выступает окно браузера. Иными словами,
width="100%" означает, что рисунок будет растянут на всю ширину веб-страницы.
Добавление только одного атрибута width или height сохраняет пропорции и отношение
сторон изображения. Браузер при этом ожидает полной загрузки рисунка, чтобы
определить его первоначальную высоту и ширину.
Обязательно задавайте размеры всех изображений на веб-странице. Это несколько
ускоряет загрузку страницы, поскольку браузеру нет нужды вычислять размер каждого
рисунка после его получения. Это утверждение особенно важно для изображений,
размещенных внутри таблицы.
Ширину и высоту изображения можно менять как в меньшую, так и большую
сторону. Однако на скорость загрузки рисунка это никак не влияет, поскольку размер
файла остается неизменным. Поэтому с осторожностью уменьшайте изображение, т.к. это
может вызвать недоумение у читателей, отчего такой маленький рисунок так долго
грузится. А вот увеличение размеров приводит к обратному эффекту - размер
изображения велик, но файл относительно изображения аналогичного размера
загружается быстрее. Но качество рисунка при этом ухудшается.
Таблица 5.
Название
Описание
width
Ширина изображения.
height
Высота изображения.
Упражнение 2.5
1. Изменить ширину и высоту изображения в пикселах при помощи атрибутов width
(ширина) и height (высота).
Border.
Изображение, помещаемое на веб-страницу, можно поместить в рамку различной
ширины. Для этого служит атрибут border тега <img>. В некоторых браузерах рамка
всегда отображается и чтобы её убрать, необходимо задать border значение «0».
Упражение 2.6
1. Настроить толщину рамки изображения при помощи атрибута border.
Упражение 2.7
1. Вставить ещё одно изображение ниже и самостоятельно применить к нему сразу
все рассмотренные выше атрибуты: обтекание, ширина, высота, толщина рамки,
отступ между текстом и изображением по вертикали и горизонтали, описание к
изображению.
Гиперссылки.
Добавление ссылки.
Тег <a> является одним из важных элементов HTML и предназначен для создания
ссылок. Для создания ссылки необходимо сообщить браузеру, что является ссылкой, а
также указать адрес документа, на который следует сделать ссылку. В качестве значения
атрибута href используется адрес документа (URL, Universal Resource Locator,
универсальный указатель ресурсов), на который происходит переход. Адрес ссылки
может быть абсолютным и относительным. Абсолютные адреса работают везде и всюду
независимо от имени сайта или веб-страницы, где прописана ссылка. Относительные
ссылки, как следует из их названия, построены относительно текущего документа или
корня сайта.
Обязательным атрибутом для ссылки являет title–добавляет поясняющий текст к
ссылке в виде всплывающей подсказки. Такая подсказка отображается, когда курсор
мыши задерживается на ссылке.
Упражнение 3.1
1. В папке с основной Web-страницей (index.html) необходимо создать ещё одну
страницу, например doc.html;
2. На новой странице осуществить запись произвольно текста;
3. В основном документе в самом конце разместить ссылку на новый созданный
документ при помощи тега <a>;
4. Добавить атрибут title;
5. В основной папке создать файл с расширением .docx, занести в него произвольную
информацию. В основном HTML-документе самостоятельно разметить ссылку на
данный файл с названием «Скачать файл»;
6. Создайте ссылку на свой почтовый ящик при помощи примера ниже с описанием:
Таблица 6.
Название
mailto:
Описание
Почта.
?subject=
Тема пиcьма.
&Body=
Текст вашего сообщения.
&cc=
Копии письма через запятую.
&bcc=
Cкрытые копии письма через запятую.
7. Самостоятельно вставить ссылку в виде изображения.
Якоря.
В данных упражнение применяются «якори» - ссылки на какие-либо позиции
внутри документа. Для того, чтобы задать якорь например параграфу <p> - используется
атрибут id, в котором задается уникальное имя (имя не может повторятся в одном
документе).Ссылка на якорь создается как обычная ссылка, но вместо пути к файлу
задается созданное ранее имя, после знака #.
Упражнение 3.2
1. Вставить в конце основного документа следующий HTML-код c текстом:
2. Самостоятельно в Вашем документе создать «якори» и ссылки на них для текста
ниже:
Некоторые термины реляционных баз данных.
Отношение (Relation) - информация об объектах одного типа, например, о клиентах, заказах, сотрудниках. В
реляционных базах данных отношение обычно хранится в виде таблицы.
Возможности СУБД.
Определение данных (Data definition) - вы можете определить, какая именно информация будет храниться в
вашей базе данных, задать структуру данных и их тип (например, количество цифр или символов), а также
указать, как эти данные связаны между собой. В некоторых случаях вы можете также задать форматы и
критерии проверки данных.
Причины целесообразности перехода к использованию СУБД.
У вас имеется слишком много отдельных файлов или какие-то из файлов содержат большой объем
информации, что затрудняет работу с данными. К тому же работать с такими объемами данных могут
вам не позволить ограничения по памяти программы или системы.
Списки.
Маркированный список.
Тег <ul> устанавливает маркированный список. Каждый элемент списка должен
начинаться с тега <li>. У тега <ul>…</ul> есть атрибут type, который устанавливает вид
маркера.
Таблица 7.
Название
<ul type="disc"> ... </ul>
Описание
•
•
•
Текст один
Текст два
Текст три
<ul type="circle"> ... </ul>
o Текст один
o Текст два
o Текст три
<ul type="square"> ... </ul>



Текст один
Текст два
Текст три
Упражнение 4.1
1. Создать маркированный список;
2. Задать разные виды маркера при помощи атрибута type.
Нумерованный список.
Тег <ol> устанавливает нумерованный список. Каждый элемент списка должен
начинаться с тега <li>. У тега <ol>…</ol> есть атрибут type, который устанавливает вид
маркера. Также у тега <ol>есть атрибут reversed, который меняет нумерацию в списке на
обратный порядок. Атрибут start устанавливает номер, с которого будет начинаться
список.
Таблица 8.
Название
Описание
<ol type="A"> ... </ol>
A. Текст один
B. Текст два
C. Текст три
<ol type="a"> ... </ol>
a. Текст один
b. Текст два
c. Текст три
<ol type="I"> ... </ol>
I.
II.
III.
Текст один
Текст два
Текст три
<ol type="i"> ... </ol>
i.
ii.
iii.
Текст один
Текст два
Текст три
<ol type="1"> ... </ol>
1. Текст один
2. Текст два
3. Текст три
Упражнение 4.2
1. Создать упорядоченный список;
2. Задать разные виды нумерации при помощи атрибута type.
Мнемоники (entities, спец.символы), линия.
Символ-мнемоника - это конструкция SGML, которая ссылается на символ из
набора символов текстового файла. В HTML предопределено большое количество
спецсимволов. Чтобы вставить определённый символ в разметку, нужно вставить
определенную ссылку-мнемонику в HTML-структуру.
Таблица 9.
Символ
Мнемоника
Описание
©
©
Знак охраны авторского
права (copyright).
®
®
Знак зарегистрированной
торговой марки (registered).
™
™
Знак торговой марки (trade
mark).
 
Неразрывный пробел.
-
–
Дефис.
__
—
Тире.
«
«
Левая двойная угловая
кавычка.
»
»
Правая двойная угловая
кавычка.
Упражнение 5.1
1. При помощи специальных тэгов, вставить в основной HTML-документ следующую
строку;
2. Добавить следующий текст в основной документ:
Delphi — императивный, структурированный, объектно-ориентированный язык
программирования, диалект Object Pascal.
3. Перейти на другую строку;
4. Вставить линию при помощи тэга <hr>(данный тэг не требует закрывающего
тэги).
3. Вывод.
В результате выполнения практической работы «Основы языка гипертекстовой разметки
HTML»были изучены базовые теги HTML.
4. Задание
Разработать справочник по языку HTML, который описывает
основные теги (работа с текстом, изображения, гиперссылки,
списки, специальные символы). Справочник должен состоять
из 5 страниц. У пользователя должна быть возможность
попадать свободно попадать на каждую страницу, а так же
иметь возможность вернуться назад.
5. Контрольные вопросы
1. Какая разница между тегом <p> и <span>?
2. Какие не закрывающие теги вы знаете?
3. Какая разница между расширением .htmlи .php?
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 2
«Таблицы HTML»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н., преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
1. Цель работы.
В процессе выполнения практической работы необходимо изучить и научиться
применять основные теги при работе с таблицами. А так же изучить принцип табличного
построения сайта.
2. Теоретические сведения.
Общие сведения.
Благодаря универсальности таблиц, большому числу параметров, управляющих их
видом, таблицы надолго стали определенным стандартом для верстки веб-страниц.
Таблица с невидимой границей представляет собой словно модульную сетку, в блоках
которой удобно размещать элементы веб-страницы. Тем не менее, это не совсем
правильный подход, ведь каждый объект HTML определен для своих собственных целей
и если он используется не по назначению, причем повсеместно, это значит, что
альтернатив нет. Так оно и было долгое время, пока на смену таблицам при верстке сайтов
не пришли слои.
Создание таблицы.
Таблица состоит из строк и столбцов ячеек, которые могут содержать текст и
рисунки. Обычно таблицы используются для упорядочения и представления данных,
однако возможности таблиц этим не ограничиваются. C помощью таблиц удобно верстать
макеты страниц, расположив нужным образом фрагменты текста и изображений.
Для добавления таблицы на веб-страницу используется тег <table>…</table>. Этот
элемент служит контейнером для элементов, определяющих содержимое таблицы. Любая
таблица состоит из строк и ячеек, которые задаются соответственно с помощью тегов
<tr> и <td>. Таблица должна содержать хотя бы одну ячейку. Тег
<tr>…</tr>предназначен для создание строк в таблице, а тег <td>…</td> для добавления
ячеек.
<table>
<tr>
<td>Ячейка_1 </td>
<td>Ячейка_2 </td>
<td>Ячейка_3 </td>
</tr>
<tr>
<td>Ячейка_4 </td>
<td>Ячейка_5 </td>
<td>Ячейка_6 </td>
</tr>
</table>
Упражнение 1.1
1. Создать таблицу из пяти строк. В каждой строке должно находится по 5 ячеек.
Структура таблицы.
Каждая таблица состоит из строк и ячеек, минимально может быть одна строка и
одна ячейка. В таком случае, впрочем, непонятно, зачем использовать таблицу, потому
что как такового табличного представления уже нет. Кроме того, таблице можно задать
заголовок, который кратко описывает её содержимое, указать «шапку», «тело» и «подвал»
таблицы. Они нужны для стилевого или смыслового выделения части данных.
Элемент <caption>…</caption> предназначен для создания заголовка к таблице и
может размещаться только внутри контейнера <table>…</table>, причём сразу после
открывающего тега. Такой заголовок представляет собой текст, по умолчанию
отображаемый перед таблицей и описывающий её содержание.
<table>
<caption>Заголовоктаблицы</caption>
<tr>
<td>Ячейка_1 </td>
<td>Ячейка_2 </td>
<td>Ячейка_3 </td>
</tr>
</table>
Упражнение 2.1
1. Добавить к существующей таблице заголовок с помощью тега <caption>.
Элемент <thead>…</thead> предназначен для хранения одной или нескольких
строк, которые представлены вверху таблицы. Допустимо использовать не более одного
элемента<thead> в пределах одной таблицы, и он должен идти в исходном коде сразу
после элемента <table>.
Элемент <th>…</th> предназначен для создания одной ячейки таблицы, которая
обозначается как заголовочная. Текст в такой ячейке отображается браузером обычно
жирным шрифтом и выравнивается по центру. Элемент <th> должен размещаться внутри
контейнера <tr>, который в свою очередь располагается внутри <table>.
Элемент <tbody>…</tbody> предназначен для хранения одной или нескольких
строк таблицы. Это позволяет создавать структурные блоки, к которым можно применять
единое оформление через стили. Допускается применять несколько элементов <tbody>
внутри контейнера <table>.
Элемент <tfoot>…</tfoot> предназначен для хранения одной или нескольких
строк, которые представлены внизу таблицы. Хотя <tfoot> в исходном коде должен быть
определен до элемента <tbody>, браузеры отображают его в самом низу таблицы. В
пределах таблицы разрешается использовать только один элемент <tfoot>.
<table>
<thead>
<th>Заголовок_1
<th>Заголовок_2
<th>Заголовок_3
</thead>
<tfoot>
<tr>
<td>Низ_1
<td>Низ_2
<td>Низ_3
</th>
</th>
</th>
</td>
</td>
</td>
</tr>
</tfoot>
<tbody>
<tr>
<td>Ячейка_1 </td>
<td>Ячейка_2 </td>
<td>Ячейка_3 </td>
</tr>
</tbody>
</table>
При использовании элементов <thead>, <tbody> и <tfoot> придерживайтесь следующих
правил:
 Заголовок таблицы <caption> пишется в самом верху таблицы, сразу после
открывающего тега <table>;
 <thead> вставляется вверху таблицы, сразу после заголовка, если он присутствует;
 <tfoot> вставляется перед <tbody>, но при этом отображается всегда в самом низу
таблицы;
 Элемент <tbody> для таблиц нужен обязательно, но для простых таблиц без
<thead> и <tfoot> его можно не указывать. Браузеры сами научились вставлять его
автоматически в код, понимая, что большинство разработчиков ленятся добавлять
элемент, который визуально никак не влияет на таблицу;
 <tbody> может быть один или несколько, вы сами решаете, по какому принципу их
добавлять.
Упражнение 2.2
1. Оформить существующую таблицу согласно требованиям семантики HTML-кода с
помощью тегов <thead>, <th>, <tbody>, <tfoot>.
Объединение ячеек.
Объединение ячеек по горизонтали или вертикали используется в случае сложных
табличных данных, для этого применяются атрибуты colspan и rowspan у элемента <td>
или <th>. Атрибут colspan устанавливает число ячеек объединяемых по горизонтали.
Аналогично работает и атрибут rowspan, с тем лишь отличием, что объединяет ячейки по
вертикали. Перед добавлением атрибутов проверьте число ячеек в каждой строке, чтобы
не возникло ошибок.
<table>
<tr>
<td rowspan=''2''>Ячейка_1 </td>
<td colspan='''2'>Ячейка_2 </td>
<td>Ячейка_3 </td>
</tr>
<tr>
<td>Ячейка_4 </td>
<td>Ячейка_5 </td>
<td>Ячейка_6 </td>
</tr>
</table>
Упражнение 3.1
1. Произвести объединение ячеек по горизонтали и вертикали.
Особенности таблиц.




Одну таблицу допускается помещать внутрь ячейки другой таблицы. Это требуется
в некоторых случаях для представления сложных данных;
Размеры таблицы изначально не установлены и вычисляются на основе
содержимого ячеек. Например, общая ширина определяется автоматически исходя
из суммарной ширины содержимого ячеек плюс ширина границ между ячейками,
поля вокруг содержимого и расстояние между ячейками;
Если для таблицы задана её ширина в процентах или пикселях, то содержимое
таблицы подстраивается под указанные размеры. Так, браузер автоматически
добавляет переносы строк в текст, чтобы он полностью поместился в ячейку, и при
этом ширина таблицы осталась без изменений. Бывает, что ширину содержимого
ячейки невозможно изменить, как это, например, происходит с рисунками. В этом
случае ширина таблицы увеличивается несмотря на указанные размеры;
Пока таблица не загрузится полностью, её содержимое не начнёт отображаться.
Дело в том, что браузер, прежде чем показать содержимое таблицы, должен
вычислить необходимые размеры ячеек, их ширину и высоту. А для этого нужно
знать, что в этих ячейках находится. Поэтому браузер и ожидает, пока загрузится
всё, что находится в ячейках, и только потом отображает таблицу.
3. Вывод.
В результате выполнения практической работы «Работа с таблицами»был рассмотрен
способ создания и форматирование таблицы .
4. Задание
a. Создать и заполнить таблицу с использованием всех
пунктов, которые были описаны в пункте «Теоретические
сведения»;
b. Создать таблицу согласно макету, который представлен в
приложение 1.
5. Контрольные вопросы
4. Для чего применяется тег <thead>?
5. Для чего применяется тег <caption>?
Приложение 1.
Вариант 1.
Вариант 2.
Вариант 3.
Вариант 4.
Вариант 5.
Вариант 6.
Вариант 7.
Вариант 8
Вариант 9.
Вариант 10.
Вариант 11.
Вариант 12.
Вариант 13.
Вариант 14.
Вариант 15.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 3
«Размещение графики на странице»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Если навеб-странице не будет ничего, кроме текстовой информации, она, возможно, и
покажется кому-то интересной, благодаря представленным на ней сведениям, однако вряд
ли у кого то повернется язык назвать ее привлекательной. Добавлять изображения на вебстраницу очень легко. Для добавления же графики, которая сможет придать странице
профессиональный вид, требуются некоторые знания. Чему, собственно и посвящен
сегодняшний урок.
Двумя наиболее часто применяемыми в Интернете графическими форматами являются
GIF и JPEG. Формат, разработанный группой JPEG (Joint Photographic Experts Group —
Объединенная группа экспертов по машинной обработке фотографических изображений)
и получивший ее название, используется, как правило, для сохранения изображений с
плавными цветовыми переходами, таких, например, как фотоснимки.
Практически все другие графические элементы сохраняются в формате GIF (Graphics
Interchange Format) — формат обмена графическими данными. В настоящее время
появился еще один новый графический формат, приобретающий все большую
популярность: PNG (Portable Network Graphics — переносимая сетевая графика).
Ожидается, что со временем он заменит собой формат GIF. Однако не спешите
пересохранять все свои графические файлы в этом формате, пока еще он поддерживается
далеко не всеми браузерами.
Все изображения добавляются на веб-страницу с помощью одного и того же тега,
называемого тегом источника изображения <img scr=»место расположения» />. Наверное,
сейчас уже вы сами можете определить, что данная запись состоит из собственно тега
<img />, его атрибута (scr) и значения данного атрибута (место расположения). Однако,
поскольку применение атрибута scr является обязательным, удобнее говорить об этой
записи как об одном общем теге. Вероятно, вы обратили также внимание, что для тега
источника изображения не предусмотрен соответствующий закрывающий тeг. Это
отдельный самодостаточный тeг, и потому не забывайте добавлять в его конце
закрывающую косую черту: <img />.
<!DOCTYPE html
PUBLIC "//W3C//DТD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DТD/xhtml1/transitional.dtd">
<html xmlns=''http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<titlе>Первыеизображения</titlе>
<style type="text/css">
</style>
</head>
<body>
<р>Этот рисунок добавлен на мою первую веб-страницу.</р>
<img src="http://www.thingstobehappyabout.com/face2.gif" />
</body>
</html>
Добавление альтернативных надписей
Путешествуя по Интернету, вы, наверное, не раз замечали различные надписи,
отображаемые при наведении указателя мыши на какой-нибудь графический элемент вебстраницы. Эти надписи обычно сообщают какую-то дополнительную информацию о
самом изображении или о той области страницы, которую оно занимает.
На примере представленного далее НТМL кода показано, как атрибут alt добавляется
внутрь тега <img />. Подобно атрибуту src, атрибут alt сообщает веб-браузеру некоторую
дополнительную информацию об изображении, и его также всегда можно использовать
вместе с тeгом <img />.
<img src="http://www.thingstobehappyabout.com/face2.gif"
alt="Это мой автопортрет!" />
Атрибут alt определяет для добавленного на веб-страницу графического элемента
альтернативный текст. Этот текст называется альтернативным, поскольку может
отображаться на экране как альтернатива самому изображению. Атрибут alt имеет еще
одно очень важное назначение. Многие посетители интернета, использующие каналы
доступа с низкой скоростью передачи данных, могут давать указание своим браузерам не
загружать и не отображать графическую информацию. Это позволяет им ускорить
загрузку веб-страниц на свои компьютеры.
Кроме того, помните, что не все браузеры способны отображать в своих окнах графику.
Например, браузер Lynx вообще не поддерживает такой возможности. Таким образом,
атрибут alt позволяет веб-дизайнеру быть уверенным в том, что, если посетитель его вебстраницы не увидит на своем экране изображения, он по крайней мере сможет
ознакомиться с добавленной к этому изображению текстовой информацией.
Хотя атрибут alt можно определять для каждого тега <img />, следите за тем, чтобы не
назначить некоторым графическим элементам несоответствующие им текстовые
сообщения. Например, не имеет смысла добавлять альтернативные текстовые надписи к
различным элементам внешнего оформления веб-страницы. Чтобы избежать подобных
ошибок, можете присваивать атрибуту alt таких элементов пустое значение (alt=» » ). Если
не задавать значения никаких других атрибутов, браузер воспроизведет изображение в егo
исходном размере, выровняв верхний край изображения с верхним краем расположенной
рядом текстовой строки. Вы можете изменить оба эти параметра, воспользовавшись
тегами стилевых таблиц.
Атрибуты изображения
Для тега <img /> предусмотрены атрибуты, позволяющие изменять размер изображения.
Некоторые из этих атрибутов перечислены ниже.
height — Указывается в пикселях или процентах — Определяет высоту изображения
width — Указывается в пикселях или процентах — Определяет ширину изображения.
Настройка высоты и ширины изображения
Размеры размещаемого на веб-странице изображения могyт быть заданы с помощью
атрибутов height и width. 3начения этих атрибутов задаются либо как фиксированные
количества пикселей, либо в процентном выражении относительно размеров страницы.
Взгляните на представленный далее код HTML. В первом тегe размеры исходного
изображения, которое вы уже видели на предыдущих рисунках этого урока,
устанавливаются равными 60 пикселям по вертикали и 60 пикселям по горизонтали. Во
втором тегe ширина того же изображения устанавливается равной 6% от ширины
страницы, а высота — 10% относительно высоты страницы. На рисунке показано, как оба
эти изображения выглядят в окне браузера.
<img src="http://www.thingstobehappyabout.com/face2.gif"
аlt="Это мой автопортрет!" hеight="60" width="60" />
<img src="http://www.thingstobehappyabout.com/face2.gif"
аlt="Это мой автопортрет!" height="10%" width="6%" />
Воспроизводя изображение в своем окне, браузер одинаково хорошо справляется с
обработкой значений, заданных как в пикселях, так и в процентах, Помните, однако, о
том, что на компьютерах посетителей вашей веб-страницы может быть задано экранное
разрешение, отличное от того, которое установлено для вашего монитора. Что из этого
следует? Например для монитора задано разрешение 800х600. В предыдущем примере для
добавляемого на веб-страницу рисунка была задана ширина на уровне 6% от ширины
страницы, которая при таком разрешении составит 48 пикселей. Если просматривать то
же изображение на мониторе с разрешением 1024х800, указанным 6% от ширины
страницы будет соответствовать уже ширина, равная 61 пикселю.
Изменяя размеры изображения, не забудьте задать оба значения соответствующие его
высоте и ширине. Если изменить только одно из этих значений, на экране само
изображение окажется растянутым по вертикали или горизонтали. Альтернативный
вариант состоит в настройке размеров изображения средствами графического редактора.
Вы можете создать иллюзию более быстрой загрузки изображения. Независимо от того,
изменены размеры изображения или нет, вceгда указывайте значения атрибутов height и
width, так как они сообщат браузеру важные сведения о том, сколько места должно быть
выделено на странице для размещения данного рисунка. В таком случае браузер сможет
обозначить требуемое для изображения пространство и продолжить построение других
элементов страницы, не прекращая загрузки самого изображения. Таким способом
создается впечатление, будто страница загружается быстрее, поскольку ее посетителям не
придется ждать полной загрузки изображения, чтобы увидеть наконец другую
представленную на странице информацию.
Если действительно необходимо, чтобы изображение занимало точно определенное
пространство по ширине страницы, используйте процентные значения. В таком случае на
экране любого монитора изображение будет занимать ту же часть страницы, что и на
вашем экране. Если необходимо, чтобы постоянным оставалось разрешение самого
рисунка (его размер в пикселях), используйте значения, выраженные в пикселях.
Выравнивание текста и графики
Атрибут align тега <img /> позволяет выравнивать изображение по правому (значение
right) или левому (значение left) краю текстовой строки. Примеры использования этого
атрибута показаны на рисунке.
<img src="http://www.thingstobehappyabout.com/face2.gif"
аlt="Это мой автопортрет!" hеight="60" width="60" align="right" />
Этот же атрибут может при меняться и для выравнивания изображения по вертикали
(опять-таки относительно текстовой строки). Он может принимать три других значения
top, bottom и center. Если атрибуту align присвоено значение top, верхний край
изображения выравнивается по верхнему краю любого окружающего его текста. Если
атрибуту align присвоено значение bottom, нижний край изображения выравнивается по
нижнему краю окружающего его текста. Если же атрибуту align присвоено значение
center, центр изображения выравнивается по центру текстовой строки.
Использование изображений в качестве ссылок
Изображения хороши не только для оформления веб-страницы. Их с успехом можно
использовать в качестве гиперссылок на другие документы. В HTML данная задача
решается просто, поскольку изображения превращаются в гиперссылки точно тем же
способом, что и надписи. Для этого необходимо также применить тeг <а>, заключив в
него элемент веб-страницы, который должен стать ссылкой на другой документ. Таким
образом, если переход по гиперссылке должен осуществляться после щелчка на каком то
изображении, в тeг <а> необходимо заключить тeг данного изображения.
<а href="DOC2.htm">
<img src="http://www.thingstobehappyabout.com/face2.gif"
аlt="Это мой aвтопортрет" hеight="60" width="60" /></а>
В данном случае, после того, как посетитель веб-страницы наведет указатель мыши на это
изображение, рядом с курсором отобразится текстовое сообщение «Это мой
автопортрет!». После щелчка на изображении будет открыт документ DOС2.htm, на
который указывает гиперссылка.
Миниатюры изображений
Другим распространенным способом применения имеющейся в HTML возможности
создания гиперссылок является использование одних изображений для перехода к другим.
Для чего это необходимо? Дело в том, что довольно часто размер изображений, которые
вы хотите опубликовать на веб-странице, слишком велик, и нет никакой уверенности, что
у посетителей хватит терпения дожидаться окончания их загрузки. В таких случаях
создают уменьшенную копию исходного изображения, называемую миниатюрой, с
загрузкой которой браузер справится гораздо быстрее. Если посетитель заинтересуется
изображением и захочет загрузить его полноценную копию, ему достаточно будет
щелкнуть на данной миниатюре. Вот как выглядят соответствующие коды HTML.
<а href="изображение.jрg"><img src="миниатюра.jрg"
аlt="Щелкните, чтобы увидеть нормальное изображение."
hеight="60" width="60" /></а>
Как видите, щелчок на изображении миниатюра.jpg сопровождается открытием файла
другого изображения (изображение.jpg). Текстовая строка, заданная как значение
атрибута alt, сообщает посетителю, как открыть основное изображение.
Секреты успешного использования изображений
Изображения интересны и привлекательны, несут в себе массу наглядной информации и
их очень просто добавлять на веб-страницы, однако все же следует придерживаться
некоторых перечисленных далее правил, если вы действительно хотите создать сайт,
который станет популярным среди пользователей Интернета.
Чем больше размеры файла изображения, тем больше времени потребуется для его
загрузки на компьютер пользователя. Поскольку большинство посетителей Интернета для
доступа к сети по-прежнему используют каналы связи с низкой пропускной
способностью, размеры загружаемых файлов все еще имеют для них принципиальное
значение. Обязательно учитывайте данное обстоятельство и старайтесь размещать на
своих веб-страницах изображения как можно меньших размеров.
Важное значение имеют не только размеры файла отдельного изображения, но и общий
размер файла всего HTML документа. Чем больше изображений будет добавлено на вебстраницу, пусть даже малых размеров, тем большим будет размер файла финального
документа. Выполните предварительный просмотр своей страницы в разных браузерах и
оцените, какое время потребуется каждому браузеру на ее загрузку.
Поскольку атрибут alt имеет столь важное значение (ведь его рекомендуется определять
для каждого тега <img />, будьте внимательны при его использовании. Следите за тем,
чтобы содержание текстового сообщения всегда соответствовало самому изображению,
иначе посетители вашей страницы могут быть введены в заблуждение. Это же замечание
применимо и в обратном направлении: следите за тем, чтобы изображения
соответствовали представленной на веб-странице текстовой информации. Фотоснимок
самолета будет уместен на сайте, посвященном авиаперевозкам, и совершенно лишним на
сайте, рассказывающем о дикой природе.
В интернете вы можете найти множество интересных изображений и с легкостью
сохранить их на своем компьютере. Однако многие из этих изображений защищены
авторскими правами. Если вы нашли какое то понравившееся вам изображение на
коммерческом сайте, посмотрите, нет ли там же каких то сообщений об авторских правах
и доступно ли это изображение для свободного использования.
Если представленное на веб-странице изображение не защищено авторскими правами, вы
можете скопировать его в память cвoeгo компьютера. Для этогo достаточно просто
щелкнуть на этом изображении правой кнопкой мыши и выбрать в открывшемся меню
команду Сохранить изображение как. Сохранив изображение на своем компьютере, вы
можете использовать его далее подобно любому другому рисунку.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 4
«Форматирование страницы на основе CSS»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
1. Цель работы.
В процессе выполнения практической работы необходимо познакомится с
каскадной таблицей стилей.
2. Теоретические сведения.
Общие сведения.
CSS является сложным языком, который отнимает совсем немного энергии. Он
позволяет добавить макет и дизайн для наших страниц и обмениваться стилями от
элемента к элементу и страницы к странице. Прежде чем мы сможем раскрыть все
особенности CSS, есть несколько аспектов языка, которые вы должны в полной мере
понимать.
Первое что важно знать, как именно отображаются стили. В частности, мы должны
знать, как работают разные типы селекторов и как порядок этих селекторов может
повлиять на отображение стилей. Мы также хотим понимать несколько основных
значений свойств, которые постоянно появляются в CSS, в частности те, которые
касаются цвета и размера.
Способы внедрения CSS в HTML-документ.
Способ 1. Внедрение стилей в HTML-документ при помощи тега <style>.
<head>
<title>Документс CSS</title>
<style type="text/css">
/* кодCSS */
</style>
</head>
Способ 2. Внедрение стилей в HTML-документ при помощи атрибута style для тегов.
Не путайте понятия тэгов с атрибутами. Атрибуты это параметры для тэгов.
<html>
<head>
<title> Документ с CSS </title>
</head>
<body>
<p style="color: black"> В этом абзаце текст должен быть
чёрным. </p>
</body>
</html>
Способ 3. Стили в отдельном файле.
Представим, что сайт будет состоять из многих страниц. Если хотим, чтобы все
страницы сайта были оформлены однотипно, то удобнее установить стиль сразу для всех
страниц, т. е. создать один внешний файл листа стилей.
Для того, чтобы каскадные таблицы стилей находились в отдельном файле (тем
самым они загружаются один раз и кэшируются) необходимо создать файл стилей с
расширением *.css, к примеру style.css. Для этого открываем блокнот и сохраняем файл с
расширением *.css.
Далее в нашем HTML документе между тегами <head>…</head> вставляем тег
<link> таким образом:
<head>
<title>Знакомвствос CSS </title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
Классы и идентификатор.
Для объявления блоков в таблице стилей применяет обозначение с помощью
классов и уникальных идентификаторов. В HTML идентификатор обозначатся с помощью
с помощью id, в CSS задаются с помощью символа «#». Класс в HTML обозначаются с
помощью class, а в CSS задаются с помощью символа «.». ID - уникальное собственное
имя элемента на странице, то есть на странице не должно быть нескольких элементов с
одним id. CLASS - вольный признак, который дается обычно нескольким элементам,
чтобы отличать их от других.
<p id=“название идентификатора”> текст </p>
<pclass=“название класса”> текст </p>
Описание стилей CSS.
Все свойства, применяемые в CSS с описанием и примерами, вы можете найти на сайте:
http://webref.ru
Фон.
Фон оказывает значительное воздействие на дизайн сайта. Он помогает создать
впечатляюще выглядящий сайт, установить группирование и определить приоритет, фон
также серьёзно влияет на удобство сайта.
В CSS фон элемента может быть сплошного цвета, изображением, градиентом или
их комбинацией. Когда мы решаем, как реализовать такой фон, то должны понимать, что
каждый фон влияет на общий вид нашего сайта.
Добавление цвета фона.
Самый быстрый способ добавить фон к элементу - это установить однотонный фон
с помощью свойства background или background-color. Свойство background принимает
цвет и изображения в сокращённой форме, в то время как свойство background-color
используется строго для установки сплошной фоновой заливки. Оба свойства работают, а
какое вы решите использовать зависит от ваших предпочтений, а также ситуации.
div {
background-color: #b2b2b2;
}
Добавление фонового изображения.
Кроме цвета фона элемента мы можем также добавить к нему фоновое
изображение. Такие изображения работают аналогично цвету фона, однако предлагают
несколько дополнительных свойств для уточнения. Как и прежде, мы можем использовать
свойство background с сокращённым значением или свойство background-image
напрямую. Независимо от применяемого свойства они требуют указать источник
изображения с помощью функции url().
Значение функции url() будет адресом фоновой картинки и к нему применяются
знакомые правила для создания пути гиперссылки. Следите за разными папками и не
забудьте показать, где именно находится изображение. Путь помещается внутри скобок и
кавычек.
div {
background-image: url("alert.png");
}
Добавление фонового изображения с одним лишь значением url может выдать
нежелательные результаты, так как по умолчанию фоновое изображение будет
повторяться по горизонтали и вертикали от левого верхнего угла данного элемента, чтобы
заполнить фон элемента целиком. К счастью, мы можем использовать свойства
background-repeat и background-position для управления, как именно повторять картинки.
background-repeat.
По умолчанию, фоновое изображение будет повторяться бесконечно по вертикали
и горизонтали, если не указано иное. Свойство background-repeat может быть
использовано чтобы изменить направление, в котором фоновая картинка будет
повторяться, если она вообще повторяется.
div {
background-image: url("alert.png");
background-repeat: no-repeat;
}
Свойствоbackground-repeatпринимаетчетыреразныхзначения:
1.
2.
3.
4.
repeat;
repeat-x;
repeat-y;
no-repeat.
Repeat является значением по умолчанию и повторяет фоновое изображение по вертикали
и по горизонтали.Значение repeat-x повторяет фоновое изображение по горизонтали, в то
время как значение repeat-y повторяет его по вертикали. Наконец, значение no-repeat
говорит браузеру отобразить картинку один раз, то есть не повторять её вообще.
background-position.
По умолчанию, фоновая картинка располагается в левом верхнем углу элемента.
Тем не менее, с помощью свойства background-position мы можем контролировать, где
именно изображение размещается относительно этого угла.
div {
background-image: url("alert.png");
background-position: 20px 10px;
background-repeat: no-repeat;
}
Свойство background-position требует два значения:
1. горизонтальное смещение (первое значение);
2. вертикальное смещение (второе значение).
Если указано только одно значение, то оно применяется для горизонтального
смещения, а вертикальное по умолчанию задаётся как 50%.Поскольку мы двигаем
фоновое изображение из левого верхнего угла элемента, значения размера будут
непосредственно привязаны к этому углу.Чтобы установить значение background-position
мы можем использовать ключевые слова top, right, bottom и left, пиксели, проценты или
любую единицу размера. Ключевые слова и проценты работают очень похоже. Значение
left top идентично процентному значению 0 0, которое располагает изображение в левом
верхнем углу элемента. Значение right bottom идентично процентной записи 100% 100% и
будет позиционировать изображение в правом нижнем углу элемента.
background-attachment.
Свойство background-attachment устанавливает, будет ли прокручиваться фоновое
изображение вместе с содержимым элемента. Изображение может быть зафиксировано и
оставаться неподвижным, либо перемещаться совместно с документом. Можно указать
несколько значений для ряда фоновых изображений, перечисляя значения через запятую.
Таблица 1.
Название
fixed
scroll
local
Значения background.
Описание
Делает фоновое изображение элемента
неподвижным.
Позволяет перемещаться фону вместе с
содержимым.
Фон фиксируется с учётом поведения
элемента. Если элемент имеет прокрутку, то
фон будет прокручиваться вместе с
содержимым, но фон, выходящий за рамки
элемента, остаётся на месте.
Свойства background-color, background-image, background-position и backgroundrepeat могут выступать значением для единичного свойства background. Порядок этих
свойств в background может варьироваться, но обычно он такой: background-color,
background-image, background-position, а затем background-repeat.
div {
background: #b2b2b2 url("alert.png") 20px 10px no-repeat;
}
Линейный градиент.
Градиентом называют плавный переход от одного цвета к другому, причём самих
цветов и переходов между ними может быть несколько. С помощью градиентов создаются
самые причудливые эффекты веб-дизайна, например, псевдотрёхмерность, блики, фон и
др. Также с градиентом элементы смотрятся более симпатично, чем однотонные.
Отдельного свойства для добавления градиента нет, поскольку он считается
фоновым изображением, поэтому добавляется через свойство background-image или
универсальное свойство background.
Таблица 2.
Название
to top
to left
to bottom
to right
to top left
to top right
to bottom left
to bottom right
Описание
Снизу вверх.
Справа налево.
Сверху вниз.
Слева направо.
От правого нижнего угла к левому
верхнему.
От левого нижнего угла к правому
верхнему.
От правого верхнего угла к левому
нижнему.
От левого верхнего угла к правому
нижнему.
-webkit-linear-gradient - создаёт линейный градиент в браузерах Safari и Chrome;
-moz-linear-gradient - создаёт линейный градиент в браузере Firefox.
Работа с типографикой.
font-family.
Свойство font-family применяется, чтобы объявить, какой шрифт, а также какие
резервные или заменяющие шрифты должны быть использованы для отображения текста.
Значение font-family содержит несколько имён шрифтов, перечисляемых через запятую.
Первый указанный шрифт, начиная слева, является основным выбранным шрифта.
Если первый шрифт недоступен, после него указываются альтернативные шрифты в
порядке предпочтения слева направо.Имена шрифтов, состоящие из двух или более слов
должны быть взяты в кавычки. Кроме того, последний шрифт должен быть ключевым
словом, который обозначает системный шрифт по умолчанию для указанного типа,
наиболее популярные это sans-serif и serif.
Свойство font-family в действии выглядит так:
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
В данном случае Helvetica Neue является предпочтительным шрифтом для отображения.
Если этот шрифт недоступен или не установлен на указанном устройстве, будет
использоваться следующий шрифт в списке - Helvetica и так далее.
Таблица 3.
Название
serif
sans-serif
cursive
fantasy
monospace
Описание
Шрифты с засечками (антиквенные), типа
Times.
Рубленные шрифты (шрифты без засечек
или гротески), типичный представитель —
Arial.
Курсивные шрифты.
Декоративные шрифты.
Моноширинные шрифты, ширина каждого
символа в таком семействе одинакова
(шрифт Courier).
font-size.
Свойство font-size даёт возможность установить размер текста, используя типовые
значения размера, включая пиксели, em, проценты, пункты или ключевые слова.Здесь в
CSS устанавливается размер шрифта 14 пикселей для элемента <body>:
body {
font-size: 14px;
}
font-style.
Чтобы сделать текст курсивным или предотвратить его от этого, мы будем
использовать свойство font-style. Это свойство принимает четыре ключевых слова:
1. normal - обычное начертание текста;
2. italic - курсивное начертание;
3. oblique – наклонное начертание;
4. inherit - наследует значение родителя.
Из них наиболее часто используются italic и normal. Ниже CSS устанавливает для всех
элементов с классом special свойство font-style как italic:
.special {
font-style: italic;
}
font-weight.
Иногда мы хотим сделать текст жирным или изменить насыщенность гарнитуры. В
таких случаях мы будем использовать свойство font-weight. Оно принимает в качестве
значения ключевое слово или число.
Ключевое слово включает:
1. normal;
2. bold;
3. bolder;
4. lighter;
5. inherit.
Из этих ключевых слов рекомендуется в первую очередь задействовать normal и
bold, чтобы изменить текст от обычного до жирного и наоборот. Вместо использования
ключевых слов bolder или lighter лучше применять числовое значение для более точного
управления. На практике, CSS для установки font-weight как bold для любого элемента с
классом daring:
.daring {
font-weight: bold;
}
Числовые значения 100, 200, 300, 400, 500, 600, 700, 800 и 900 связаны с
гарнитурами шрифтов, которые имеют несколько жирностей. Их порядок начинается с
самой тонкой жирности, 100, и повышается до самой толстой жирности, 900. Для справки,
значение normal соответствует 400, а значение bold соответствует 700. Таким образом,
любое числовое значение ниже 400 будет достаточно тонким, а любое значение выше 700
будет достаточно жирным.
line-height.
Межстрочный интервал - расстояние между двумя строками текста - объявляется с
помощью свойства line-height. Лучше всего для читаемости задать межстрочный интервал
примерно в полтора раза больше значения свойства font-size. Это можно быстро получить
путём установки line-height как 150% или просто 1.5. Однако если мы работаем с базовой
сеткой, предпочтительнее использовать пиксели и получить немного больше контроля над
line-height.
Взгляните на CSS, мы установили line-height как 22 пикселя для элемента <body>,
тем самым задав 22 пикселя между каждой строкой текста:
body {
line-height: 22px;
}
Межстрочный интервал также может быть использован для вертикального выравнивания
по центру одной строки текста внутри элемента. Используя одинаковые значения свойств
line-height и height вы выровняете текст по центру вертикали. Этот метод может быть
полезен для кнопок, предупреждающих сообщений и других однострочных текстовых
блоков.
.btn {
height: 22px;
line-height: 22px;
}
Универсальное свойство font.
Все перечисленные выше шрифтовые свойства могут быть объединены в одном
универсальном свойстве font. Это свойство может принимать несколько значений
шрифтовых свойств. Порядок значений этих свойств должен быть следующим, слева
направо: font-style, font-variant, font-weight, font-size, line-height и font-family.
Эти значения перечисляются слева направо без применения запятых (кроме
названий шрифтов, поскольку свойство font-family задействует запятые). Косая черта (/)
необходима для разделения значений свойств font-size и line-height.
body {
font: italic small-caps bold 14px/22px "Helvetica Neue",
Helvetica, Arial, sans-serif;
}
Блочная модель.
Прежде чем перейти к блочной модели, нам надо понимать, как отображаются
элементы. Блочные элементы занимают всю доступную ширину независимо от их
содержимого и начинаются с новой строки. Строчные элементы занимают ширину,
которая требуется для содержимого и выстраиваются на одной строке, друг за другом.
Блочные элементы, как правило, используются для больших кусков контента, таких как
заголовки и структурные элементы. Строчные элементы, как правило, применяются для
маленьких частей содержимого, таких как несколько слов, выделенных жирным или
курсивным начертанием.
display.
Как именно отображаются элементы - как блочные или строчные или как-то ещё,
определяется свойством display. Каждый элемент содержит значение свойства display по
умолчанию, но как и с любым другим значением свойств, это значение может быть
переписано. Есть немало значений для свойства display, но наиболее распространённые
это:



block;
inline;
none.
Мы можем изменить значение свойства display элемента, выбрав этот элемент в
CSS и задав новое значение свойства display. Значение block сделает этот элемент
блочным.
p {
display: block;
}
Значение inline сделает этот элемент строчным.
p {
display: inline;
}
В заключение, используя значение none полностью скрываем элемент и
отображаем страницу, словно элемента не существует. Любые элементы, вложенные в
такой элемент, также будут скрыты.
div {
display: none;
}
Знание, как отображаются элементы и как изменить display довольно важно, так
как display оказывает влияние на отображение блочной модели. В процессе обсуждения
блочной модели мы обязательно взглянем на эти разные последствия и как они могут
повлиять на представление элемента.
Что такое блочная модель?
В соответствии с концепцией блочной модели, каждый элемент на странице
представляет собой прямоугольный блок и может иметь ширину, высоту, поля, границы и
отступы.
Это стоит повторить: Каждый элемент на странице представляет собой
прямоугольный блок.Каждый элемент на каждой странице соответствует блочной модели,
так что это невероятно важно. Давайте взглянем на неё, наряду с несколькими новыми
свойствами CSS, чтобы лучше понять, как мы можем с этим работать.
Работа с блочной моделью.
Каждый элемент представляет собой прямоугольный блок и есть несколько
свойств, которые устанавливают размер этого блока. Внутренность блока определяется
шириной и высотой элемента, который может быть задан свойством display, содержимым
элемента или свойствами width и height. padding и затем border расширяют размеры блока
наружу от ширины и высоты элемента. Наконец, любой указанный margin идёт за
пределами рамки.
Каждая часть блочной модели соответствует свойству CSS: width, height, padding,
border и margin.
Взглянем на эти свойства внутри некоторого кода:
div {
border: 6px solid #949599;
height: 100px;
margin: 20px;
padding: 20px;
width: 400px;
}
В соответствии с блочной моделью общая ширина элемента может быть
рассчитана по следующей формуле:
margin-right + border-right + padding-right + width + padding-left + border-left + margin-left
Используя эти формулы, мы можем найти общую высоту и ширину блока из
нашего примера.
Ширина: 492px = 20px + 6px + 20px + 400px + 20px + 6px + 20px
Высота: 192px = 20px + 6px + 20px + 100px + 20px + 6px + 20px
Блочная модель, без сомнения, одна из наиболее запутанных частей HTML и CSS.
Мы устанавливаем значение свойства width как 400 пикселей, но фактическая ширина
нашего элемента 492 пикселя. По умолчанию блочная модель коробка аддитивна. Таким
образом, для определения фактического размера блока мы должны принять во внимание
поля, границы и отступы для всех четырёх сторон блока. Наша ширина включает не
только значение свойства width, но и размер левого и правого поля, левую и правую
границу, левые и правые отступы.
width и height.
У каждого элемента есть ширина и высота по умолчанию. Эта ширина и высота
может быть равна нулю, но браузеры по умолчанию отображают каждый элемент с
размером. В зависимости от того, как отображается элемент, ширина и высота по
умолчанию может быть соответствующей. Если элемент является ключевым в макете
страницы, для него может потребоваться задать определённые значения свойств width и
height. В этом случае значения свойств для не строчных элементов могут быть
указанными.
width.
По умолчанию ширина элемента основана на значении display. У блочных
элементов ширина по умолчанию 100% и занимает всё доступное горизонтальное
пространство. Строчные и строчно-блочные элементы расширяются и сжимаются
горизонтально для размещения их содержимого. Строчные элементы не могут иметь
фиксированный размер, таким образом, ширина и высота относятся только к не строчным
элементам. Чтобы задать определённую ширину для не строчных элементов, используйте
свойство width:
div {
width: 400px;
}
height.
Высота элемента по умолчанию определяется его содержимым. Элемент будет
расширяться и сжиматься по вертикали при необходимости, чтобы вместить его
содержимое. Установить определённую высоту для не строчных элементов можно через
свойство height:
div {
height: 100px;
}
margin и padding.
В зависимости от элемента, браузеры могут применять отступы и поля по
умолчанию для элемента, чтобы помочь с удобочитаемостью. Мы, как правило, видим это
на текстовых элементах. Поля и отступы по умолчанию для этих элементов могут
отличаться от браузера к браузеру и от элемента к элементу.
margin.
Свойство margin позволяет нам установить пространство, которое окружает
элемент. margin находятся за пределами любых границ и полностью прозрачны в цвете.
Они могут использоваться для позиционирования элементов в конкретном месте на
странице или добавить пустое пространство, сохраняя все другие элементы на безопасном
расстоянии. Вот свойство margin в действии:
div {
margin: 20px;
}
Одной из причуд margin являются вертикальные значения, сверху и снизу, они не
применяются к строчным элементам, но применяются к блочным и строчно-блочным
элементам.
padding.
Свойство padding очень похоже на свойство margin, однако располагается внутри
границ элемента. Свойство padding используется, чтобы задать пространство
непосредственно внутри элемента. Вот код:
div {
padding: 20px;
}
Свойство padding в отличие от margin работает вертикально для строчных
элементов. Вертикальный padding может сливаться со строкой выше или ниже данного
элемента, но будет отображаться.
Установка margin и padding.
В CSS существует несколько способов установить значения определённых свойств.
Мы можем использовать обычную запись, в которой перечисляется несколько свойств и
значений одно за другим, в котором у каждого значения есть собственное свойство. Или
мы можем использовать сокращённую запись, перечисляя несколько значений одного
свойства. Не у всех свойств есть сокращённый вариант, таким образом, мы должны
убедиться что используем правильное свойство и структуру значений.
Свойства margin и padding существуют в обычном и сокращённом виде. При
использовании сокращённого свойства margin, чтобы установить одно значение для всех
четырёх сторон элемента мы задаём одно значение:
div {
margin: 20px;
}
Чтобы установить одно значение для верхней и нижней стороны, а другое значение
для левой и правой стороны элемента, укажите два значения: вначале сверху и снизу,
затем слева и справа. Здесь для <div> мы задаём отступы 10 пикселей сверху и снизу и 20
пикселей слева и справа:
div {
margin: 10px 20px;
}
Чтобы установить уникальные значения для всех четырёх сторон элемента,
укажите эти значения в следующем порядке: сверху, справа, снизу и слева, двигаясь по
часовой стрелке. Здесь мы задаём для <div> отступы 10 пикселей сверху, 20 пикселей
справа, 0 пикселей снизу и 15 пикселей слева.
div {
margin: 10px 20px 0 15px;
}
Использование свойства margin или padding с любым числом значений считается
сокращением. В обычной записи мы можем установить значение только для одной
стороны используя уникальные свойства. После имени каждого из свойств (margin или
padding в данном случае) идёт дефис и сторона блока, к которой должно применяться
значение:




top;
right;
bottom;
left.
Например, свойство padding-left принимает только одно значение и установит
левое поле для этого элемента, свойство margin-top принимает только одно значение и
установит верхний отступ для этого элемента.
div {
margin-top: 10px;
padding-left: 6px;
}
Когда мы хотим определить только одно значение margin или padding, то лучше
использовать обычную запись. Это сохраняет наш код наглядным и помогает избежать
путаницы по пути вниз. Например, вы действительно хотите установить margin в 0
сверху, справа и слева элемента или же на самом деле хотите установить margin снизу в
10 пикселей? Использование обычной записи для свойств и значений помогает нам это
делать осмысленно. С другой стороны, когда имеешь дело с тремя или более значениями,
сокращение невероятно полезно.
Границы.
Границы располагаются между отступами и полями, создавая рамку вокруг
элемента. Для свойства border требуется три значения:

ширина;


стиль;
цвет.
Сокращённая запись для border задаётся этом же порядке — ширина, стиль, цвет. В
обычной записи эти три значения могут быть разбиты по свойствам border-width, borderstyle и border-color. Обычная запись полезна для изменения или переписывания
отдельного значения границы.
У границ может быть различный внешний вид.
Таблица 4.
Название
none
dotted
dashed
solid
double
groove
ridge
inset
outset
inherit
Описание
Линия не отображается и значение ее
толщины обнуляется.
Линия состоящая из набора точек.
Пунктирная линия, состоящая из серии
коротких отрезков.
Сплошная линия.
Двойная линия.
Создает эффект вдавленной линии.
Создает эффект рельефной линии.
Псевдотрехмерная линия.
Псевдотрехмерная линия.
Наследует значение родителя.
Вот код для сплошной серой границы толщиной 6 пикселей для всех четырёх сторон
<div>:
div {
border: 6px solid #949599;
}
Границы для отдельных сторон.
Как и со свойствами margin и padding границы могут быть размещены на одной
стороне элемента за раз при желании. Это требует новых свойств:
 border-top;
 border-right;
 border-bottom;
 border-left.
Значения для этих свойств такие же, как и для border: ширина, стиль и цвет. При
желании можно сделать так, чтобы граница появлялась только внизу элемента:
div {
border-bottom: 6px solid #949599;
}
Кроме того, стилями для отдельных сторон можно управлять на ещё более тонком
уровне. Например, если мы хотим изменить только ширину нижней границы, то можем
использовать следующий код:
div {
border-bottom-width: 12px;
}
Такое довольно специфичное свойство границы включают в себя ряд разделённых
дефисом слов, начинающихся с border, затем идёт выбранная сторона — top, right, bottom
или left, а затем width, style или color, в зависимости от желаемого свойства.
Радиус границы.
Пока мы рассматриваем границы и их разные свойств, нам нужно изучить свойство
border-radius, которое позволяет нам закруглять углы элемента.
Свойство border-radius принимает единицы размера, в том числе проценты и пиксели,
которые определяют радиус скругления углов элемента. Единственное значение
закругляет все четыре угла элемента в равной степени; два значения закругляют левый
верхний/правый нижний и правый верхний/левый нижний углы в таком порядке; четыре
значения закругляют левый верхний, правый верхний, правый нижний и левый нижний
углы в таком порядке.
При рассмотрении порядка, когда несколько значений применяются к свойству borderradius (заодно к margin и padding), помните, что они идут по часовой стрелке, начиная с
левого верхнего угла элемента.
div {
border-radius: 5px;
}
Инструменты разработчика.
В большинстве браузеров есть то, что известно как Инструменты разработчика.
Эти инструменты позволяют нам проверить элемент на странице, увидеть, где этот
элемент живёт в HTML-документе и посмотреть, какие свойства и значения CSS к нему
применяются. Большинство из этих инструментов также включают в себя схему блочной
модели, чтобы показать вычисленный размер элемента.
Чтобы увидеть Инструменты разработчика в Google Chrome, откройте меню,
выберите «Дополнительные инструменты», а затем «Инструменты разработчика». После
этого откроется панель в нижней части окна браузера, которая предлагает несколько
инструментов для проверки нашего кода.
Щелчок по стрелке в нижней части этой панели позволяет выделять и щёлкать по
разным элементам на странице, чтобы узнать о них больше информации.
После выбора элемента мы увидим несколько вкладок в правой части панели
«Elements» в инструментах разработчика. Выбор вкладки «Computed» покажет нам
подробную блочную модель для нашего выбранного элемента.
Поиграйте с инструментами разработчика, будь они в Google Chrome, Mozilla
Firefox, Apple Safari или других браузерах; можно многое узнать просматривая наш код. Я
вообще оставляю панель инструментов всегда открытыми при написании HTML и CSS. И
также часто проверяю код других сайтов, чтобы увидеть, как они сделаны.
3. Вывод.
В результате выполнения практической работы «Знакомство с CSS»были рассмотрены
основные атрибуты таблицы стилей.
4. Задание
Оформить свой HTML-документ с помощью таблицы стилей.
5. Контрольные вопросы
c.
d.
e.
f.
Для чего нужна каскадная таблица стилей?
Какие способы подключения таблицы стилей вы знаете?
Чем отличается идентификатор от класса?
Что такое блочная модель и зачем она нужна?
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 5
«Разметка страницы на основе блоков CSS»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
1. Цель работы.
В процессе выполнения практической работы необходимо научится создавать Webстраницы при помощи блочной вёрстки.
2. Теоретические сведения.
Общие сведения.
Большинство современных сайтов построено по принципу блочной вёрстки. Т.е.,
макет сайта верстается из тегов <div>, которые позиционируются определённым образом.
Вёрстка макета.
Для начала разберём следующий макет:
HEADER
CONTENT
LEFT
FOOTER
Как видно в макете имеется 4 блока:




HEADER («шапка» сайта);
LEFT (Левое меню);
CONTENT (Содержимое сайта);
FOOTER («Подвал» сайта).
Это всё DIVблоки. Все эти блоки заключены в общий контейнер, обозначенный
красной линией на рисунке. Данный контейнер нужен, чтобы собрать все блоки воедино.
Шаг 1. Создаём документ HTML и документ CSS
Шаг 2. HTML документе создаём блоки DIV, указанные на рисунке
<div id="container">
<div id="header">HEADER</div>
<div id="left">LEFT</div>
<div id="content">CONTENT</div>
<div id="footer">FOOTER</div>
</div>
На данном этапе это будет выглядеть следующим образом:
Шаг 3. Чтобы блоки выделялись, зададим для каждого блока фоновый цвет. Также
необходимо выровнять наш макет (т.е. основной блок – container) по центру webстраницы и задать ему ширину.
Переходим в файл style.css
1)Чтобы макет вплотную прижимался к краям страницы, необходимо задать нулевые
отступы для тегов html и body.
body,
html {
margin:0px;
padding:0px;
}
2)Описываем стили для блока CONTAINER
Задаём ширину, например 800px и выравнивание по центру страницы.
#container {
width:800px;
margin:0 auto;
}
3) Зададим разны фоновые цвета для остальных блоков
#header {
background-color:#63b9da;
}
#left {
background-color:#a9d28c;
}
#content {
background-color:#d5d7b5;
}
#footer {
background-color:#d292bc;
}
Результат:
4) Зададим ширину для блока LEFT
width:200px;
5) Согласно рисунку создаваемого макета, необходимо чтобы блок CONTENT обтекал
блок LEFT справа. Для этого воспользуемся свойством – float для блока LEFT.
float: left;
По рисунку ниже видно, что при изменении высоты блока LEFT за счёт
добавляемого текста, блок FOOTER также будет обтекать его справа.
Также изменении высоты блока CONTENT, текст «залезет» на область блока LEFT
за счёт обтекания(см. рисунок ниже):
Для того, чтобы такого не произошло, блоку CONTENT задаём отступ слева чуть
больше чем ширина блока LEFT:
margin-left: 202px;
6) Необходимо отменить обтекание блока LEFT блоком FOOTER справа, как было
показано на рисунке в пункте 5. Для устранения этого недочёта, в HTML документе
добавляем ещё один пустой блок перед блоком FOOTER:
Теперь в CSS файле задаём свойства для блока CLEAR:
#clear {
clear: both;
}
Свойство clear: both означает, что данный блок (CLEAR) будет располагаться ниже
всех плавающих блоков. Плавающие блоки – это блоки, для которых задано свойство float
(т.е. обтекание). Таким образом, мы отменили обтекание ненужными блоками блока
LEFT.
Для того, чтобы созданный пустой блок CLEAR занимал как можно меньше места, в CSS
зададим для него следующие свойства:
height:0px; /* высота блока */
font-size:1px; /* размер шрифта */
line-height:0px; /* межстрочный интервал */
3. Вывод.
В результате выполнения практической работы «Блочная вёрстка»была создана Webстраница с использованием блочного метода.
4. Задание
Оформить справочник по любому из макетов, указанных в
приложении 1.
5. Контрольные вопросы
g. За что отвечает свойство float?
h. Для чего применяются свойства margin и padding?
Приложение 1.
Макет 1.
HEADER
CONTENT
RIGHT
FOOTER
Макет 2.
HEADER
CONTENT
FOOTER
Макет 3.
HEADER
LEFT
CONTENT
FOOTER
RIGHT
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 6
«Установка web-сервера Apache2 и модуля PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Установка Apache и настройка файрвола
Веб-сервер Apache в настоящее время является одним из самых популярных веб-серверов
в мире. Он хорошо документирован и используется значительную часть времени с
момента создания сети Интернет, что делает его прекрасным выбором для хостинга вебсайта.
Для начала установки выполним команды:
sudo apt-get update
sudo apt-get install apache2
Поскольку мы используем команду sudo, эти команды будут выполняться с привилегиями
root. В процессе операционная система запросит ваш пароль пользователя.
После ввода пароля apt сообщит, какие пакеты будут установлены и сколько места они
займут на диске. Нажмите Y и Enter для продолжения установки.
Настройка глобальной переменной ServerName
Далее мы добавим одну строку в /etc/apache2/apache2.conf для устранения
предупреждений (warnings) о синтаксических ошибках. Несмотря на то, что это просто
предупреждение и никакой проблемы не существует, если не задать глобальную
переменную ServerName, вы будете получать следующее предупреждение об ошибке при
проверке настройки конфигурации Apache:
sudo apache2ctl configtest
Вывод
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using
127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
Откройте главный конфигурационный файл в своём текстом редакторе командой:
sudo nano /etc/apache2/apache2.conf
Добавьте в конец файла переменную ServerName, указывающую на ваше основное
доменное имя. Если для вашего сервера не настроено доменное имя, вы можете
использовать публичный IP-адрес сервера:
/etc/apache2/apache2.conf
...
ServerName домен_или_IP_адрес_сервера
После этого сохраните и закройте файл.
Теперь можно проверить результат напечатав следующую команду:
sudo apache2ctl configtest
Поскольку мы установили глобальную переменную ServerName, вы должны увидеть
вывод следующего характера:
Вывод
Syntax OK
Перезапустите Apache для применения внесённых изменений:
sudo systemctl restart apache2
Проверить результат установки можно набрав в вашем веб-браузере публичный IP адрес
вашего сервера (если вы еще не знаете, как найти публичный IP адрес вашего сервера,
смотрите следующий раздел этой статьи):
http://домен_или_IP_адрес_сервера
Вы увидите страницу Apache, отображаемую по умолчанию для информации и целей
тестирования. Она должна выглядеть похожим образом:
Установка PHP
PHP это компонент, который будет обрабатывать код для отображения динамического
контента. Он может запускать скрипты, подключаться к нашим базам данных MySQL для
получения информации и передавать обработанный контент в наш веб-сервер для
отображения.
Мы можем вновь воспользоваться менеджером пакетов apt для установки компонентов.
Мы также добавим некоторые вспомогательные пакеты, чтобы код на PHP мог работать с
нашим сервером Apache, а также обращаться к базе данных MySQL:
sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql
Данная команда должна установить PHP без каких либо проблем. Вскоре мы это
проверим.
В большинстве случаев, мы захотим изменить способ, который использует Apache для
поиска файлов при запросе директории. На данный момент, если пользователь
запрашивает директорию с сервера, Apache в первую очередь будет искать файл с
названием index.html. Мы хотим, чтобы наш веб-сервер отдавал предпочтение PHP
файлам, так что мы настроим Apache таким образом, чтобы сначала он искал
файлы index.php.
Для этого введите следующую команду, чтобы открыть файл dir.conf в текстовом
редакторе с привилегиями root-пользователя:
sudo nano /etc/apache2/mods-enabled/dir.conf
Содержимое файла будет выглядеть следующим образом:
/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>
Мы хотим переместить PHP файл index.php, выделенный выше, на первое место после
спецификации DirectoryIndex следующим образом:
/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
После внесения правок сохраните и закройте файл сочетанием клавиш CTRL-X. Вам
придется подтвердить операцию вводом Y и затем нажатием клавиши ENTER для
подтверждения места сохранения файла.
После этого нам необходимо перезапустить Apache для применения внесенных
изменений. Вы можете сделать это при помощи команды:
sudo systemctl restart apache2
Мы также можем проверить статус сервиса apache2 используя systemctl:
sudo systemctl status apache2
ПримерВывода
● apache2.service - LSB: Apache2 web server
Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Wed 2016-04-13 14:28:43 EDT; 45s ago
Docs: man:systemd-sysv-generator(8)
Process: 13581 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
Process: 13605 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
Tasks: 6 (limit: 512)
CGroup: /system.slice/apache2.service
├─13623 /usr/sbin/apache2 -k start
├─13626 /usr/sbin/apache2 -k start
├─13627 /usr/sbin/apache2 -k start
├─13628 /usr/sbin/apache2 -k start
├─13629 /usr/sbin/apache2 -k start
└─13630 /usr/sbin/apache2 -k start
Apr 13 14:28:42 ubuntu-16-lamp systemd[1]: Stopped LSB: Apache2 web server.
Apr 13 14:28:42 ubuntu-16-lamp systemd[1]: Starting LSB: Apache2 web server...
Apr 13 14:28:42 ubuntu-16-lamp apache2[13605]: * Starting Apache httpd web server apache2
Apr 13 14:28:42 ubuntu-16-lamp apache2[13605]: AH00558: apache2: Could not reliably
determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerNam
Apr 13 14:28:43 ubuntu-16-lamp apache2[13605]: *
Apr 13 14:28:43 ubuntu-16-lamp systemd[1]: Started LSB: Apache2 web server.
Установка модулей PHP
Чтобы расширить функциональность PHP, мы можем установить некоторые
дополнительные модули.
Для просмотра доступных опций для модулей и библиотек PHP вы можете передать
результат apt-cache search в less, которая позволит вам проматывать вывод:
apt-cache search php- | less
Используйте клавиши стрелок вверх и вниз для промативания списка, для выхода
нажмите q.
В результате вам будут показаны все опциональные компоненты, которые можно
установить, сопровождаемые коротким описанием для каждого:
libnet-libidn-perl - Perl bindings for GNU Libidn
php-all-dev - package depending on all supported PHP development packages
php-cgi - server-side, HTML-embedded scripting language (CGI binary) (default)
php-cli - command-line interpreter for the PHP scripting language (default)
php-common - Common files for PHP packages
php-curl - CURL module for PHP [default]
php-dev - Files for PHP module development (default)
php-gd - GD module for PHP [default]
php-gmp - GMP module for PHP [default]
...
:
Чтобы получить больше информации по каждому модулю, вы можете поискать в
Интернете или посмотреть полное описание пакета при помощи команды:
apt-cache show package_name
Ответ будет содержать много текста, среди которого есть поле Description-en. Именно оно
и будет содержать расширенное описание функциональности, предоставляемой модулем.
Например, чтобы узнать назначение модуля php-cli, мы можем выполнить команду:
apt-cache show php-cli
Помимо большого количества прочей информации, вы увидите следующее:
Если после изучение вы решили, что хотите установить пакет, вы можете сделать это
используя команду apt-get install как мы делали ранее при установке другого
программного обеспечения.
Если мы решили, что хотим установить php-cli, мы можем ввести команду:
sudo apt-get install php-cli
Для установки сразу нескольких модулей, вы можете перечислить их через пробелы
следом за командой apt-get install следующим образом:
sudo apt-get install package1 package2 ...
Теперь ваш стек LAMP установлен и сконфигурирован. Однако нам еще предстоит
протестировать PHP.
Шаг 4 - Тестирование работы PHP на вашем веб-сервере
Чтобы проверить, что наша система сконфигурирована должным образом, мы можем
создать простой PHP скрипт.
Назовем скрипт info.php. Чтобы Apache нашел и обработал файл корректно, он должен
быть сохранен в специальную директорию, которая называется "web root".
Данная директория находится по адресу /var/www/html/. Мы можем создать там файл
введя следующую команду:
sudo nano /var/www/html/info.php
Откроется пустой файл. Мы хотим ввести в файл следующий текст, который является
корректным PHP кодом:
info.php
<?php
phpinfo();
?>
После внесения изменений сохраните и закройте файл.
Теперь мы можем проверить, может ли веб-сервер корректно отображать контент,
сгенерированный PHP скриптом. Для проверки нам просто нужно открыть данную
страницу в веб-браузере. Вам снова потребуется публичный IP-адрес сервера.
Откроем этот адрес:
http://домен_или_IP_адрес_сервера/info.php
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 7
«Переменные и операторы PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
1. Цель работы.
Закрепление теоритических знаний и навыков работы с операторами и
переменными в PHP.
2. Теоретические сведения.
Переменные PHP.
Переменные в PHP представлены знаком доллара с последующим именем переменной.
Имя переменной чувствительно к регистру.
Имена переменных соответствуют тем же правилам, что и остальные наименования в
PHP. Правильное имя переменной должно начинаться с буквы или символа
подчеркивания и состоять из букв, цифр и символов подчеркивания в любом количестве.
Замечание:$this- это особая переменная, которой нельзя ничего присваивать.
<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var";
$4site = 'not yet';
$_4site = 'not yet';
$täyte = 'mansikka';
?>
// выведет "Bob, Joe"
// неверно; начинается с цифры
// верно; начинается с символа подчеркивания
// верно; 'ä' это (Расширенный) ASCII 228.
Арифметические операторыPHP.
Пример
+$a
Название
Идентичность
-$a
$a +
$a $a *
$a /
Отрицание
Сложение
Вычитание
Умножение
Деление
$b
$b
$b
$b
$a % $b
Деление по модулю
$a ** $b
Возведение в степень
Результат
Конвертация $a в int или
float, что более подходит.
Смена знака $a.
Сумма $a и $b.
Разность $a и $b.
Произведение $a и $b.
Частное от деления $a на
$b.
Целочисленный остаток от
деления $a на $b.
Возведение $a в степень $b.
Добавлено в PHP 5.6.
Операция деления ("/") возвращает число с плавающей точкой, кроме случая, когда оба
значения являются целыми числами (или строками, которые преобразуются в целые
числа), которые делятся нацело - в этом случае возвращается целое значение.
3. Задание
Составить программу для вычисления следующих свойств
звукового файла:
•
•
•
Объем в Кб звукового файла в формате .wav, если известны длительность его
звучания, частота дискретизации и глубина оцифровки.
Частоту дискретизации, которая использовалась при звукозаписи, если известны
глубина оцифровки, а также объем и длительность звучания файла.
Время звучания в секундах аудиофайла в формате .wav, если известны его объем,
частота дискретизации и глубина оцифровки.
Оформить отчет с блок-схемой и комментариями к исходному коду.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 8
«Условные операторы и циклы PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
1. Цель работы.
Закрепление теоритических знаний и навыков работы с циклами в PHP.
2. Теоретические сведения.
Циклы в PHP.
Циклы позволяют повторять определенное (и даже неопределенное - когда работа цикла
зависит от условия) колличество раз различные операторы. Данные операторы
называются телом цикла. Проход цикла называется итерацией.
PHP поддерживает три вида циклов:
•
•
•
•
Цикл с предусловием (while);
Цикл с постусловием (do-while);
Цикл со счетчиком (for);
Специальный цикл перебора массивов (foreach).
При использовании циклов есть возможность использования операторов break и continue.
Первый из них прерывает работу всего цикла, а второй - только текущей итерации.
Цикл с предусловием while.
Цикл с предусловием while работает по следующим принципам:
•
•
Вычисляется значение логического выражения.
Если значение истинно, выполняется тело цикла, в противном случае – переход на
следующий за циклом оператор.
Синтаксис цикла с предусловием:
while (логическое_выражение)
инструкция;
пример цикла с предусловием while:
<?php
$x=0;
while ($x<10)
{
$x++; // Увеличение счетчика
echo $x;
}
// Выводит 12345678910
?>
Цикл с постусловием do while.
В отличие от цикла while, этот цикл проверяет значение выражения не до, а после каждого
прохода (итерации). Таким образом, тело цикла выполняется хотя бы один раз.
Синтаксис цикла с do while:
do
{
тело_цикла;
}
while (логическое_выражение);
После очередной итерации проверяется, истинно ли логическое_выражение, и, если это
так, управление передается вновь на начало цикла, в противном случае цикл обрывается.
Пример цикла с постусловием do-while:
<?php
$x = 1;
do {
echo $x;
$x++;
} while ($x<10);
// Выводит 123456789
?>
Цикл со счетчиком for.
Цикл со счетчиком используется для выполнения тела цикла определенное число раз.
Синтаксис цикла for:
for (инициализирующие_команды; условие_цикла;
команды_после_итерации)
{
тело_цикла;
}
Цикл for начинает свою работу с выполнения инициализирующих_команд. Данные
команды выполняются только один раз. После этого проверяется условие_цикла, если оно
истинно (true), то выполняется тело_цикла. После того, как будет выполнен последний
оператор тела, выполняются команды_после_итерации. Затем снова проверяется
условие_цикла.
Если
оно
истинно
(true),
выполняется
тело_цикла
и
команды_после_итерации, и.т.д.
Примерциклаfor:
<?php
for ($x=0; $x<10; $x++)
{
echo $x;
}
// Выводит 123456789
?>
Цикл перебора массивов foreach.
Также в PHPсуществует специальный тип цикла - foreach. Данный цикл предназначен
специально для перебора массивов.
Синтаксис цикла foreach:
foreach (массив as $ключ=>$значение)
команды;
Здесь команды циклически выполняются для каждого элемента массива, при этом
очередная пара ключ=>значение оказывается в переменных $ключ и $значение.
Примерциклаforeach:
<?php
$array =
'a'
'b'
'c'
];
[
=> 'статьи',
=> 'вопросы',
=> 'ответы'
foreach($array as $k => $v)
{
echo $k . ': ' . $v . '; ';
}
// Выведет a:статьи; b:вопросы; c:ответы
?>
Конструкция break.
Очень часто для того, чтобы упростить логику какого-нибудь сложного цикла, удобно
иметь возможность его прервать в ходе очередной итерации (к примеру, при выполнении
какого-нибудь особенного условия). Для этого и существует конструкция break, которая
осуществляет немедленный выход из цикла.
Пример:
<?php
$x=0;
while ($x<10) {
if ($x==3) break;
echo "<b>Итерация $x</b><br>";
$x++;
}
// Когда $x равен 3, цикл прерывается
?>
Рассмотренный сценарий выводит:
Итерация 0
Итерация 1
Итерация 2
Конструкция continue.
Конструкция continue так же, как и break, работает только "в паре" с циклическими
конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к
новой (конечно, если выполняется условие цикла для цикла с предусловием).
<?php
$x=0;
while ($x<5) {
if ($x==3) continue;
echo "<b>Итерация $x</b><br>";
$x++;
}
// Цикл прервется только на третьей итерации
?>
Рассмотренный скрипт выводит:
Итерация 1
Итерация 2
Итерация 4
Итерация 5
3. Задание
Составить программу для кодирования сообщения с помощью
метода арифметического кодирования:
Программа должна выводить:
•
•
•
Таблицу исходных диапазонов, частот и вероятностей;
Таблицу процессов кодирования;
Таблицу процессов декодирования.
Оформить отчет с блок-схемой и комментариями к исходному коду.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 9
«Массивы PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Определение массива
Рано или поздно каждому программисту приходится сталкиваться с таким понятием
как массив. Массивом можно считать разновидность переменных, в котором храниться
несколько значений. Массив определяется при помощи конструкции array(), в круглых
скобках которой указываются его значения:
<?php
$arr = array('PHP', 'MySQL', 'Apache');
?>
или
<?php
$arr[] = "PHP";
$arr[] = "MySQL";
$arr[] = "Apache";
?>
В C-подобных языках программирования, индекс массива традиционно начинается с 0.
Это означает, что если мы захотим вывести первое значение массива "PHP", нам
потребуется обратиться к нулевому индексу:
<?php
echo $arr[0]; // PHP
?>
Если требуется начать массив с другого индекса, например, с 1, то необходимо явно это
указать в конструкции array():
<?php
$arr = array(1 => "PHP",
2 => "MySQL",
3 => "Apache");
?>
или
<?php
$arr[1] = "PHP";
$arr[2] = "MySQL";
$arr[3] = "Apache";
?>
Элементы массива можно использовать в двойных кавычках как обычные переменные,
так код
<?php
echo "$arr[1] $arr[2] $arr[3]";
?>
иличерезцикл:
<?php
for ($i = 1; $i <= 3; $i++)
{
echo $arr[$i]." ";
}
?>
Следует заметить, что число элементов в массиве не обязательно знать заранее — его
можно вычислить при помощи функции count():
<?php
for ($i = 1; $i <= count($arr); $i++)
{
echo $arr[$i]." ";
}
?>
Выведет строку "PHP MySQL Apache". В качестве индексов массива могут выступать не
только числа, но и строки:
<?php
$arr = array("first" => "PHP",
"second" => "MySQL",
"third" => "Apache");
?>
или
<?php
$arr["first"] = "PHP";
$arr["second"] = "MySQL";
$arr["third"] = "Apache";
?>
В этом случае массив называется ассоциативным, а его индексы называются ключами.
Для вывода элемента массива в строке кавычки (ни двойные, ни одинарные) указывать не
следует:
<?php
echo "$arr[first] $arr[second] $arr[third]";
?>
Так как у ассоциативных массивов нет индексов, для обхода их введён специальный вид
цикла — foreach:
<?php
foreach($arr as $key => $value)
{
echo "$key = $value <br />";
}
?>
В результате работы цикла будет выведено три строки
first = PHP
second = MySQL
third = Apache
Конструкция "$key =>", позволяющая получить доступ к ключу массива на каждом из
циклов является не обязательно и может быть опущена:
<?php
foreach($arr as $value)
{
echo "$value <br />";
}
?>
Ряд функций, также позволяют возвращать массивы, например, функция file(), которая
читает файл и возвращает его содержимое в виде массива. Каждый элемент массива
соответствует одной строке.
<?php
$arr = file("text.txt");
for($i = 0; $i < count($arr); $i++)
{
echo $arr[$i]."<br />";
}
?>
Другой полезной функцией является функция explode(), которая позволяет разбить строку
на несколько фрагментов, каждый из которых помещается в отдельный элемент массива:
<?php
$str = "345|mail@mail.ru|http://www.softtime.ru|login|password";
$arr = explode("|",$str);
for($i = 0; $i < count($arr); $i++)
{
echo $arr[$i]."<br />";
}
?>
Результат работы скрипта может выглядеть следующим образом:
345
mail@mail.ru
http://www.softtime.ru
login
password
Существует и обратная функция — implode(), которая объединяет, элементы массива в
строку, используя для этого заданный разделитель:
<?php
$arr[] = "345";
$arr[] = "mail@mail.ru";
$arr[] = "http://www.softtime.ru";
$arr[] = "login";
$arr[] = "password";
$str = implode("##",$arr);
echo $str; //345##mail@mail.ru##http://www.softtime.ru##login##password
?>
Замечание
Вообще функций, которые потрошат строку превеликое множество, рассмотрение всех их
выходят за рамки данной статьи.
Удалить отдельный элемент массива можно при помощи функции unset(), а проверить
существование массива можно при помощи функции isset(). Определим массив из 10
элементов и уничтожим каждый чётный элемент.
<?php
$arr = array(9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
unset($arr[0], $arr[2], $arr[4], $arr[6], $arr[8]);
// Проверяем существуют ли элементы массива
for($i = 0; $i < 10; $i++)
{
if(isset($arr[$i])) echo "Элемент $arr[$i] определён <br />";
else echo "Элемент $arr[$i] не определён <br />";
}
?>
Результатом работы скрипта из будут следующие строки
Элемент $arr[0] не определён
Элемент $arr[1] определён
Элемент $arr[2] не определён
Элемент $arr[3] определён
Элемент $arr[4] не определён
Элемент $arr[5] определён
Элемент $arr[6] не определён
Элемент $arr[7] определён
Элемент $arr[8] не определён
Элемент $arr[9] определён
При помощи функции unset() можно уничтожить весть массив сразу.
<?php
$arr = array(9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
unset($arr);
if(isset($arr)) echo "Массив определён";
else echo "Массив не определён";
?>
До этого массивы выводились при помощи цикла, однако в PHP предусмотрена
специальная функция для вывода дампа массива print_r(). Функция ориентирована на
вывод в консольный поток, поэтому при выводе результатов в окно браузера лучше
обрамить её тэгами <pre> и </pre>:
<?php
$arr[] = "345";
$arr[] = "mail@mail.ru";
$arr[] = "http://www.softtime.ru";
$arr[] = "login";
$arr[] = "password";
echo "<pre>";
print_r($arr);
echo "</pre>";
?>
Результат работы скрипта выглядит следующим образом:
Array
(
[0] => 345
[1] => mail@mail.ru
[2] => http://www.softtime.ru
[3] => login
[4] => password
)
Многомерные массивы
В качестве элементов массива могут выступать не только скалярные величины, но и сами
массивы. В этом случае получаются так называемые многомерные массивы.
Пусть необходимо получить такую таблицу:
Имя
Профессия Зарплата
Вася
Слесарь
2500
Миша
Строитель
3000
Андрей Шофер
2700
Для этого создадим двумерный массив:
<?php
$arr = array( array(‘Вася’, ‘слесарь’, 2500 ),
array(‘Миша’,’строитель’, 3000),
array(‘Андрей’, ‘шофер’, 2700));
?>
Теперь таблицу можно вывести при помощи следующего кода:
<?php
for ($i = 0; $i < 3; $i++)
{
for ($j=0; $j <3; $j++)
{
echo ' | '.$arr[$i][$j];
}
echo '<br />';
}
?>
Результат:
| Вася | слесарь | 2500
| Миша | строитель | 3000
| Андрей | шофер | 2700
Также можно использовать трехмерные, четырехмерные и т.п. массивы.
Операции над массивами (сборник рецептов)
1) Определения числа элементов в массиве count():
Создадиммассив $name:
<?php
$name = array('Boss', 'Lentin', 'NAV', 'Endless', 'Dragons', 'SiLeNT', 'Doctor', 'Lynx');
?>
Чтобы определить число элементов в массиве можно поступить следующим образом:
<?php
echo ‘Число элементов в массиве - ’.count($name);
?>
Результат:
Число элементов в массиве – 8
2) Объединение массивов
a) Создадим два ассоциативных массива $a и $b:
<?php
$a = array(“a” => ”aa”, “b” => “bb”);
$b = array(“c” => ”cc”, “d” => “dd”);
?>
Пусть необходимо создать массив $c, которые будет содержать как элементы массива $a
так и массива $b:
<?php
$a = array("a"=>"aa", "x"=>"xx");
$b = array("c"=>"cc", "d"=>"dd");
$c = $a + $b;
echo "<pre>";
print_r($c);
echo "</pre>";
?>
Результат:
Array
(
[a] =>aa
[x] =>xx
[c] =>cc
[d] =>dd
)
b) Создадим два числовых массива $a и $b:
<?php
$a = array(10,20);
$b = array(100,200,300,400,500);
?>
Их уже не получится объединить при помощи конструкции $c = $a + $b;. Для их
объединения потребуется воспользоваться функцией array_merge():
<?php
$c = array_merge($a,$b);
?>
3) Сортировка массива
Воспользуемся массивом $name:
<?php
$name = array('Boss', 'Lentin', 'NAV', 'Endless', 'Dragons', 'SiLeNT', 'Doctor', 'Lynx');
?>
Пусть требуется отсортировать массив в алфавитном порядке, для этого можно
воспользоваться следующим кодом:
<?php
sort($name);
echo "<pre>";
print_r($name);
echo "</pre>";
?>
Результат:
Array
(
[0] => Boss
[1] => Doctor
[2] => Dragons
[3] => Endless
[4] => Lentin
[5] => Lynx
[6] => NAV
[7] => SiLeNT
)
Пусть необходимо из массива $name выбрать самый короткий элемент(у которого
наименьшее количество символов), в этом случае можно воспользоваться кодом:
<?php
$name = array('Boss', 'Lentin', 'NAV', 'Endless', 'Dragons', 'SiLeNT', 'Doctor', 'Lynx');
$min = strlen($name[0]);
$nam = $name[0];
for ($i=1; $i < count($name); $i++)
{
$len = strlen($name[$i]);
if ($len < $min)
{
$nam = $name[$i];
$min = strlen($nam);
}
}
echo 'Наименьшаядлина - '.$nam;
?>
4) Перемещение внутри массива
Создадим массив $num:
<?php
$num = array(1,2,3,4,5,6,7,8,9,10);
?>
Пусть требуется отобразить элементы массива в обратном порядке, в этом случае можно
воспользоваться кодом:
<?php
$end = end($num);
While ($end)
{
echo $end.' - ';
$end = prev($num);
}
?>
Результат:
10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 – 1
Приведённый выше код можно модифицировать:
<?php
$num = range(1,10);
print_r (array_reverse($num));
?>
Функция range(1,10) создает массив (1,2,3,4,5,6,7,8,9,10) со случайным расположением
элементов. Функция array_reverse() принимает массив и располагает элементы в
обратном порядке (10,9,8,7,6,5,4,3,2,1)
Функции next(), each() перемещают указатель на один элемент вперед.
Функция reset() возвращает указатель на 1 элемент в массиве. Воспользуемся массивом
$num:
<?php
$num = array(1,2,3,4,5,6,7,8,9,10);
?>
Пусть необходимо вывести все элементы по порядку, и на последнем элементе массива
вернуть указатель на первый элемент массива. Эту операцию можно осуществить при
помощи следующего кода:
<?php
$i=0; //Индекс 1 элемента
while ($i < count($num))
{
echo $num[$i].' ';
$i++;
//Проверкаесли $iравенчислуэлементоввмассиве
//тогдавыводимпоследнийэлементивозвращаемуказатель
if ($num[$i] == count($num))
{
echo $num[$i];
reset ($num);
echo '<br />'."Конецмассива";
exit();
}
}
?>
Результат:
1 2 3 4 5 6 7 8 9 10
Конец массива
5) Перемешивание элементов в массиве shuffle()
Функция shuffle() перемешивает значения в массиве, и если массив ассоциативный то
возвращает его как список:
<?php
$a = array(43,'PHP',4,57,'Boss',90);
shuffle($a);
foreach ($a as $n) echo "$n ";
?>
6) Случайный элемент массива
Если имеется готовый массив, из которого необходимо вывести один случайный элемент,
для этого необязательно перемешивать весь массив при помощи функции shuffle(),
достаточно сгенерировать случайный индекс массива:
<?php
// Определяем массив
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Генерируем случайный индекс массива
$index = rand(0,count($arr) - 1);
// Выводим случайный элемент массива
echo $arr[$index];
?>
7) Получение части массива array_slice()
Создадиммассив $a
<?php
$a = array(‘a’,’b’,’3’,’5’,’f’);
?>
Получить часть массива можно при помощи следующего кода:
<?php
$b = array_slice($a, 2) // вывод 3, 5, f
$b = array_slice($a,0,3) // a, b, 3
?>
8) Сериализация массива
Функции serialize() и unserialize() позволяют осуществлять упаковку и распаковку,
соответственно, массивов и объектов.
Замечание
Сериализация впервые появилась в объектно-ориентированных библиотеках, (первой из
которых была MFC), потом сериализация стала появляться в объектно-ориентированных
языках (Java). Идея сериализации заключается в том, что объекты и массивы очень
сложны по своей структуре и на сохранения их путём перебора каждого элемента
требуется значительный объём кода — самым простым решением является сохранение
таких структур в виде единой закодированной последовательности — байт-коде. В PHP
функции сериализации упаковывают данные не виде байт-кода, а виде строки.
<?php
$poll[0] = 23;
$poll[1] = 45;
$poll[2] = 34;
$poll[3] = 2;
$poll[4] = 12;
// Упаковываем массив в строку
$str = serialize($poll);
echo $str."<br />";
// Извлекаем массив из строки
$arr = unserialize($str);
print_r($arr);
?>
Результат:
a:5:{i:0;i:23;i:1;i:45;i:2;i:34;i:3;i:2;i:4;i:12;}
Array
(
[0] => 23
[1] => 45
[2] => 34
[3] => 2
[4] => 12
)
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 10
«Ассоциативные массивы PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Ассоциативный массив - массив, у которого каждый элемент состоит из
пары ключ => значение. Ключ - строка, используемая вместо числового индекса, для
доступа к значению элемента.
Создание ассоциативного массива
Ассоциативный массив можно создать как с помощью конструктора array(), так и при
помощи короткого синтаксиса - квадратных скобок. Для указания элементов используется
формат ключ => значение:
1
2
3
4
5
$my_array= array('foo'=> 'bar',
'bar'=> 'foo');
$my_array= ['foo'=> 'bar',
'bar'=> 'foo'];
С отступами, которые вы видите в этом примере, легче добавлять элементы в массив и
легче отслеживать, какому ключу какое соответствует значение, чем когда они записаны в
одну строку.
Для доступа к значению элемента в ассоциативных массивах используются только
строковые ключи, по индексу значение получить нельзя:
1
2
3
4
5
$my_array= ['foo'=> 'bar',
'bar'=> 'foo'];
echo$my_array['foo']; // bar
echo$my_array[0]; // будет ошибка, так как элемента с индексом 0 в массиве нет
Смешанные массивы
Обратите вниманием, в PHP массивы могут содержать ключи
типов int и string одновременно, т.е. PHP не делает различия между индексированными и
ассоциативными массивами:
1
2
3
4
$my_array= ['Солнце'=> 'яркое',
'колесо'=> 'круглое',
10
=> 'дом',
-5
=> 290];
Массивы с двумя типами ключей называют смешанными.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 11
«Функции PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
PHP — Функции
Функция это просто блок кода, который имеет название и входные параметры для
обработки, который может быть выполнен, когда нам это нужно. Может показаться, что
толку от них мало, но, поверьте мне, когда вы поймете и научитесь использовать
функции, вы сможете сэкономить кучу времени и написать код, который будет гораздо
более удобным для чтения!
Хотя тема функций часто воспринимается как сложная для начинающих программистов,
но их в любом случае нужно знать.Возможно это займет много времени, но не сдавайтесь,
ведь функции очень помогут вам в карьере программиста.
Создаем свою первую php функцию
Когда вы создаете функцию, нужно сначала дать ей имя, например, myCompanyName.
Лучше всего называть функции понятными названиями, которые будут иметь смысл,
чтобы не запутаться. Это же касается и переменных.
Синтаксис для создания функции довольно очевидный и логичный. Во-первых, вы
должны сказать PHP, что вы хотите создать функцию. Это можно сделать, введя ключевое
слово function и ваше имя функции и некоторые другие вещи (о которых мы поговорим
чуть позже).
Вот как выглядит объявление функции myCompanyName:
<?php
function myCompanyName(){
}
?>
Примечание: Название функции может начинаться со знака «_», но не с цифры!
Это лишь каркас нашей функции, а внутри него мы можем поместить любой код, который
захотим. При вызове функции он будет выполняться. Видите в фигурных скобках в
приведенном выше примере «{}»? Эти скобки определяют, где должен быть наш код
функции. Открывающая фигурная скобка «{» говорит PHP, что код функции начинается, а
закрывающая фигурная «}» говорит PHP, что наша функция окончена!
Давайте добавим в нее что-то простенькое, например echo.
<?php
function myCompanyName(){
echo "Вы находитесь на блоге myblaze.ru <br />";
}
?>
Вот и все, довольно просто, правда? Теперь научимся вызывать нашу функцию.
Вызов готовой функции php
Теперь, когда вы закончили кодирование простейшей функции, пришло время ее
испытать. Ниже приведен простой скрипт. Давайте сделаем вот что: объявим свою
функцию и используем ее.
function myCompanyName(){
echo "Вы находитесь на блоге myblaze.ru <br />";
}
echo "Привет всем! <br />";
myCompanyName();
echo "Рад вас видеть! <br />";
Хотя это был простой пример, важно понимать, что любая невнимательность может
привести к ошибке. Когда вы создаете функцию, следуйте этим простым рекомендациям.
•
•
•
Всегда начинайте ваши функции с ключевым словом function.
Помните, что ваш код функции должны быть между «{» и «}».
Когда вы вызываете функцию, убедитесь, что пишете ее имя правильно.
Функции с параметрами
Еще одна полезная возможность состоит в том, что функции вы можете вызывать с
параметрами, то есть передавать внутрь ее кода дополнительную информацию. Наша
первая функция myCompanyName не очень-то и полезна, потому что все что она умеет,
это печатать одну и ту же строку.
Однако, если бы мы использовали параметры, то мы могли бы добавить некоторые
дополнительные фишки в нашу функцию! Параметр появляется скобках «()» и выглядит
как обычная переменная PHP. Давайте создадим новую функцию, которая создает
пользовательское приветствие основанное на имени человека, которое мы передадим в
качестве параметра.
<?php
function sayHello($Name){
echo "Hello there ". $Name ."!<br />";
}
?>
Теперь когда мы будем вызывать функцию sayHello, то в скобках обязательно должны
указывать параметр (имя), так как функция объявлена с параметром и игнорировать его
нельзя.
Если мы хотим указывать несколько параметров, то просто перечисляем их при
объявлении функции через запятую и все, ничего больше не требуется.
Возвращение значения функцией php
Помимо того, что вы имеете возможность передать функции информацию, она так же
может и сама вернуть значение. Но помните, функция может возвращать только одно
значение, хотя это может быть что угодно: целое число, вещественное, булевое значение,
как вы пожелаете!
Как она возвращает значение? Лучше всего разобраться на примере. Объявим функцию с
параметрами, а затем присвоим результат некоторой переменной, вот так:
<?php
function mySum($numX, $numY){
$total = $numX + $numY;
return $total;
}
$myNumber = 0;
echo "Перед использованием функции, myNumber = ". $myNumber ."<br />";
$myNumber = mySum(3, 4); // Сохраняем результат вызова функции mySum в переменную
$myNumber
echo "После вызова функции, myNumber = " . $myNumber ."<br />";
?>
Чтобы присвоить функции значение — в нее добавляется оператор return, видите его?
Результат сложения двух чисел хранится в переменной $total, а с помощью return $total это
значение передается самой функции. Затем мы просто присваиваем его переменной
$myNumber после вызова функции mySum с двумя параметрами 3 и 4 (это числа которые
следует сложить).
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 12
«Работа с файлами в PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Правильно работать с файлами должен уметь каждый программист. Данная статья
ориентирована на начинающих PHP программистов, однако «сборник рецептов» будет
полезен и продвинутым пользователям.
Работа с файлами разделяется на 3 этапа:
1. Открытие файла.
2. Манипуляции с данными.
3. Закрытие файла.
I. Открытие файла
Для того чтобы открыть файл в среде PHP используется функция fopen(). Обязательными
параметрами этой функции является имя файла и режим файла.
$fp = fopen('counter.txt', 'r');
Согласно документации PHP выделяют следующие виды режимов файлов:
1. r – открытие файла только для чтения.
2. r+ - открытие файла одновременно на чтение и запись.
3. w – создание нового пустого файла. Если на момент вызова уже существует такой
файл, то он уничтожается.
4. w+ - аналогичен r+, только если на момент вызова фай такой существует, его
содержимое удаляется.
5. a – открывает существующий файл в режиме записи, при этом указатель
сдвигается на последний байт файла (на конец файла).
6. a+ - открывает файл в режиме чтения и записи при этом указатель сдвигается на
последний байт файла (на конец файла). Содержимое файла не удаляется.
Примечание: в конце любой из строк может существовать еще один необязательный
параметр: b или t. Если указан b, то файл открывается в режиме бинарного чтения/записи.
Если же t, то для файла устанавливается режим трансляции перевода строки, т.е. он
воспринимается как текстовый.
Для демонстрации рассмотрим следующий сценарий:
<?php
//Открывает файл в разных режимах
$fp = fopen('counter.txt', 'r'); // Бинарный режим
$fp = fopen('counter.txt', 'rt'); // Текстовый режим
$fp = fopen("http://www.yandex.ru", "r");// Открывает HTTP соединение на чтение
$fp = fopen("ftp://user:password@example.ru", 'w'); //Открываем FTP соединение с
указанием логина и пароля
?>
II. Манипуляции с данными файла
Записывать данные в файл при помощи PHP можно при помощи функции fwrite(). Это
функция принимает 2 обязательных параметра и 1 необязательный. В качестве
обязательных параметров выступает дескриптор файла и режим файла:
<?php
$fp = fopen("counter.txt", "a"); // Открываем файл в режиме записи
$mytext = "Это строку необходимо нам записать\r\n"; // Исходная строка
$test = fwrite($fp, $mytext); // Запись в файл
if ($test) echo 'Данные в файл успешно занесены.';
else echo 'Ошибка при записи в файл.';
fclose($fp); //Закрытие файла
?>
Для построчного считывания файла используют функцию fgets(). Функция принимает 2
обязательных параметра:
<?php
$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
if ($fp)
{
while (!feof($fp))
{
$mytext = fgets($fp, 999);
echo $mytext."<br />";
}
}
else echo "Ошибка при открытии файла";
fclose($fp);
?>
Примечание: В данном примере значение 999 определяет количество символов, которые
будут считываться до тех пор, пока указатель не достигнет конца файла (EOF).
Для того, чтобы считать файл как единое целое, нужно использовать функцию readfile(),
принимающая 1 обязательный параметр. Функция открывает файл, отображает его
содержимое в окне браузера, а затем закрывает файл:
<?php
echoreadfile("counter.txt");
?>
Также можно использовать функцию fpassthru() которая принимает 1 обязательный
параметр. Перед использованием этой функции необходимо открыть файл в режиме
чтения. По окончанию считывания файла функция автоматически закрывает файл(при
этом дескриптор файла становиться недействительным).
<?php
$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
if ($fp) echo fpassthru($fp);
elseecho "Ошибка при открытии файла";
?>
Очень часто встречаются ситуации, когда необходимо содержимое сайта считать в
массив. Эту возможность предусматривает использование функции file(). При вызове этой
функции, каждая строка файла сохранятся в отдельном элементе указанного массива.
Примечание: Не следует применять функцию file() к двоичным файлам (binary-safe), т.к.
она не является безопасной в плане считывания двоичных файлов, если при этом, где-то
встретиться символ конца файла (EOF), то она не гарантирует вам чтение всего двоичного
файла.
<?php
$file_array = file("counter.txt"); // Считывание файла в массив $file_array
//
// Работа с данными массива
//
?>
Примечание: Работа с массивами подробно описывается здесь, авторы: Мухаметшин Д.Ф.,
Симдянов И.В.
В конце статьи, вы найдете хороший «сборник рецептов» по массивам, который дает
решение многих проблем, с которыми ежедневно встречается веб-программист.
Давайте представим ситуацию, когда файл необходимо считать по символам. Для этого
мы можем воспользоваться функцией fgetc(). Функция принимает единственный
параметр. Функция полезна если нам необходимо найти какой-либо символ или
количество одинаковых символов.
<?php
$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
if ($fp)
{
while(!feof($fp))
{
$char = fgetc($fp);
if ($char == 'с') $i = $i + 1;// Находим символ «с»
}
echo 'Количество букв "c" в файле: '. $i;
}
else echo "Ошибка при открытии файла";
?>
III. Закрытие файла
Закрытие файла происходить с помощью функции fclose(), которая принимает 1
обязательный параметр.
<?php
$fp = fopen("counter.txt", "r");
if ($fp)
{
echo 'Файл открыт';
fclose($fp); // Закрытие файла
}
?>
Сборник рецептов
1) Нам необходимо проверить существует ли тот или иной файл. Для этого мы
воспользуемся функцией file_exists().
<?php
myfile("counter.txt"); // Используем функцию myfile, передав в качестве аргумента имя
файла
function myfile($name) //Создаем функцию для проверки существования файла
{
if (file_exists($name)) echo 'Файл существует';
else echo "Файл не существует";
}
?>
Примечание: Функция file_exists не производит проверку файлов на удаленном вебсервере. Для правильной работы функции, файл со скриптом должен находиться на том
сервере, где и проверяемый файл.
2) Определяем размер файла с помощью функции filesize()
<?php
myfile("counter.txt");
function myfile($name) //Создаем функцию для проверки существования файла и
определения размера файла
{
if (file_exists($name)) echo "Размер файла: ".filesize($name).' байт';
else echo "Файл не существует";
}
?>
3) Создание временного файла с помощью функции tmpfile()
<?php
$myfile = tmpfile();
fwrite($myfile, "Эта строка записывается во временный файл."); // Записываем во
временный файл
fseek($myfile, 0); // Устанавливаем указатель файла
echo fread($myfile, 1024); // выводим содержимое файла
?>
4) Вам необходимо определить количество строк в файле. Для этого используем
функцию count()
<?php
$fp = file("counter.txt");
echo 'Количество строк в файле: '.count($fp);
?>
5) Нам необходимо использовать механизм блокировки файла
<?php
$fp = fopen("counter.txt", 'a');
flock($fp, LOCK_EX); // Блокирование файла для записи
fwrite($fp, "Строка для записи");
flock($fp, LOCK_UN); // Снятие блокировки
fclose($fp);
?>
6) Нам необходимо удалить определенную строку из файла
<?php
$num_stroka = 5; //Удалим 5 строкуизфайла
$file = file("counter.txt"); // Считываемвесьфайлвмассив
for($i = 0; $i < sizeof($file); $i++)
if($i == $num_stroka) unset($file[$i]);
$fp = fopen("counter.txt", "w");
fputs($fp, implode("", $file));
fclose($fp);
?>
7) Определение типа файла. Используем функцию filetype(), которая принимает
единственный параметр
<?php
$mytype = filetype("counter.txt");
echo "Типфайла: ".$mytype;
?>
После вызова строка может содержат одно из следующих значений:
1.
2.
3.
4.
5.
6.
7.
file – обычный файл
dir – каталог
ink – символическая ссылка
fifo – fifo-канал
block – блочно - ориентированное устройство
char – символьно - ориентированное устройство
unknown – неизвестный тип файла
8) Если вы хотите просмотреть все параметры файла, то следует воспользоваться
функцией stat()
<?php
$filename = stat("counter.txt");
echo "<pre>";
print_r($filename);
echo "</pre>";
?>
9) Нам необходимо очистить файл, используем функцию ftruncate()
<?php
$fp = fopen("counter.txt", 'a'); //Открываем файл в режиме записи
ftruncate($fp, 0) // очищаем файл
?>
10) Нам необходимо узнать дату последнего изменения файла, используем
функцию filectime(). Функция возвращает значение времени в форме Unix timestamp.
<?php
echo filectime("counter.txt");
?>
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 13
«Работа с файловой системой в PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Функции чтения и записи файлов
Набор функций, рассматриваемый в этом разделе, является чрезвычайно полезным,
особенно если приходится использовать наборы данных, которые слишком малы или не
имеют жестко заданной структуры, поэтому попытка применить для их хранения базу
данных не будет оправданной. Операции чтения файла являются довольно безопасными,
за исключением тех случаев, когда они используются для чтения незашифрованных
паролей, находящихся в незащищенном каталоге, но операции записи в файл могут
оказаться весьма небезопасными.
Любой сеанс манипулирования файлом может состоять из описанных ниже шагов:
1. Открыть файл для чтения-записи.
2. Выполнить операцию чтения в файле.
3. Провести необходимые операции с содержимым файла.
4. Записать результаты в файл (если нужно).
5. Закрыть файл.
Для выполнения каждого из этих шагов предусмотрена соответствующая функция работы
с файловой системой языка PHP.
Операция открытия файла
Для открытия файлов используется функция fopen(). Результат выполнения функции
fopen() необходимо присваивать переменной. Следует учитывать, что функция fopen() в
результате успешного выполнения возвращает не целое число, а строку, в которой
приведены данные "Resource id #n", где n - номер открытого в настоящее время потока. Не
следует пытаться проконтролировать успешное выполнение операции открытия файла с
помощью вызовов функции is_int() или is_numeric(). Вместо этого следует использовать
функцию die().
Если операция открытия файла прошла успешно, интерпретатор PHP возвращает
идентификатор ресурса, который требуется для осуществления дальнейших операций,
таких как fread или fwrite. В противном случае будет получено значение false.
Код PHP
$fd = fopen($filename, "r+") ordie("Файлнельзяоткрыть");
Операции открытия файлов могут осуществляться в любом из шести режимов (иерархия
этих режимов напоминает иерархию прав доступа). При осуществлении попыток
выполнения действий, не соответствующих режиму, такие попытки отвергаются.
Допустимые режимы перечислены ниже:
•
Режим только чтения ("r").
•
Режим чтения и записи, применяемый, если файл уже существует ("r+"). Запись
осуществляется в начало файла; а если файл считывается как строка, после чего
эта строка редактируется и снова выводится в файл, то фактически происходит
запись обновленного файла с сохранением его первоначального содержимого.
•
Режим только записи ("w"), в котором перед выполнением каких-либо операций
записи создается файл с указанным именем, если этот файл еще не существует, и
стирается содержимое указанного файла, если он существует! Данный режим не
может использоваться для чтения файла; он предназначен только для записи.
•
Режим записи и чтения, применяемый, даже если файл еще не существует ("w+"),
предусматривает создание файла с указанным именем (при условии, что он не
существует) и удаление до начала выполнения операций записи содержимого
указанного файла!
•
Режим только записи, применяемый для дополнения файла, независимо от того,
существует ли файл или нет ("a").
•
Режим записи и чтения, применяемый для дополнения файла, независимо от того,
существует ли файл или нет ("а+"). Если файл считывается как строка, после чего
эта строка редактируется и снова выводится в файл, то фактически происходит
запись обновленного файла с сохранением первоначального содержимого файла.
Необходимо тщательно следить за тем, чтобы содержимое любого существующего файла
было считано заранее, если предусматривается модификация и повторная запись этого
содержимого в режиме w или w+, поскольку в противном случае может произойти потеря
данных. А при использовании других режимов вероятность потери данных намного
меньше.
Для работы с файлами предусмотрена возможность открывать несколько типов
соединений и использовать средства доступа, включая HTTP, HTTPS, FTP, FTPS,
стандартный ввод-вывод, и др.
При использовании функции fopen() для работы по протоколу HTTP предпринимается
попытка открыть соединение по протоколу HTTP 1.0 для обработки файла такого типа,
который обычно обрабатывается веб-сервером (таким как файл HTML, PHP, ASP и т.д.).
По существу, интерпретатор PHP вынуждает веб-сервер действовать так, как будто
переданный ему запрос поступил из обычного веб-браузера, применяемого для просмотра
Интернета, а не был получен с помощью операции открытия файла:
Код PHP
$fd = fopen("http://www.mysite.com/index.php/", "r")
ordie("Файл нельзя открыть");
Следует помнить, что с формальной точки зрения URL без заключительного символа
косой черты рассматривается как имеющий неправильную структуру, но в большинстве
веб-серверов при получении параметра адреса, не соответствующего этому требованию,
автоматически осуществляется замена URL такой же строкой с заключительным
символом косой черты и предпринимается попытка перенаправить запрос по полученному
адресу.
При использовании функции fopen() для работы по протоколу FTP предпринимается
попытка установить соединение FTP с удаленным сервером от имени FTP-клиента. Этот
вариант применения функции fopen() является более сложным, поскольку в данном
случае, кроме имени хоста и пути к файлу, приходится также указывать имя пользователя
и пароль FTP, как показано ниже:
Код PHP
$fd = fopen("ftp://username:password@www.mysite.com/index.php/", "r")
ordie("Файл нельзя открыть");
Этот способ доступа осуществляется успешно только при условии, что используемый
FTP-сервер поддерживает пассивный режим. Кроме того, открытие файла FTP может
осуществляться только для чтения или записи, но не для выполнения той и другой
операции, а операции записи должны использоваться только для создания новых файлов,
а не для дополнения существующих.
Наиболее широко применяемый и удобный способ использования функции fopen()
состоит в том, что эта функция служит для доступа к файлам из файловой системы.
Поэтому интерпретатор PHP, если явно не указано иное, при вызове этой функции
предпринимает попытки открыть файл, находящийся в файловой системе.
По желанию в системе Windows можно прибегнуть к использованию формата имени
файла Windows с символами обратной косой черты. Однако нельзя забывать, что эти
символы должны быть отмечены знаками переключения (которые также являются
символами обратной косой черты), как в следующем примере:
Код PHP
$fd = fopen("d:\\file.txt", "r")
ordie("Файл нельзя открыть");
Необходимо учитывать, что обрабатываемые файлы и, возможно, каталоги должны быть
доступны для чтения или записи пользователю, от имени которого действует
интерпретатор PHP (или веб-сервер, если для доступа применяется модуль PHP),
поскольку доступ осуществляется от имени этого пользователя, а не от имени самого
пользователя системы.
Операции чтения файла
Функция fread() принимает в качестве параметров идентификатор указателя файла и
размер файла в байтах. Если указанный размер файла не является достаточным для чтения
всего файла, то в работе программы возникают загадочные нарушения (исключением
является такая ситуация, когда меньший размер файла задается намеренно; такой способ
доступа может применяться при чтении огромных файлов в виде отдельных фрагментов).
Поэтому, если нет оснований для применения другого подхода (например,
обусловленного необходимостью чтения колоссального, неуправляемого файла), то лучше
всего предоставить возможность заполнить значение параметра размера файла самому
интерпретатору PHP, используя функцию filesize() с указанием в качестве параметра
имени файла (или переменной с именем файла), как в следующем примере:
Код PHP
$fr = fread($fd, filesize($filename));
При использовании указанной конструкции часто возникает ошибка, состоящая в том, что
применяется вызов filesize($fd), а не filesize($filename).
Функция fread() исключительно полезна, поскольку позволяет преобразовать любой файл
в строку, с которой в дальнейшем могут осуществляться манипуляции с помощью
широкого перечня полезных строковых функций PHP. К тому же любую строку можно
преобразовать в массив с использованием таких функций, как file() или explode(), что
позволяет получить доступ к большому арсеналу функций манипулирования массивами
языка PHP.
Начиная с версии PHP 4.3.0 пользователям предоставлен доступ к новой функции —
file_get_contents(). Эта функция возвращает все содержимое файла в виде строки и
обладает возможностями функции fopen(). Применение функции file_get_contents()
равносильно применению функций fopen() и fread().
Если требуется и выполнять чтение, и применять к файлу операции построчной
обработки, то вместо функции fread() можно использовать функцию fgets(). Начиная с
версии PHP 4.2.0 по умолчанию предусмотрено, что функция возвращает по 1024 байта в
расчете на каждую строку, если в качестве второго параметра функции fgets() не задана
длина строки.
Наконец, если требуется выполнить чтение файла символ за символом, то можно
использовать функцию fgetc(). Эта функция возвращает при каждом вызове по одному
символу из файла, обозначенного с помощью указателя, пока не будет достигнут конец
файла. Но на практике данная функция применяется достаточно редко, поскольку такая
организация программы, в которой каждый раз осуществляется чтение из файла по
одному символу, является неэффективной. По-видимому, функцию fgetc() следует
использовать только в таких ситуациях, когда требуется проверить один или два первых
символа из файла.
Операции записи файла
После успешного открытия файла в режиме, соответствующем поставленной цели,
выполнение
операций
записи
файла
становится
довольно
несложным.
Функция fwrite() принимает в качестве параметров указатель файла и строку. Еще одним
необязательным параметром является длина файла в байтах. Последний параметр следует
использовать лишь в том случае, если на это имеются особые основания. Функция fwrite()
возвращает количество считанных символов.
Функция fputs() полностью идентична функции fwrite(), но fputs() имеет имя в стиле
функций языка C.
Следует помнить, что открытие файла в режиме w или w+ приводит к полному и
окончательному уничтожению всего содержимого файла. Указанные режимы
предназначены только для перезаписи файлов, очищенных от прежнего содержимого.
Если же требуется обеспечить запись в начале или в конце файла, то следует использовать
соответственно режим r+ или a+.
Операции закрытия файла
Операция закрытия файла является несложной:
Код PHP
fclose($fd);
В отличие от функции fopen() результат выполнения функции fclose() не требуется
присваивать переменной. На первый взгляд может показаться, что применение в сценарии
операций закрытия файла является для программиста пустой тратой времени, но
количество применимых дескрипторов файлов в системе ограничено, поэтому существует
вероятность того, что доступные дескрипторы файлов будут исчерпаны, если ненужные
файлы останутся открытыми. С другой стороны, интерпретатор PHP закрывает все
открытые файлы после завершения сценария.
Ниже показан полный пример чтения и записи файла из текущей файловой системы:
Код PHP
echo '<b>Чтение файла: </b><br>';
$filename = $_SERVER['PHP_SELF'];
$fd = fopen($filename, "r") ordie("Файлнельзяоткрыть");
$page_contents = '';
while ($new_text = fread($fd, 100))
{
$page_contents .= $new_text;
}
echo '<pre>'.htmlentities($page_contents).'</pre>';
fclose($fd);
echo '<b>Записьвфайл</b><br><br>';
$fd = fopen($filename, "w+") ordie("Файлнельзяоткрыть");
fwrite ($fd, 'Hello, world!');
fclose($fd);
Чтение из файла
В данном случае происходит чтение текущего файла, в котором выполняется скрипт и
вывод его на экран. Затем выполняется операция записи с флагом w+ (файл
перезаписывается), чтобы убедиться в этом достаточно просто обновить страницу:
Запись в файл
Функция feof
Функция feof принимает в качестве параметра дескриптор файла и проверяет, не
достигнут ли конец указанного файла. В основном эта функция используется в цикле
while, в котором применяются аналогичные операции обработки к каждой строке файла,
как в следующем примере:
Код PHP
while(!feof($fd))
{
$line = fgets($fd, 4096);
echo $line;
}
Функция file_exists
функция file_exists — это простая функция, к использованию которой приходится
прибегать очень часто, если для доступа к данным применяются функции файловой
системы. Эта функция просто проверяет наличие в локальной файловой системе файла с
указанным именем, как показано ниже:
Код PHP
if (file_exists($filename))
{
$fd = fopen($filename, "w+");
fwrite ($fd, 'Hello, world!');
}
Функция возвращает значение true, если файл существует, а если файл не найден,
возвращает значение false. Результаты проверки сохраняются в кэше, который может быть
очищен с помощью функции clearstatcache().
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 14
«Формы HTML»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Описание
Тег <form> устанавливает форму на веб-странице. Форма предназначена для обмена
данными между пользователем и сервером. Область применения форм не ограничена
отправкой данных на сервер, с помощью клиентских скриптов можно получить
доступ к любому элементу формы, изменять его и применять по своему усмотрению.
Документ может содержать любое количество форм, но одновременно на сервер
может быть отправлена только одна форма. По этой причине данные форм должны
быть независимы друг от друга.
Для отправки формы на сервер используется кнопка Submit, того же можно добиться,
если нажать клавишу Enter в пределах формы. Если кнопка Submit отсутствует в
форме, клавиша Enter имитирует ее использование.
Когда форма отправляется на сервер, управление данными передается программе,
заданной атрибутом action тега <form>. Предварительно браузер подготавливает
информацию в виде пары «имя=значение», где имя определяется
атрибутом nameтега <input>, а значение введено пользователем или установлено в
поле формы по умолчанию. Если для отправки данных используется метод GET, то
адресная строка может принимать следующий вид.
http://www.htmlbook.ru/cgibin/handler.cgi?nick=%C2%E0%ED%FF+%D8%E0%EF%EE%F7%EA%E8%ED&page=
5
Параметры перечисляются после вопросительного знака, указанного после адреса
CGI-программы и разделяются между собой символом амперсанда (&). Нелатинские
символы преобразуются в шестнадцатеричное представление (в форме %HH, где HH
— шестнадцатеричный код для значения ASCII-символа), пробел заменяется на плюс
(+).
Допускается внутрь контейнера <form> помещать другие теги, при этом сама форма
никак не отображается на веб-странице, видны только ее элементы и результаты
вложенных тегов.
Синтаксис
<form action="URL">
...
</form>
Атрибуты
accept-charset
Устанавливает кодировку, в которой сервер может принимать и обрабатывать данные.
action
Адрес программы или документа, который обрабатывает данные формы.
autocomplete
Включает автозаполнение полей формы.
enctype
Способ кодирования данных формы.
method
Метод протокола HTTP.
name
Имя формы.
novalidate
Отменяет встроенную проверку данных формы на корректность ввода.
target
Имя окна или фрейма, куда обработчик будет загружать возвращаемый результат.
Имя окна или фрейма, куда обработчик будет загружать возвращаемый результат.
Также для этого тега доступны универсальные атрибуты и события.
Закрывающий тег
Обязателен.
Пример
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Тег FORM</title>
</head>
<body>
<form action="handler.php">
<p><b>Как по вашему мнению расшифровывается аббревиатура
"ОС"?</b></p>
<p><input type="radio" name="answer" value="a1">Офицерскийсостав<Br>
<input type="radio" name="answer" value="a2">Операционнаясистема<Br>
<input type="radio" name="answer" value="a3">Большойполосатыймух</p>
<p><input type="submit"></p>
</form>
</body>
</html>
Результат данного примера показан на рис. 1.
Рис. 1. Вид элементов формы в окне браузера
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 15
«Обработка формы в PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
1. Цель работы.
Закрепление теоритических знаний и навыков работы cформами HTMLи обработки
HTTPзапросов в PHP.
2. Теоретические сведения.
Формы HTML.
В процессе навигации по сайтам пользователь, в основном, только щёлкает по ссылкам
чтобы перемещаться по веб-страницам.
Но понятно, что пользователю иногда требуется обеспечить собственные поля ввода. Эти
виды взаимодействия включают в себя:
•
•
•
•
•
регистрацию и вход на сайтах;
ввод личной информации (имя, адрес, данные кредитной карты и др.);
фильтрацию контента (с помощью выпадающих списков, флажков и др.);
выполнение поиска;
загрузку файлов.
Чтобы приспособиться к этим потребностям, HTML предлагает интерактивные элементы
управления формы:
•
•
•
•
•
•
текстовые поля (для одной или нескольких строк);
переключатели;
флажки;
выпадающие списки;
виджеты для загрузки;
кнопки отправки.
Эти элементы управления задействуют разные теги HTML, но большинство из них
использует тег <input>. Поскольку это самозакрывающий элемент, тип поля
определяется его атрибутом type:
Элемент <form>
<form> является блочным элементом, который определяет интерактивную часть вебстраницы. Как результат, все элементы управления (такие как <input>, <textarea>
или <button>) должны находиться внутри элемента <form>.
Два атрибута HTML необходимы:
•
•
action содержит адрес, который определяет, куда будет отправлена информация
формы;
method может быть либо GET, либо POST и определяет, как будет отправлена
информация формы.
Подумайте о форме как о наборе элементов управления, которые работают вместе, чтобы
выполнить одну операцию. Если вы написали форму входа на сайт, у вас могло быть три
поля:
•
•
•
поле для электронной почты <input type="email">
поле для пароля <input type="password">
кнопка отправки <input type="submit">
Эти три элемента HTML будут заключены внутри одной формы <form
action="/login" method="POST">.
Получение данных формы из PHP
Одно из главнейших достоинств PHP - то, как он работает с формами HTML. Здесь
основным является то, что каждый элемент формы автоматически становится доступным
вашим программам на PHP.
ФормаHTML:
<form action="action.php" method="post">
<p>Ваше имя: <input type="text" name="name" /></p>
<p>Ваш email: <input type="email" name="email" /></p>
<p><input type="submit" /></p>
</form>
Когда пользователь заполнит форму и нажмет кнопку отправки, будет вызвана страница
action.php. В этом файле может быть код обработки:
Код файла action.php:
<?php
echo "Ваше имя – ". $_POST['name']). " <br>";
echo "Вашemail – ".$_POST['email']. " <br>";
?>
Пример вывода программы:
Ваше имя – Вася
Ваш email – vasya@mail.ru
Переменные $_POST['name'] и $_POST['age'] автоматически установлены для вас
средствами PHP. Заметим, что метод отправки (method) нашей формы - POST. Если бы мы
использовали метод GET, то информация нашей формы была бы в суперглобальной
переменной $_GET. Кроме этого, можно использовать переменную $_REQUEST, если
источник данных не имеет значения. Эта переменная содержит смесь данных GET, POST,
COOKIE.
3. Задание
Составить программу для вычисления следующих свойств
звукового файла:
•
•
•
Объем в Кб звукового файла в формате .wav, если известны длительность его
звучания, частота дискретизации и глубина оцифровки.
Частоту дискретизации, которая использовалась при звукозаписи, если известны
глубина оцифровки, а также объем и длительность звучания файла.
Время звучания в секундах аудиофайла в формате .wav, если известны его объем,
частота дискретизации и глубина оцифровки.
Оформить отчет с блок-схемой и комментариями к исходному коду.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 16
«Создание калькулятора на PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Прежде чем приступить к его созданию, давайте обговорим то, что он должен
уметь. Пусть наш калькулятор будет принимать на вход 2 числа, и операцию, которую над
этими числами нужно совершить (сложение, вычитание, умножение, деление). После
этого он будет выводить нам получившееся выражение и его результат.
Итак, вот так будет выглядеть форма для ввода исходных данных:
А вот так будет выглядеть страница с результатом:
Давайте теперь спроектируем, где что будет лежать. Я предлагаю сделать такую
архитектуру:
•
•
•
index.php – здесь будет храниться форма, в которой мы будем заполнять исходные
данные
result.php – здесь будет храниться шаблон, который будет выводить результат
вычислений
calc.php – файл, в котором будет храниться непосредственно вся бизнес-логика
нашего приложения.
Шаблоны калькулятора
Итак, приступим. Давайте начнём с формы. Она будет содержать в себе:
•
•
•
2 input’а, в которые мы будем записывать аргументы;
select, который позволит нам выбрать одну из доступных операций;
кнопку, для отправки формы.
Я приведу здесь пример формы, в которой будет только две возможные операции:
сложение и вычитание.
<html>
<head>
<title>Калькулятор</title>
</head>
<body>
<formaction="/result.php">
<inputtype="text"name="x1">
<selectname="operation">
<optionvalue="+">+</option>
<optionvalue="-">-</option>
</select>
<inputtype="text"name="x2">
<inputtype="submit"value="Посчитать">
</form>
</body>
</html>
Здесь вам всё должно быть знакомо. Если нет — повторите уроки с формами в курсе
HTML.
Мы видим, что данная форма отправляет GET-запрос на адрес /result.php. Как мы уже
решили, там будет находиться шаблон для вывода результата вычислений.
Вот пример кода, который получился у меня:
<?php
$result = require__DIR__ .'/calc.php';
?>
<html>
<head>
<title>Калькулятор</title>
</head>
<body>
<b>Результат вычислений:</b>
<br>
<?= $result ?>
</body>
</html>
Как видим, здесь всё предельно просто — в переменную $result присваивается значение,
возвращаемое из файла calc.php. Затем мы просто-напросто выводим результат из этой
переменной.
Бизнес-логика калькулятора
Теперь самое интересное — написать бизнес-логику. Создаём файл calc.php и начинаем
думать.
Первое, в чём нам стоит убедиться, есть ли вообще какие-либо данные в GET-запросе.
Для этого проверяем массив $_GET на пустоту:
<?php
if (empty($_GET)) {
return'Ничего не передано!';
}
Сейчас, если перейти по адресу http://myproject.loc/result.php, мы увидим
соответствующий результат:
Далее, нам стоит проверить, что из формы переданы x1, x2 и operation.
<?php
if (empty($_GET)) {
return'Ничегонепередано!';
}
if (empty($_GET['operation'])) {
return'Непереданаоперация';
}
if (empty($_GET['x1']) || empty($_GET['x2'])) {
return'Не переданы аргументы';
}
Можно теперь вернуться на форму с исходными данными и заполнить её какими-нибудь
данными:
Если теперь нажать на кнопку отправки формы, мы увидим, что никаких ошибок в форме
результата теперь не возникло:
Вместо этого мы теперь видим число 1. Это результат того, что в файле calc.php мы
ничего не вернули, но при этом попытались это «ничего» с помощью функции
require присвоить в переменную $result. Единица вернулась нам, потому что файл был
успешно подключен, но ничего не вернул. Это значение по умолчанию.
Попробуем теперь убрать один из аргументов в форме:
Если мы отправим запрос сейчас, то увидим соответствующую ошибку:
Ну что, теперь мы знаем, что данные у нас проверяются, можно с ними и поработать.
Давайте для удобства сделаем 2 переменные $x1 и $x2 и положим в них значения из GETзапроса.
//… продолжение файла
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
Давайте теперь составим выражение, которое мы будем вычислять. Его мы просто будем
выводить для наглядности.
//… продолжение файла
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$expression = $x1 .' ' . $_GET['operation'] .' ' . $x2 .' = ';
return $expression;
Теперь вернёмся на форму и снова введём корректные аргументы. После этого отправим
её и увидим, что на странице с результатом появилось выражение, результат которого мы
будем считать.
Дело осталось за малым — нужно только посчитать результат.
Для того, чтобы определить, какое действие нужно совершить с аргументами,
воспользуемся конструкцией switch-case.
В результате получаем такое содержимое calc.php.
<?php
if (empty($_GET)) {
return'Ничегонепередано!';
}
if (empty($_GET['operation'])) {
return'Непереданаоперация';
}
if (empty($_GET['x1']) || empty($_GET['x2'])) {
return'Не переданы аргументы';
}
$x1 = $_GET['x1'];
$x2 = $_GET['x2'];
$expression = $x1 .' ' . $_GET['operation'] .' ' . $x2 .' = ';
switch ($_GET['operation']) {
case'+':
$result = $x1 + $x2;
break;
case'-':
$result = $x1 - $x2;
break;
default:
return'Операция не поддерживается';
}
return $expression . $result;
Давайте теперь снова отправим форму и посмотрим на результат.
Получили простейший калькулятор, который умеет складывать и вычитать. Разумеется,
это лишь простейший прототип. Довести его до ума вы сможете сами, а в домашнем
задании вас ждут наводящие вопросы, которые помогут найти ошибки, содержащиеся в
приведенном коде.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 17
«Загрузка файла в PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Вам не составит труда написать собственный PHP-скрипт для загрузки файлов на сервер.
Прежде всего, нужно создать HTML-форму с полем file input. Затем привязать к ней PHPскрипт, который переместит файл в указанную директорию. Чтобы закачать файл на
сервер с помощью PHP-скрипта, выполните следующие действия:
1. Создайте простую HTML-форму: потребуется простая форма с возможностью
указания файла. Она размещается в файле basic.php:
<html>
<head>
<title>Basic File Upload</title>
</head>
<body>
<h1>Basic File Upload</h1>
<form method="post" action="basic.php" enctype="multipart/form-data">
<label for="inputfile">Upload File</label>
<input type="file" id="inputfile" name="inputfile"></br>
<input type="submit" value="Click To Upload">
</form>
</body>
</html>
Приведенный выше код необходим для создания формы. Как только пользователь
выбирает файл и нажимает кнопку Upload, форма передаст данные с помощью
метода POST на этой же странице, так как в качестве обработчика указан файл basic.php:
Важно: не забудьте добавить enctype=”multipart/form-data” в тег <form>.
2. Создаем PHP-скрипт для обработки формы загрузки. В PHP вся информация о
загруженных файлах содержится в глобальной переменной $_FILES. То есть,
используя $_FILES, можно проверить, был ли загружен файл. Если файл был
загружен, то можно переместить его в нужную директорию при помощи
функции move_uploaded_file PHP:
<?php
if(isset($_FILES) && $_FILES['inputfile']['error'] == 0){ // Проверяем, загрузил ли
пользователь файл
$destiation_dir = dirname(__FILE__) .'/'.$_FILES['inputfile']['name']; //
Директориядляразмещенияфайла
move_uploaded_file($_FILES['inputfile']['tmp_name'], $destiation_dir ); //
Перемещаемфайлвжелаемуюдиректорию
echo 'File Uploaded'; // Оповещаем пользователя об успешной загрузке файла
}
else{
echo 'No File Uploaded'; // Оповещаем пользователя о том, что файл не был загружен
}
?>
Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен,
то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы
перемещаем файл в ту же папку, где находится файл basic.php.
Ниже приведена полная версия PHP move uploaded file примера:
<?php
if(isset($_FILES) && $_FILES['inputfile']['error'] == 0){ // Проверяем, загрузил ли
пользователь файл
$destiation_dir = dirname(__FILE__) .'/'.$_FILES['inputfile']['name']; //
Директориядляразмещенияфайла
move_uploaded_file($_FILES['inputfile']['tmp_name'], $destiation_dir ); //
Перемещаемфайлвжелаемуюдиректорию
echo 'File Uploaded'; // Оповещаем пользователя об успешной загрузке файла
}
else{
echo 'No File Uploaded'; // Оповещаем пользователя о том, что файл не был загружен
}
?>
<html>
<head>
<title>Basic File Upload</title>
</head>
<body>
<h1>Basic File Upload</h1>
<form method="post" action="basic.php" enctype="multipart/form-data">
<label for="inputfile">Upload File</label>
<input type="file" id="inputfile" name="inputfile"></br>
<input type="submit" value="Click To Upload">
</form>
</body>
</html>
Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает
требованиям безопасности, и был создан специально для того, чтобы наглядно показать,
как загружать файлы с помощью PHP.
Вопрос: Почему приведенный выше скрипт небезопасен?
Ответ: С помощью скрипта, приведенного выше, можно загрузить файл любого типа на
сервер. То есть, если вы используете скрипт в таком виде на “живом” сервере, то любой
хакер сможет загрузить собственные PHP-скрипты, и взломать ваш сайт и сервер.
Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.
Что такое $_FILES?
$_FILES – это глобальная переменная в PHP наподобие $_POST или $_GET. Она
представляет собой ассоциативный массив, в котором находится информация о
загруженном файле с помощью метода HTTP POST.
То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим
следующую информацию:
Array
(
[inputfile] => Array
(
[name] => upload-file-php.jpg
[type] => image/jpeg
[tmp_name] => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh
[error] => 0
[size] => 6887
)
)
То есть, для каждого поля <input type=”file” name=”inputfile“/> в массиве создается
элемент. Если вы создадите <input type=”file” name=”test”>, то название элемента также
будет изменено на test. Например:
Array
(
[test] => Array
(
[name] => upload-file-php.jpg
[type] => image/jpeg
[tmp_name] => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh
[error] => 0
[size] => 6887
)
)
Теперьдлякаждого input file, перемещаемогоспомощью move uploaded file PHP,
создаетсяпятьэлементов (name, type, tmp_name, error, size). Давайте познакомимся с этими
элементами поближе:
1. name: содержит название загруженного пользователем файла. Если вы загрузите
файл abc.txt в браузер, то элемент name получит название abc.txt;
2. type: тип загруженного файла или mime-type, если точнее. Для файла JPG этот
элемент будет иметь значение image/jpeg. Если загрузить текст, то элемент получит
значение text/plain. Для разных типов файлов разным будет и mime-type. Ниже
приведены самые распространенные mime-типы:
•
•
•
•
JPEG: image/jpeg;
PNG: image/png;
Текст: text/plain;
Word: application/msword.
3. tmp_name: временное расположение для загруженного файла. Этот путь можно
изменить в переменной upload_tmp_dir, указанной в файле php.ini.
4. error: информация об ошибке. Включает в себя тип ошибки, возникшей в процессе
загрузки. Например, когда размер файла превышает максимальный или когда не
был указан файл для загрузки. Для любой возникшей ошибки имеется числовое
значение и константа. Ниже приведен полный список ошибок, которые могут
возникнуть в PHP move uploaded file примере:
•
•
•
•
•
•
•
UPLOAD_ERR_OK (значение 0). Означает, что файл был успешно загружен без
ошибок;
UPLOAD_ERR_INI_SIZE (значение 1). Размер файла превышает указанный в
переменной upload_max_filesize в файле php.ini;
UPLOAD_ERR_FORM_SIZE (значение 2). Размер файла превышает установленное
в переменной формы MAX_FILE_SIZE значение;
UPLOAD_ERR_PARTIAL (значение 3). Файл загружен не полностью;
UPLOAD_ERR_NO_FILE (значение 4). Отсутствует файл для загрузки;
UPLOAD_ERR_NO_TMP_DIR (значение 6). Указанной директории для
временного хранения не существует;
UPLOAD_ERR_CANT_WRITE (значение 7). Невозможно записать файл на диск.
5. size: размер загруженного файла в байтах.
Чтотакое move_uploaded_file?
move_uploaded_file представляет собой функцию, которая перемещает загруженный файл
из временной директории в папку назначения. Перед перемещением move_uploaded_file
PHP проверяет, был ли загружен файл, указанный в HTTP-методе post.
Если файл был успешно перемещен, то вы получите ответ true или false. В первом
примере мы использовали следующую строку кода:
move_uploaded_file($_FILES['inputfile']['tmp_name'], $destiation_dir )
А теперь давайте сделаем красиво, и выведем информацию:
if(move_uploaded_file($_FILES['inputfile']['tmp_name'], $destiation_dir )){
echo "File Uploaded"
}
else{
echo "File Not uploaded"
}
Изменяем лимит размера загружаемого файла
У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе
пользователи станут загружать увесистые файлы. Выставить ограничение на move
uploaded file PHP можно двумя способами:
•
•
•
•
В файле PHP.ini есть специальная переменная upload_max_filesize, которая
отвечает за максимальный размер загружаемых файлов. Далее приведена строчка
из php.ini, которая ограничивает размер загружаемых файлов до 20
Мб: upload_max_filesize = 20M.
Если загружаемый файл будет иметь больший размер, то пользователь получит
ошибку UPLOAD_ERR_INI_SIZE или значение «2» в переменной $_FILES. Важно
учесть, что значение переменной upload_max_filesize не должно превышать
значение переменной post_max_size, указанной в php.ini;
Ограничить размер загружаемого файла можно, поместив скрытый элемент ввода с
названием UPLOAD_ERR_INI_SIZE в форму загрузки.
Сделатьэтоможнотак: <input type="hidden" name="MAX_FILE_SIZE" value="50000"
/>.
Если нужно сильно увеличить filesize, то не забудьте изменить время исполнения phpскриптов.
Как обезопасить PHP-скрипт загрузки файлов
Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить
типы файлов, которые загружают пользователи. Пришло время позаботиться о
безопасности нашего PHP move uploaded file примера.
В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы
размером свыше 1 Мб. Установите соответствующее ограничение в
переменной upload_max_filesize файла php.ini. Ниже приведена улучшенная версия
скрипта:
<?php
ini_set('upload_max_filesize', '1M'); //ограничениев 1 мб
if ($_SERVER['REQUEST_METHOD'] == "POST" ) {
if ($_FILES['inputfile']['error'] == UPLOAD_ERR_OK && $_FILES['inputfile']['type'] ==
'image/jpeg') { //проверкананаличиеошибок
$destiation_dir = dirname(__FILE__) . '/' . $_FILES['inputfile']['name']; // директория для
размещения файла
if (move_uploaded_file($_FILES['inputfile']['tmp_name'], $destiation_dir)) {
//перемещениевжелаемуюдиректорию
echo 'File Uploaded'; //оповещаем пользователя об успешной загрузке файла
} else {
echo 'File not uploaded';
}
} else {
switch ($_FILES['inputfile']['error']) {
case UPLOAD_ERR_FORM_SIZE:
case UPLOAD_ERR_INI_SIZE:
echo 'File Size exceed';
brake;
case UPLOAD_ERR_NO_FILE:
echo 'FIle Not selected';
break;
default:
echo 'Something is wrong';
}
}
}
?>
<html>
<head>
<title>Secure File Upload</title>
</head>
<body>
<h1>Secure File Upload</h1>
<form method="post" action="secure.php" enctype="multipart/form-data">
<label for="inputfile">Upload File</label>
<input type="file" id="inputfile" name="inputfile"></br>
<input type="submit" value="Click To Upload">
</form>
</body>
</html>
Мультизагрузкафайловприпомощи PHP-скрипта
Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file
PHP. Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHPскрипта:
1. Используя разные имена Input.
2. Используя одно и то же имя input, но с привлечением массива.
1. Используя разные имена Input:
Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже
говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано
несколько основных элементов. Например, для приведенной ниже формы:
<input type="file" id="profilepic" name="profilepic">
<input type="file" id="resume" name="resume">
$_FILES представит массив следующего содержания:
Array
(
[profilepic] => Array
(
[name] => 20141002_094257.jpg
[type] => image/jpeg
[tmp_name] => /Applications/XAMPP/xamppfiles/temp/phpoBWrBZ
[error] => 0
[size] => 2669096
)
[resume] => Array
(
[name] => 20141002_094247.jpg
[type] => image/jpeg
[tmp_name] => /Applications/XAMPP/xamppfiles/temp/phpjwUmVZ
[error] => 0
[size] => 2207657
)
)
Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один
элемент предназначен для аватарки (изображение), а другой – для загрузки резюме (файла
в формате .doc):
<?php
if ($_SERVER['REQUEST_METHOD'] == "POST" ) {
if ($_FILES['profilepic']['error'] == UPLOAD_ERR_OK && $_FILES['profilepic']['type'] ==
'image/jpeg') { // Проверяемнаналичиеошибок
$destiation_dir = dirname(__FILE__) . '/' . $_FILES['profilepic']['name']; // Директория для
размещения файла
if (move_uploaded_file($_FILES['profilepic']['tmp_name'], $destiation_dir)) { //
Перемещаемфайлвжелаемуюдиректорию
echo 'Profile Pic Uploaded'; // Оповещаем пользователя об успешной загрузке файла
} else {
echo 'Profile Pic not uploaded';
}
} else {
switch ($_FILES['profilepic']['error']) {
case UPLOAD_ERR_FORM_SIZE:
case UPLOAD_ERR_INI_SIZE:
echo 'Profile Pic Size exceed';
brake;
case UPLOAD_ERR_NO_FILE:
echo 'Profile Pic Not selected';
break;
default:
echo 'Something is wrong with Profile PIC';
}
}
if ($_FILES['resume']['error'] == UPLOAD_ERR_OK && $_FILES['resume']['type'] == '
application/msword') { // Проверяемнаналичиеошибок
$destiation_dir = dirname(__FILE__) . '/' . $_FILES['resume']['name']; // Директория для
размещения файла
if (move_uploaded_file($_FILES['resume']['tmp_name'], $destiation_dir)) { //
Перемещаемфайлвжелаемуюдиректорию
echo 'resume Uploaded'; // Оповещаем пользователя об успешной загрузке файла
} else {
echo 'resume not uploaded';
}
} else {
switch ($_FILES['resume']['error']) {
case UPLOAD_ERR_FORM_SIZE:
case UPLOAD_ERR_INI_SIZE:
echo 'resume Size exceed';
brake;
case UPLOAD_ERR_NO_FILE:
echo 'resume Not selected';
break;
default:
echo 'Something is wrong with resume';
}
}
}
?>
<html>
<head>
<title>Multiple File Upload</title>
</head>
<body>
<h1>Multiple File Upload</h1>
<form method="post" action="multiple.php" enctype="multipart/form-data">
<label for="profilepic">Profile Pic</label>
<input type="file" id="profilepic" name="profilepic"></br>
<label for="resume">Resume</label>
<input type="file" id="resume" name="resume"></br>
<input type="submit" value="Click To Upload">
</form>
</body>
</html>
2. Используем одно поле input, но с применением массива:
Как и в случае с другими типами input, для move uploaded file PHP мы можем
использовать массив с input type, указанным в php. Тоесть:
<input type="file" id="pic" name="pic[]">
<input type="file" id="pic" name="pic[]">
<input type="file" id="pic" name="pic[]">
То есть, для приведенного выше HTML, $_FILES предоставит данные со следующей
структурой:
Array
(
[pic] => Array
(
[name] => Array
(
[0] => upload-file-php.jpg
[1] => variable-scope-php.jpg
[2] => magic-constants.jpg
)
[type] => Array
(
[0] => image/jpeg
[1] => image/jpeg
[2] => image/jpeg
)
[tmp_name] => Array
(
[0] => /Applications/XAMPP/xamppfiles/temp/phpML5kOy
[1] => /Applications/XAMPP/xamppfiles/temp/phpNZbuw7
[2] => /Applications/XAMPP/xamppfiles/temp/phpO8VFAk
)
[error] => Array
(
[0] => 0
[1] => 0
[2] => 0
)
[size] => Array
(
[0] => 6887
[1] => 8036
[2] => 9967
)
)
)
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 18
«Загрузка нескольких файлов в PHP»
(время на выполнение – 2 часа)
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Загрузку нескольких файлов можно реализовать используя, например, различные
значения name для тега input.
Также можно одновременно загружать несколько файлов и автоматически получить их в
виде массива. Для реализации такой возможности используйте тот же синтаксис массива в
HTML-форме, что и для множественных полей select и checkbox:
Пример #1 Загрузканесколькихфайлов
<form action="file-upload.php" method="post" enctype="multipart/form-data">
Файлы:<br />
<input name="userfile[]" type="file" /><br />
<input name="userfile[]" type="file" /><br />
<input type="submit" value="Отправить" />
</form>
Вслучае, еслитакаяформабылаотправлена,
массивы $_FILES['userfile'],$_FILES['userfile']['name'],
и $_FILES['userfile']['size'] будутинициализированы (точнотакже,
каки $HTTP_POST_FILES для PHP 4.1.0 иболеераннихверсий). Если включена
конфигурационная директива register_globals, также будут инициализированы
сопутствующие глобальные переменные. Каждая из таких переменных будет
представлять собой численно-индексированный массив соответствующих значений для
отправленных файлов.
Например, предположим, что были загружены
файлы /home/test/review.html и /home/test/xwp.out. В таком случае
переменная $_FILES['userfile']['name'][0] будет установлена значением review.html, а
переменная $_FILES['userfile']['name'][1] - значением xwp.out. Аналогично,
переменная$_FILES['userfile']['size'][0] будет содержать размер файла review.html и так
далее.
Переменные $_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0],$_FILES['use
rfile']['size'][0] и $_FILES['userfile']['type'][0] также будут инициализированы.
Внимание
Начиная с версии PHP 5.2.12, конфигурационная директива max_file_uploads регулирует
лимит одновременно загружаемых файлов в течение одного запроса. Вам необходимо
будет убедиться, что ваша форма не пытается загрузить файлов больше этого лимита за
один запрос.
add a note
User Contributed Notes 15 notes
up
down
269
phpuser at gmail dot com ¶
13 years ago
When uploading multiple files, the $_FILES variable is created in the form:
Array
(
[name] => Array
(
[0] => foo.txt
[1] => bar.txt
)
[type] => Array
(
[0] => text/plain
[1] => text/plain
)
[tmp_name] => Array
(
[0] => /tmp/phpYzdqkD
[1] => /tmp/phpeEwEWG
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 123
[1] => 456
)
)
I found it made for a little cleaner code if I had the uploaded files array in the form
Array
(
[0] => Array
(
[name] => foo.txt
[type] => text/plain
[tmp_name] => /tmp/phpYzdqkD
[error] => 0
[size] => 123
)
[1] => Array
(
[name] => bar.txt
[type] => text/plain
[tmp_name] => /tmp/phpeEwEWG
[error] => 0
[size] => 456
)
)
I wrote a quick function that would convert the $_FILES array to the cleaner (IMHO) array.
<?php
function reArrayFiles(&$file_post) {
$file_ary = array();
$file_count = count($file_post['name']);
$file_keys = array_keys($file_post);
for ($i=0; $i<$file_count; $i++) {
foreach ($file_keys as $key) {
$file_ary[$i][$key] = $file_post[$key][$i];
}
}
return $file_ary;
}
?>
Now I can do the following:
<?php
if ($_FILES['upload']) {
$file_ary = reArrayFiles($_FILES['ufile']);
foreach ($file_ary as $file) {
print 'File Name: ' . $file['name'];
print 'File Type: ' . $file['type'];
print 'File Size: ' . $file['size'];
}
}
?>
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №19
«Cookie и сессии PHP»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Сессии и cookies предназначены для хранения сведений о пользователях при
переходах между несколькими страницами. При использовании сессий данные
сохраняются во временных файлах на сервере. Файлы с cookies хранятся на компьютере
пользователя, и по запросу отсылаются броузером серверу.
Использование сессий и cookies очень удобно и оправдано в таких приложениях как
Интернет-магазины, форумы, доски объявлений, когда, во-первых, необходимо сохранять
информацию о пользователях на протяжении нескольких станиц, а, во-вторых,
своевременно предоставлять пользователю новую информацию.
Протокол HTTP является протоколом "без сохранения состояния". Это означает, что
данный протокол не имеет встроенного способа сохранения состояния между двумя
транзакциями. Т. е., когда пользователь открывает сначала одну страницу сайта, а затем
переходит на другую страницу этого же сайта, то основываясь только на средствах,
предоставляемых протоколом HTTP невозможно установить, что оба запроса относятся к
одному пользователю. Т. о. необходим метод, при помощи которого было бы отслеживать
информацию о пользователе в течение одного сеанса связи с Web-сайтов. Одним из таких
методов является управление сеансами при помощи предназначенных для этого функций.
Для нас важно то, что сеанс по сути, представляет собой группу переменных, которые, в
отличие от обычных переменных, сохраняются и после завершения выполнения PHPсценария.
При работе с сессиями различают следующие этапы:
•
•
•
открытие сессии
регистрация переменных сессии и их использование
закрытие сессии
Открытие сессии
Самый простой способ открытия сессии заключается
функции session_start, которая вызывается в начале PHP-сценария:
в
использовании
session_start
Синтаксис:
session_start();
Эта функция проверяет, существует ли идентификатор сессии, и, если нет, то создает
его. Если идентификатор текущей сессии уже существует, то загружаются
зарегистрированные переменные сессии.
Регистрация переменных сессии
После инициализации сессии появляется возможность сохранять информацию в суперглобальном массиве $_SESSION. Пусть имеется файл index.php в котором в
массив $_SESSION сохраняется переменная и массив.
<?php
// Инициируем сессию
session_start();
// Помещаем значение в сессию
$_SESSION['name'] = "value";
// Помещаем массив в сессию
$arr = array("first", "second", "third");
$_SESSION['arr'] = $arr;
// Выводим ссылку на другую страницу
echo "<a href='other.php'>другая страница</a>";
?>
На страницах, где происходит вызов функции session_start(), значения данных
переменных можно извлечь из суперглобального массива $_SESSION. В следующем
листинге приводится содержимое страницы other.php, где извлекаются данные, ранее
помещенные на странице index.php.
<?php
// Инициируем сессию
session_start();
// Выводим содержимое суперглобального массива $_SESSION
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
?>
Результат работы скрипта выглядит следующим образом:
Array
(
[name] => value
[arr] => Array
(
[0] => first
[1] => second
[2] => third
)
)
Закрытие сессии
После завершения работы с сессией сначала нужно разрегистрировать все переменные
сессии, а затем вызвать функцию unset():
Синтаксис:
unset($_SESSION["username"]);
Пример простой сессии
Рассмотрим пример простой сессии, работающей с тремя страницами. При посещении
пользователем
первой
страницы
открывается
сессия
и
регистрируется
переменная $username. Соответствующий код реализации приведен в листинге:
<?
session_start();
$_SESSION['username'] = "maksim";
echo 'Привет, '.$_SESSION['username']."<br>";
?>
<a href="page2.php">На следующую страницу </a>
Результат работы этого сценария показан на рис:
После этого, пользователь maksim нажимает на ссылку и попадает на страницу
page2.php, код которой приведен в листинге:
<?
session_start();
echo $_SESSION['username'].' , ты пришел на другую страницу этого сайта!';
echo("<br>");
?>
<a href="page3.php">На следующую страницу </a>
Результат работы этого скрипта показан на рис:
При нажатии на ссылку, пользователь попадает на страницу page3.php, при этом
происходит разрегистрация сеансовой переменной и уничтожение сессии.
Соответствующий код реализации приведен в листинге:
<?
session_start();
unset($_SESSION['username']); // разрегистрировали переменную
echo 'Привет, '.$_SESSION['username'];
/* теперь имя пользователя уже не выводится */
session_destroy(); // разрушаем сессию
?>
Как видно из рисунка, после разрегистрации сеансовой переменной значение
массива $_SESSION['username'] уже недоступно:
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №20
«Создание класса в PHP»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
PHP - это объектно-ориентированный язык, и возможностей у него в этом
направлении очень много, и совершенно глупо их не использовать. Для тех, кто не знаком
с ООП предлагаю почитать эту статью: ООП в JavaScript. Основой ООП является
объект, а фабрикой для создания объектов является класс. И как раз о создании классов
в PHP мы и поговорим в этой статье.
Класс состоит из следующих частей:
1. Свойства.
2. Конструктор.
3. Методы.
Но прежде, чем добавлять все эти части давайте создадим описание класса (пусть файл
называется "myclass.php"):
<?php
class MyClass {
}
?>
Здесь мы создали пустой класс с именем "MyClass". Теперь добавим в наш класс
свойства для нашего будущего объекта:
<?php
class MyClass {
public $x;
public $y;
const pi = 3.1415926;
}
?>
Здесь мы создали три свойства (кстати, свойства иногда ещё называют полями).
Обратите внимание, что они доступны за пределами класса (модификатор доступа "public"). Если бы вместо "public" был бы "private", то они были бы доступны только
внутри самого класса, а если "protected", то в самом классе и в наследниках (дочерних
классах). Впрочем, более подробно, мы поговорим о них в следующих статьях.
Также мы добавили одну константу. И обратите внимание, что перед именем константы
нет знака "$", то есть это не переменная, и этот знак ставить не надо.
Теперь создадим конструктор.
<?php
class MyClass {
public $x;
public $y;
const pi = 3.1415926;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
echo "Былсозданобъектспараметрами: $xи $y";
}
}
?>
Конструктор в PHP - это функция __construct(). Этой функции мы можем передавать
параметры, которые затем каким-либо образом использовать. В данном случае, мы
получили параметры из конструктора и записали их в свойства класса. Обратите
внимание, что обращение к свойствам класса надо обращаться через $this->имя_
свойства. Также мы вывели строку просто для того, чтобы Вы понимали, что в
конструкторе Вы можете делать всё, что пожелаете (как в обычной функции).
Теперь перейдём к последнему пункту созданию класса - это добавление методов.
Добавим метод, который считает и возвращает сумму свойств x и y, а также метод,
возвращающий константу pi:
<?php
class MyClass {
public $x;
public $y;
const pi = 3.1415926;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
echo "Былсозданобъектспараметрами: $x и $y";
}
function sum() {
$sum = $this->x + $this->y;
return $sum;
}
function getPI() {
return self::pi;
}
}
?>
Здесь всё очень просто: создаём переменную, в которую записываем сумму двух
свойств: x и y. Потом возвращаем результат. Второй метод возвращает константу.
Обратите внимание, что мы обращаемся с помощью такой конструкции:
"self::имя_константы". Так обращаются к константе внутри класса.
А теперь главный вопрос: "Как использовать данный класс в PHP?". Для этого создаём
ещё один файл, в котором пишем такой код:
<?php
require_once "myclass.php";
$myobj = new MyClass(15, 17);
echo "<br />";
echo $myobj->x;
echo "<br />";
echo $myobj->y;
echo "<br />";
echo MyClass::pi;
echo "<br />";
echo $myobj->sum();
echo "<br />";
echo $myobj->getPI();
?>
Здесь мы сначала подключили наш класс, потом создали объект, передав конструктору
параметры (15 и 17). Затем начали выводить свойства. Как видите, синтаксис такой:
"имя_объекта->имя_свойства". Безусловно, данные свойства будут выводиться только
если они public, а если они являются private или protected, то, соответственно, Вы
увидите ошибку. Также обратите внимание на вывод константы:
"имя_класса::имя_константы".
Затем мы используем два метода (sum() и getPI()) и печатаем возвращаемые ими
значения.
Если Вы впервые знакомитесь с ООП, то, думаю, что сейчас Вы в шоке. И это
неудивительно, ведь тема эта очень сложная, и по ней пишут целые тома. Я постараюсь в
дальнейших статьях раскрыть эту тему, чтобы Вы поняли преимущество ООП, ведь почти
все, кто пишет большие скрипты на PHP используют ООП, и без него действительно
трудно обойтись. А если Вы делаете небольшие скрипты, то тогда ООП использовать
совсем необязательно. Но поверьте моему опыту, что если Вы будете серьёзно
программировать (необязательно на PHP), то ООП Вы будете использовать в будущем на
полную катушку, и я постараюсь Вам дать тот фундамент, ту базу, от которой Вы сможете
уже повышать свой уровень знаний по этой теме.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №21
«Создание производного класса в PHP»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Наследование классов в PHP
Наследование - это не просто создание точной копии класса, а расширение уже
существующего класса, чтобы потомок мог выполнять какие-нибудь новые, характерные
только ему функции.
Итак, пусть у нас есть некоторый класс A с определенными свойствами и методами. Но
то, что этот класс делает, нас не совсем устраивает — например, пусть он выполняет
большинство функций, по сути нам необходимых, но не реализует некоторых других.
Зададимся целью создать новый класс B, как бы "расширяющий" возможности класса A,
добавляющий ему несколько новых свойств и методов. Сделать это можно двумя
принципиально различными способами. Первый выглядит примерно так:
<?php
class A {
function TestA() { ... }
function Test() { ... }
}
class B {
var $a; // объект класса A
function B(параметры_для_A, другие_параметры){
$a = new A(параметры_для_A);
// инициализируем другие поля B
}
function TestB() { ... }
function Test() { ... }
}
?>
Поясним: в этой реализации объект класса B содержит в своем составе подобъект
класса A в качестве свойства. Это свойство — лишь "частичка" объекта класса B, не более
того. Подобъект не "знает", что он в действительности не самостоятелен, а содержится в
классе B, поэтому не может предпринимать никаких действий, специфичных для этого
класса.
Мы хотели получить расширение возможностей класса A, а не нечто, содержащее
объекты A. Что означает "расширение"? Лишь одно: мы бы хотели, чтобы везде, где
допустима работа с объектами класса A, была допустима и работа с объектами класса B.
Но в приведенном примере это совсем не так.
Итак, мы имеем некоторые проблемы:
1. Мы не видим явно, что класс B лишь расширяет возможности A, а не является
отдельной сущностью;
2. Мы должны обращаться к "части A" класса B через $obj->a->TestA(), а к членам самого
класса B как $obj->TestB(). Последнее может быть довольно утомительным, если, как это
часто бывает, в B будет использоваться очень много методов из A и гораздо меньше —
из B. Кроме того, это заставляет нас постоянно помнить о внутреннем устройстве
класса B.
Теперь на практике рассмотрим, что же представляет собой наследование (или
расширение возможностей) классов:
<?php
class B extends A {
function B(параметры_для_A, другие_параметры) {
$this->A(параметры_для_A);
// инициализируем другие поля B
}
function TestB() { ... }
function Test() { ... }
}
?>
Ключевое слово extends говорит о том, что создаваемый класс является лишь
"расширением" класса A, и не более того. То есть B содержит те же самые свойства и
методы, что и A, но, помимо них и еще некоторые дополнительные, "свои".
Теперь "часть A" находится прямо внутри класса B и может быть легко доступна, наравне
с методами и свойствами самого класса B. Например, для
объекта $obj класса B допустимы выражения $obj->TestA() и $obj->TestB().
Итак, мы видим, что, действительно, класс B является воплощением идеи "расширение
функциональности
класса A". Обратите также внимание: мы можем теперь забыть, что B унаследовал
от A некоторые свойства или методы — снаружи все выглядит так, будто
класс B реализует их самостоятельно.
Немного о терминологии: родительский класс A принято называть базовым классом, а
класс дочерний класс B — производным от A. Иногда базовый класс также
называют суперклассом, а производный — подкласcом.
Рассмотрим еще один пример на PHP:
<?php
class Parent {
function parent_funct() { echo "<h1>Это родительская функция</h1>"; }
function test () { echo "<h1>Это родительский класс</h1>"; }
}
class Child extends Parent {
function child_funct() { echo "<h2>Это дочерняя функция</h2>"; }
function test () { echo "<h2>Это дочерний класс</h2>"; }
}
$object = new Parent;
$object = new Child;
$object->parent_funct(); // Выводит 'Это родительская функция'
$object->child_funct(); // Выводит 'Это дочерняя функция'
$object->test(); // Выводит 'Это дочерний класс'
?>
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №22
«Создание интерфейса в PHP»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Интерфейсы стоит создавать когда есть общая задача и несколько вариантов ее решения,
применяемых в зависимости от ситуации. Например задача сохранения данных, а в
качестве решения сохранение данных:
•
•
•
в базу данных;
в файл;
в сессию и др.
В данном случае есть смысл создать один общий интерфейс с обязательными методами
вроде insert() - непосредственное сохранение данных. В зависимости от места хранения
данных, каждый класс будет по своему реализовывать сохранение данных, но называться
данный метод всегда будет insert(), если мы пропишем его в интерфейсе.
После создания интерфейса нужно создать несколько классов-сервисов его реализующих
(имплементирующих).
Для начала, давайте рассмотрим пример без использования интерфейса.
При создании приложения согласно ООП, нужно отделять логику от функционала,
разбивая задачи на отдельные классы.
Допустим есть 3 класса:
- Date (общий класс, получающий данные и использующий методы вспомогательного
класса(сервиса) для их сохранения);
- saveDb (класс сохраняющий данные в базу данных);
- saveFile (класс сохраняющий данные в файл)
classDate{
//Db – класс сохраняющий данные в БД, $base – экземпляр этого класса
publicfunctiondate(saveDb $base){
$message = array(); //получение данных из формы
$date = $this->validate($message); //валидация
$base->insertInto(); //вызовметодовклассаDbдлясохранения
}
publicfunctionvalidate($date){
//проверкаданных
return $date;
}
}
в данном примере, для сохранения данных, методу date() класса Date, в качестве
аргумента, нужно передать экземпляр конкретного класса - saveDb или saveFile.
Недостаток данного подхода в том, что класс проверяющий данные и класс сохраняющий
данные сильно связаны между собой. В примере, мы указываем, что аргумент метода
date() - это экземпляр класса работающего с базой данных. Далее используются нужные
методы данного класса (saveDb) вроде insertInto().
А что, если понадобится сохранить данные не в БД, а в файл?!! В этом случае нужно
будет менять весь метод date(), ведь у другого класса могут быть совсем другие методы, а
не метод insertInto() и весь принцип построения другого класса может сильно отличаться.
Может быть, там даже будет предусмотрена своя валидация и метод validate() класса Date
окажется лишним.
Вот в таких случаях и используются интерфейсы. Они помогают в создании шаблонов для
классов, которые будут использоваться в приложении и иметь общие методы делающие
одни и те же задачи, но своим способом. Интерфейсы позволяют быстрее разобраться в
коде и легче его поддерживать. Так же, они помогают создавать слабую связанность
между классами, что можно продемонстрировать на примере:
interfaceSave{
publicfunctioninsert($date);
}
classsaveDbimplementsSave{
protectedfunctionconnectDb(){}
publicfunctioninsert($date){
echo $date.' сохраненовБД<br>';
}
}
classsaveFileimplementsSave{
protectedfunctionopenFile(){}
publicfunctioninsert($date){
echo $date.' сохраненовфайл<br>';
}
protectedfunctioncloseFile(){}
}
classsaveSessionimplementsSave{
publicfunctioninsert($date){
echo $date.' сохраненовсессию<br>';
}
}
////////////////////////////////////
classDate{
public $date;
publicfunction__construct($date){
$this->date = $date;
}
// Save – интерфейс для сохранения данных, $obj – экземпляр одного из классов реализую
щих данный интерфейс.
publicfunctionsave(Save $obj){
$date = $this->validate($this->date); //валидация
$obj->insert($date); //вызов методов класса Db для сохранения
}
publicfunctionvalidate($date){
// тутпроверкаданных
return $date;
}
}
$date = new Date('Контент');
$db = newsaveDb();
$date->save($db); //КонтентсохраненовБД
$file = newsaveFile();
$date->save($file); //Контентсохраненовфайл
$ses = newsaveSession();
$date->save($ses); //Контентсохраненовсессию
В моем упрощенном примере видно, что интерфейс обязует реализующие его классы
иметь метод insert(), который (допустим) непосредственно занимаются вставкой данных.
А кроме него, каждый класс может иметь другие необходимые для его работы методы.
Для класса saveDb, это, например, метод connectDb(), создающий соединение с базой
данных. Для тестирования, я сделал вывод сообщений при срабатывании метода insert().
Таким образом, при работе с данными, в конструктор нужного класса или другой метод,
мы можем передавать класс-сервис, указывая, что он относится к определенному
интерфейсу и быть уверенными, что для всех классов данной группы используются
одинаковые методы. Информацию про данные методы (документацию), кстати, можно
указать прямо в коде интерфейса возле соответствующих методов, тем более, что там
будет намного меньше строк чем в реализующих его классах.
В данном примере, вместо зависимости от конкретного класса (saveDb) передается
зависимость от интерфейса Save:
publicfunctionsave(Save $obj)
Код класса Date не зависит от конкретного реализатора, а только от интерфейса. Стоит
отметить, что данный пример построен на базе паттерна "Dependency injection", что
переводится как "внедрение зависимости".
Интерфейс обеспечивает наличие указанных в нем методов во всех классах которые его
реализуют. Поэтому можно быть уверенным, что вызов метода insert():
$obj->insert($date);
приведет к сохранению данных. При этом место хранения зависит от реализации данного
метода в каждом из классов. Так, метод insert() класса saveDb сохраняет в базу данных,
метод insert() класса saveFile сохраняет в файл и тд. Выполните код данного примера и
увидите, что класс Date отработал со всеми классами интерфейса Save и при этом, код
самого класса Date никак не пришлось менять.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №23
«Получение данных из БД MySQL»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
SQL - запросы и их обработка с помощью PHP
В данной статье мы рассмотрим способы обращения к таблицам баз данный MySQL с
помощью языка запросов SQL. SQL - это аббревиатура, которая так и "раскрывается" структуризированный язык запросов.
В языке PHP для это цели существует целый ряд функций с префиксом "mysql". Нам для
рассмотрения запросов понадобится не так много из них. Функция, без которой в языке
PHP выполнение SQL-запросов было бы просто невозможным:
resource mysql_query(запрос)
Данная функция посылает запрос к базе данных и возвращает в случае успешного
обращения идентификатор ресурса.
Для того чтобы подключиться к базе данных MySQL необходимо выполнить следующую
последовательность:
$host='localhost'; // имя хоста (уточняется у провайдера)
$database='db_name'; // имя базы данных, которую вы должны создать
$user='user_name'; // заданное вами имя пользователя, либо определенное провайдером
$pswd='your_pass'; // заданный вами пароль
$dbh = mysql_connect($host, $user, $pswd) or die("Немогусоединитьсяс MySQL.");
mysql_select_db($database) or die("Немогуподключитьсякбазе.");
Итак mysql_connect() - функциядляподключенияксерверу MySQL наВашемхостинге.
А mysql_select_db() выбирает базу данных на сервере для подключения.
Иными словами подключаемся к серверу, выбираем базу и начинаем работать.
Функция die() вызывается в случае ошибки и выводит в окно браузера сообщение, которое
вы указали.
Для завершения работы с базами данных используется функция:
mysql_close($dbh);
Здесь $dbh - дескриптор, которые при соединении возвратила функция mysql_connect.
Закончив стартовый обзор, начнем рассмотрение собственно SQL-запросов.
Для этого прежде всего вам необходимо создать базу данных с определенном именем. А в
ней создать таблицу, тоже с конкретным именем. В наших примерах будем обращаться к
таблице my_sql_table. Чтобы создать эту таблицу давайте выполним в phpmyadmin нашего
localhost следующий запрос:
CREATE TABLE `my_sql_table` (
`id` INT NOT NULL , // идентификатор будущих записей таблицы
`firstname` VARCHAR( 50 ) NOT NULL , // текстовоеполе VARCHAR
`surname` VARCHAR( 50 ) NOT NULL , // max длиной 50 символов
PRIMARY KEY ( `id` ) // первичный ключ - идентификатор id
);
Итак таблица создана. Выполним первый запрос, который сразу оформим в виде PHPкода:
<?php
// Файл firstsql.php
$host='localhost'; // имя хоста (уточняется у провайдера)
$database='db_name'; // имя базы данных, которую вы должны создать
$user='user_name'; // заданное вами имя пользователя, либо определенное провайдером
$pswd='your_pass'; // заданный вами пароль
$dbh = mysql_connect($host, $user, $pswd) or die("Немогусоединитьсяс MySQL.");
mysql_select_db($database) or die("Немогуподключитьсякбазе.");
$query = "SELECT * FROM `my_sql_table`";
$res = mysql_query($query);
while($row = mysql_fetch_array($res))
{
echo "Номер: ".$row['id']."<br>\n";
echo "Имя: ".$row['firstname']."<br>\n";
echo "Фамилия: ".$row['surname']."<br><hr>\n";
}
?>
Разберем PHP-код файла firstsql.php. Начнем с собственно запроса к таблицам базы
данных (БД).
$query = "SELECT * FROM `my_sql_table`";
Данный запрос можно расшифровать так: выбрать из таблицы my_sql_table БД все записи
из всех полей. Таким образом знак * после слова SELECT означает "выбрать абсолютно
все". Итак, запрос сформирован. Теперь его надо выполнить:
$res = mysql_query($query);
В случае успешного выполнения запроса функция mysql_query() вернет нам
идентификатор ресурса $res.
Его мы должны передать в качестве параметра в функцию mysql_fetch_array(). Название
этой функции говорит само за себя. Т.е. она формирует и выдает массив по выборке из
таблицы БД. В случае нашей таблицы массив будет состоять из числа элементов, равных
количествам записей (строк) в таблице и содержать значения id, firstname, surname для
каждой строки таблицы. Следовательно, следующий код:
while($row = mysql_fetch_array($res))
{
echo "Номер: ".$row['id']."<br>\n";
echo "Имя:".$row['firstname']."<br>\n";
echo "Фамилия:".$row['surname']."<br><hr>\n";
}
можно прокомментировать так: пока введенная нами переменная $row получает не
нулевые результаты работы функции mysql_fetch_row следует выдать в броузер значение
полей $row['id'], $row['firstname'], $row['surname'] с помощью echo.
Еслизапросвыполнитьтак:
$query = "SELECT firstname FROM `my_sql_table`";
то это будет означать, что из всех строк выбирается только значения поля firstname.
Следовательно предыдущий код следует переписать как:
$res = mysql_query($query);
while($row = mysql_fetch_array($res))
{
echo "Имя:".$row['firstname']."<br>\n";
}
Если Вы хотите выбрать строки таблицы с конкретным значением id где фамилия
(surname) будет Петров, то запрос перепишется следующим образом:
$query = "SELECT id FROM `my_sql_table` where surname='Петров'";
А вот если потребуется узнать фамилию того, кто находится под номером, к примеру, 5,
то запрос будет таким:
$query = "SELECT surname FROM `my_sql_table` where id=5";
В этом случае Вы знаете, что результатом запроса будет всего одна строка из таблицы.
Т.е. нет смысла организовывать цикл с использованием while. И обработка запроса будет
следующей
$res = mysql_query($query);
$row = mysql_fetch_row($res);
echo "Фамилия пятого человека в списке: ".$row[0]."\n";
Здесь вместо mysql_fetch_array() мы применили mysql_fetch_row(). Т.е. получить
значение поля (или полей) конкретной строки. Поскольку поле у нас было одно - surname
- мы можем обратиться к единственному элементу массива $row как $row[0];.
Далее мы не будем столь подробно останавливаться на обработке запросов, а будем
рассматривать наиболее типичные примеры собственно запросов.
Итак, рассмотрим наиболее типичные примеры запросов MySQL. Рассмотрение проведем
на базе таблицы my_sql_table:
1. Добавим в таблицу my_sql_table поле middle_name (отчество) после surname:
$query = "ALTER TABLE `my_sql_table` ADD `middle_name`
VARCHAR( 50 ) NOT NULL AFTER `surname`";
2. Теперь удалим поле surname из таблицы my_sql_table:
$query = "ALTER TABLE `my_sql_table` DROP `surname`";
3. Удаляем записи из таблицы my_sql_table с фамилией Сидоров :
$query = "DELETE FROM `my_sql_table` where surname='Сидоров'";
4. Помимо знаков равенства, также "больше" или "меньше", в языке MySQL запросов
существует понятие "похоже на". Выберем записи из таблицы my_sql_table, где в
фамилии встречается "дор" :
$query = "SELECT * FROM `my_sql_table` where surname like '%дор%'";
Здесь наличие "%" в начале и конце 'дор' и означает, что запрос будет искать именно 'дор',
причем не важно в начале, конце, или середине фамилии он находится. Рассмотрим
следующий пример
5. Выберем записи из таблицы my_sql_table с фамилией, которая начинается на П.
Обратите внимание на расположение "%":
$query = "SELECT * FROM `my_sql_table` where surname like 'П%'";
6. Вычислиммаксимальноезначение id:
$query = "SELECT MAX(id) FROM `my_sql_table`";
7. Вычислим количество полей в my_sql_table с фамилией, которая начинается на П.
$query = "SELECT COUNT(*) FROM `my_sql_table` where surname like 'П%'";
8. Удаление таблицы my_sql_table:
$query = "DROP TABLE `my_sql_table`";
Для запросов 1-3 на языке PHP достаточно просто выполнить запрос:
mysql_query($query);
Мы рассмотрели наиболее характерные примеры запросов. Полагаю, с их помощью,
следуя элементарной логике, Вы сможете выполнять более сложные запросы к созданным
Вами таблицам баз данных MySQL.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №24
«Добавление данных в БД MySQL»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Прежде всего, нам нужно создать таблицу для ваших данных. Это очень простая
процедура, которую вы можете сделать в phpMyAdmin из вашей панели управления
хостингом. Мы уже описывали процесс создания базы данных MySQL в предыдущем
руководстве(англ.), поэтому мы пропустим этот момент
здесь.
После входа на страницу phpMyAdmin вы увидите подобную
картину:
Создадим таблицу с названием Students для нашей базы данных u266072517_name.
Создать новую таблицу можно по кнопке Create Table. После этого вы увидите новую
страницу, где вы можете ввести все необходимые данные для своей
таблицы:
Это наиболее простой способ создания таблицы, для получения большей информации по
поводу структуры таблицы/базы данных и какие настройки можно использовать для
каждого поля, обратитесь к официальной документации phpMyAdmin(англ.).
Приведём здесь несколько простых пояснение полей, которые мы будем использовать:
•
•
•
•
Name – это имя вашего поля. Будет отображено в самом верху вашей таблицы.
Type – здесь можно установить тип поля. Например, мы выбираем varchar, потому
что здесь нам нужно ввести строку с именем (в котором есть буквы, не цифры).
Length/Values – используется для задания максимальной длины вашей записи в
этом поле.
Index – мы используем индекс “Primary” для нашего поля “ID”. Когда создаётся
таблица, рекомендуется иметь одно поле ID. Она используется для индексации
записей в таблице, когда настраиваются взаимосвязи между таблицами. Здесь
также можно отметить “A_I”, что означает Auto Increment. Эта настройки будет
автоматически увеличивать индекс (1,2,3,4…).
Нажмите Save и ваша таблица будет создана.
Шаг 2 — Создание PHP кода и добавление записи в таблицу MySQL
Вариант 1 – Метод MySQLi
Прежде всего, нужно установить соединение с базой данных, согласно
нашему предыдущему руководству. После этого мы можем продолжить с SQL запросом
на добавление записи в таблицу MySQL – INSERT. Здесь полный пример кода с
подключением и методом вставки:
1. <?php
2. $servername = "mysql.hostinger.co.uk";
3. $database = "u266072517_name";
4. $username = "u266072517_user";
5. $password = "buystuffpwd";
6.
7. // Create connection
8.
9. $conn = mysqli_connect($servername, $username, $password, $database);
10.
11. // Check connection
12.
13. if(!$conn){
14. die("Connection failed: " . mysqli_connect_error());
15. }
16.
17. echo "Connected successfully";
18.
19. $sql = "INSERT INTO Students (name, lastname, email) VALUES ('Thom', 'Vial',
'thom.v@some.com')";
20. if(mysqli_query($conn, $sql)){
21. echo "New record created successfully";
22. } else {
23. echo "Error: " . $sql ."<br>" .mysqli_error($conn);
24. }
25. mysqli_close($conn);
26.
27. ?>
Таким образом первая часть кода (строки 3 – 18) относятся к части установления
соединения к базе данных. Мы не будем заново проходить по этой части, если вы хотите
знать, что означает каждая строка, обратитесь к нашему предыдущему руководству как
подключиться к базе данных(англ.).
Начнём со строки 19:
1. $sql = "INSERT INTO Students (name, lastname, email) VALUES ('Thom', 'Vial',
'thom.v@some.com')";
Это наиболее важная строка кода, она делает всё, о чём мы описываем в этом руководстве
– добавление записи в таблицу MySQL в базу данных. INSERT INTO – это выражение,
которое добавляет запись в указанную таблицу базы данных MySQL. В нашем примере
мы добавляем данные в таблицу Students.
Двигаясь дальше, в скобках, мы определяем поля таблицы, значения в которые будем
добавлять: (name, lastname, email). Данные будут добавлены в определённом порядке.
Если мы напишем (email, lastname, name), значения будут добавлены в другом порядке.
Следующая часть значения VALUES. Здесь мы задаём наши значения в ранее указанные
поля. Таким образом, каждое поле получит своё значение. Например, в нашем случае это
будет что-то вроде: name = Thom, lastname = Vial, email = thom.v@some.com.
Что важно отметить, что тут мы формируем запрос SQL, используя PHP код. SQL
запросы должны быть заключены в кавычки. В нашем примере, всё между кавычками и
идущее после $sql = это SQL запрос.
Следующая часть кода (20 – 22 строки) запускает наш запрос и производит проверку
успешности выполнения запроса:
1. if(mysqli_query($conn, $sql)){
2. echo "New record created successfully";
3. }
Выводится сообщение об удаче, если запрос был запущен верно.
И заключительная часть (22 – 24 строки) показывают другое сообщение, на случай
неудачного выполнения нашего запроса:
1. else {
2. echo "Error: " . $sql ."<br>" .mysqli_error($conn);
3. }
Этот код отображает нам сообщение об ошибке, на случай, если что-то пошло не так.
Вариант 2 – Метод объектов данных PHP (PHP Data Object)
Как и в предыдущем примере, нам нужно прежде всего выполнить подключение к базе
данных, которое производится при создании нового объекта PDO – предыдущее
руководство рассказывает о том, как это происходит. Поскольку подключение к базе
данных MySQL – это PDO объект, мы должны использовать различные PDO ‘методы’
(своего рода функции, которые являются частью определённого объекта) для подготовки
и запуска запроса. Методы объектов вызываются таким образом:
1. $the_Object->the_Method();
PDO позволяет ‘подготовить’ SQL код перед его выполнением. Запрос SQL вычисляется и
корректируется перед запуском. Так, простая атака путём SQL инъекции может быть
выполнена заполняя код SQL в поле формы. Например:
1. // User writes this in the username field of a login form thom"; DROP DATABASE
user_table;
2.
3. // The final query becomes this
4. "SELECT * FROM user_table WHERE username = thom"; DROP DATABASE
user_table;
Поскольку SQL код синтаксически правильный, точка с запятой делает из DROP
DATABASE user_table новый запрос SQL, и ваша таблица пользователей удалена.
Подготавливаемые выражения не разрешают символы “ и ; для завершения исходного
запроса, и инструкция DROP DATABASE никогда не выполнится.
Всегда используйте подготавливаемые запросы, когда отправляете или получаете данные
из базы данных с PDO.
Для использования подготавливаемых выражений, нужно создать новую переменную,
которая вызовет метод prepare() на объекте базы данных.
В правильном виде код выглядит:
1.
2.
3.
4.
5.
6.
7.
8.
$servername = "mysql.hostinger.com";
$database = "u266072517_name";
$username = "u266072517_user";
$password = "buystuffpwd";
$sql = "mysql:host=$servername;dbname=$database;";
$dsn_Options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];
// Create a new connection to the MySQL database using PDO, $my_Db_Connection is an
object
9. try {
10. $my_Db_Connection = new PDO($sql, $username, $password, $dsn_Options);
11. echo "Connected successfully";
12. }catch(PDOException $error){
13. echo 'Connection error: ' . $error->getMessage();
14. }
15.
16. // Set the variables for the person we want to add to the database
17. $first_Name = "Thom";
18. $last_Name = "Vial";
19. $email = "thom.v@some.com";
20.
21. // Here we create a variable that calls the prepare() method of the database object
22. // The SQL query you want to run is entered as the parameter, and placeholders are written
like this :placeholder_name
23. $my_Insert_Statement = $my_Db_Connection->prepare("INSERT INTO Students
(name, lastname, email) VALUES (:first_name, :last_name, :email)");
24.
25. // Now we tell the script which variable each placeholder actually refers to using the
bindParam() method
26. // First parameter is the placeholder in the statement above - the second parameter is a
variable that it should refer to
27. $my_Insert_Statement->bindParam(:first_name, $first_Name);
28. $my_Insert_Statement->bindParam(:last_name, $last_Name);
29. $my_Insert_Statement->bindParam(:email, $email);
30.
31. // Execute the query using the data we just defined
32. // The execute() method returns TRUE if it is successful and FALSE if it is not, allowing
you to write your own messages here
33. if($my_Insert_Statement->execute()){
34. echo "New record created successfully";
35. } else {
36. echo "Unable to create record";
37. }
38.
39. // At this point you can change the data of the variables and execute again to add more data
to the database
40. $first_Name = "John";
41. $last_Name = "Smith";
42. $email = "john.s@email.com";
43. $my_Insert_Statement->execute();
44.
45. // Execute again now that the variables have changed
46. if($my_Insert_Statement->execute()){
47. echo "New record created successfully";
48. } else {
49. echo "Unable to create record";
50. }
В строках 28, 29 и 30 мы используем метод bindParam() объекта базы данных. Есть так
же метод bindValue(), отличающийся от предыдущего.
•
bindParam() – этот метод подсчитывает данные, когда метод execute() достигнут.
Первый раз, когда скрипт доходит до метода execute() он видит,
что $first_Name ссылается на “Thom”, связывает это значение и выполняет запрос.
Когда скрипт добирается второй раз до метода execute(), он смотрит,
что $first_Name теперь ссылается на “John”, связывает это значение и запускает
•
запрос опять с новым значением. Важно понимать, что мы создаём запрос один раз
и затем подставляем разные данные в разных местах скрипта.
bindValue() – этот метод вычисляет данные, как только до него доходит очередь.
Так как значение $first_Name было задано как “Thom”, на момент, когда мы
достигли метода bindValue(), оно будет использован при вызове
метода execute() для $my_Insert_Statement.
Обратите внимание, что мы повторно используем переменную $first_Name и задаём ей
новое значение во второй раз. Если вы проверите свою базу данных после запуска этого
скрипта, там будут оба из заданных имени, вопреки этому значение
переменной $first_Name будет равно “John” в конце этого скрипта. Помните, что PHP
оценивает содержимое скрипта перед его запуском.
Если вы измените свой скрипт заменив bindParam на bindValue, вы добавите в базу
MySQL “Thom Vial” дважды в базу данных и John Smith будет проигнорирован.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №25
«Изменение данных в БД MySQL»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Вывод, редактирование и удаление данных из MySql
•
Создадим таблицу MySql
•
Выведем из таблицы MySql данные
•
Сделаем форму для редактирования и удаления данных из таблицы MySql
Итак, приступим!
Создание таблицы
Давайте создадим в нашей БД таблицу products со следующими
полями: ID, Name, Price. Поле Name у нас будет иметь тип TEXT, остальные два - INT.
Если вам лень в PhpMyAdmin создавать такую табличку руками, то можете просто в нем
выполнить вот этот SQL-код:
CREATETABLEIFNOTEXISTS `products` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` text NOT NULL,
`Price` int(11) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDBDEFAULTCHARSET=utf8 AUTO_INCREMENT=1 ;
Теперь давайте заполним нашу таблицу тестовыми данными. Для наглядности мы
добавим 3 записи:
Заполнить таблицу можно либо ручками через PhpMyAdmin, либо опять же вот таким
простым SQL-запросом:
INSERTINTO `products` (`ID`, `Name`, `Price`) VALUES
(1, 'Хлеб', 35),
(2, 'Йогурт', 27),
(3, 'Пиво Балтика #7', 50);
Вывод записей
Следующим нашим шагом будет обычный вывод этих данных из MySql на webстраничку.
Создадим новую страницу, к примеру "product_list.php" с установленным соединением
с БД:
<!doctype html>
<html lang="ru">
<head>
<title>Админ-панель</title>
</head>
<body>
<?php
$host = 'localhost'; // Хост, унасвселокально
$user = 'user_bd'; // Имя созданного вами пользователя
$pass = '1q2w3e4r5t'; // Установленный вами пароль пользователю
$db_name = 'my_db'; // Имябазыданных
$link = mysqli_connect($host, $user, $pass, $db_name); // Соединяемсясбазой
// Ругаемся, если соединение установить не удалось
if(!$link) {
echo 'Не могу соединиться с БД. Кодошибки: ' . mysqli_connect_errno() . ', ошибка: ' .
mysqli_connect_error();
exit;
}
?>
</body>
</html>
Теперьвыведемвсезаписиизтаблицы. Для этого после подключения к БД (перед
закрывающимся тегом </body>) вставим следующий код:
<table border='1'>
<tr>
<td>Идентификатор</td>
<td>Наименование</td>
<td>Цена</td>
</tr>
<?php
$sql = mysqli_query($link, 'SELECT `ID`, `Name`, `Price` FROM `products`');
while ($result = mysqli_fetch_array($sql)) {
echo "<tr><td>{$result['ID']}</td><td>{$result['Name']}</td><td>{$result['Price']}
₽</td></tr>";
}
?>
</table>
Если вы увидели на экране табличку с вашими товарами, то ПОЗДРАВЛЯЮ, пока что
у вас все получается как надо! Возможно только для этого вы сюда и пришли. Этот
вариант уже можно разместить на сайте, а добавлять и редактировать товары
четез PhpMyAdmin. Все изменения будут автоматически отображаться на вашей
страничке, доступной пользователям. Конечно вам придется для более касивого
отображения таблички поколдовать со стилями css, но это уже другая тема :) Итак, мы
поедем дальше и сделаем редактирование и удаление этих товаров.
Редактирование и удаление записей
Давайте определимся, что нам надо уметь делать? Первое - удалять записи, воторое редактировать записи. Ну а третье (вставлять новые записи) - мы уже сделали в прошлом
уроке.
Итак, для того, чтобы мы могли удалить запись, нам надо в строке браузера передать в
какой-либо переменной ID этой записи. Иными словами, нам надо, чтобы строка браузера
у нас выглядела примерно так:
На скриншоте выше мы видим переменную del_id в строке браузера, которая равна 1.
Значение этой переменной можно прочитать средствами PHP и удалить из MySql-таблицы
запись под номером 1 (ID = 1). Давайте сделаем это. Для начала передадим переменную,
которая укажет, какую запись надо удалить. Для этого рядом с каждой записью добавим
ссылку на удаление, в которой и передадим эту переменную. Итак, наша табличка с
выведенными данными изменится следующим образом:
<table border='1'>
<tr>
<td>Идентификатор</td>
<td>Наименование</td>
<td>Цена</td>
<td>Удаление</td>
</tr>
<?php
$sql = mysqli_query($link, 'SELECT `ID`, `Name`, `Price` FROM `products`');
while ($result = mysqli_fetch_array($sql)) {
echo '<tr>' .
"<td>{$result['ID']}</td>" .
"<td>{$result['Name']}</td>" .
"<td>{$result['Price']} ₽</td>" .
"<td><a href='?del_id={$result['ID']}'>Удалить</a></td>" .
'</tr>';
}
?>
</table>
Теперь, если вы будете переходить по ссылкам "Удалить", то увидите, что значения
переменной в строке браузера будет меняться в зависимости от выбранного продукта.
Теперь давайте перед самым выводом товаров проверим, не передана ли
переменная del_id, и если она передана, то удалим запись. Для этого после подключения к
БД почти в начало файла вставим следующий код:
<?php
if (isset($_GET['del_id'])) { //проверяем, есть ли переменная
//удаляемстрокуизтаблицы
$sql = mysqli_query($link, "DELETE FROM `products` WHERE `ID` =
{$_GET['del_id']}");
if ($sql) {
echo "<p>Товарудален.</p>";
} else {
echo '<p>Произошлаошибка: ' . mysqli_error($link) .'</p>';
}
}
?>
Редактирование записей
Итак, если вы дочитали до сюда, то вы уже что-то понимаете, что к чему и как это
работает. Я постараюсь рассказать, как будет работать редактирование, а в завершение
приведу полный листинг кода всего примера, где вы сможете посмотреть и понять, как это
реализовать.
Итак, редактирование:
•
мы также как и для удаления передадим переменную red_id
•
достанем из БД запись с таким номером, чему равна red_id
•
подставим полученные из БД данные в форму редактирования (для этого мы
воспользуемся сокразениями php для вывода результатов и для выполнения
условий)
•
сохраним эти данные в БД
Сокращенная запись echo с условием
Следующие два примера кода делают одно и то же.
<?php
if ($a === 1) {
echo 'A = 1';
} else {
echo 'A != 1';
}
?>
<?= (a === 1) ? 'A = 1' : 'A != 1'; ?>
Полный листинг кода
<!doctypehtml>
<html lang="ru">
<head>
<title>Админ-панель</title>
</head>
<body>
<?php
$host = 'localhost'; // Хост, унасвселокально
$user = 'user_bd'; // Имя созданного вами пользователя
$pass = '1q2w3e4r5t'; // Установленный вами пароль пользователю
$db_name = 'my_db'; // Имябазыданных
$link = mysqli_connect($host, $user, $pass, $db_name); // Соединяемсясбазой
// Ругаемся, если соединение установить не удалось
if(!$link) {
echo 'Не могу соединиться с БД. Кодошибки: ' . mysqli_connect_errno() . ', ошибка: ' .
mysqli_connect_error();
exit;
}
//Еслипеременная Name передана
if (isset($_POST["Name"])) {
//Если это запрос на обновление, то обновляем
if (isset($_GET['red_id'])) {
$sql = mysqli_query($link, "UPDATE `products` SET `Name` =
'{$_POST['Name']}',`Price` = '{$_POST['Price']}' WHERE `ID`={$_GET['red_id']}");
} else {
//Иначе вставляем данные, подставляя их в запрос
$sql = mysqli_query($link, "INSERT INTO `products` (`Name`, `Price`) VALUES
('{$_POST['Name']}', '{$_POST['Price']}')");
}
//Если вставка прошла успешно
if ($sql) {
echo '<p>Успешно!</p>';
} else {
echo '<p>Произошлаошибка: ' . mysqli_error($link) .'</p>';
}
}
if (isset($_GET['del_id'])) { //проверяем, есть ли переменная
//удаляемстрокуизтаблицы
$sql = mysqli_query($link, "DELETE FROM `products` WHERE `ID` =
{$_GET['del_id']}");
if ($sql) {
echo "<p>Товарудален.</p>";
} else {
echo '<p>Произошлаошибка: ' . mysqli_error($link) .'</p>';
}
}
//Если передана переменная red_id, то надо обновлять данные. Для начала достанем их
из БД
if (isset($_GET['red_id'])) {
$sql = mysqli_query($link, "SELECT `ID`, `Name`, `Price` FROM `products` WHERE
`ID`={$_GET['red_id']}");
$product = mysqli_fetch_array($sql);
}
?>
<form action="" method="post">
<table>
<tr>
<td>Наименование:</td>
<td><input type="text" name="Name" value="<?= isset($_GET['red_id']) ? $product['Name'] :
''; ?>"></td>
</tr>
<tr>
<td>Цена:</td>
<td><input type="text" name="Price" size="3" value="<?= isset($_GET['red_id']) ?
$product['Price'] : ''; ?>">руб.</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="OK"></td>
</tr>
</table>
</form>
<table border='1'>
<tr>
<td>Идентификатор</td>
<td>Наименование</td>
<td>Цена</td>
<td>Удаление</td>
<td>Редактирование</td>
</tr>
<?php
$sql = mysqli_query($link, 'SELECT `ID`, `Name`, `Price` FROM `products`');
while ($result = mysqli_fetch_array($sql)) {
echo '<tr>' .
"<td>{$result['ID']}</td>" .
"<td>{$result['Name']}</td>" .
"<td>{$result['Price']} ₽</td>" .
"<td><a href='?del_id={$result['ID']}'>Удалить</a></td>" .
"<td><a href='?red_id={$result['ID']}'>Изменить</a></td>" .
'</tr>';
}
?>
</table>
<p><a href="?add=new">Добавитьновыйтовар</a></p>
</body>
</html>
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 26
«Добавление и получение данных из MySQL»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Для получения данных используется выражение sql "SELECT". Например, получим все
данные из таблицы tovars:
1
$query ="SELECT * FROM tovars";
Теперь посмотрим на примере. Создадим страницу index.php, которая будет выводить
значения из таблицы tovars:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
require_once 'connection.php'; // подключаемскрипт
$link = mysqli_connect($host, $user, $password, $database)
or die("Ошибка " . mysqli_error($link));
$query ="SELECT * FROM tovars";
$result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
if($result)
{
$rows = mysqli_num_rows($result); // количествополученныхстрок
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
echo "<table><tr><th>Id</th><th>Модель</th><th>Производитель</th></tr>";
for ($i = 0 ; $i < $rows ; ++$i)
{
$row = mysqli_fetch_row($result);
echo "<tr>";
for ($j = 0 ; $j < 3 ; ++$j) echo "<td>$row[$j]</td>";
echo "</tr>";
}
echo "</table>";
// очищаемрезультат
mysqli_free_result($result);
}
mysqli_close($link);
?>
</body>
</html>
Для вывода результатов запроса здесь используется цикл for. Для цикла for нам нужно
знать, сколько всего строк получено в переменной $result. Для этого применяется
функция mysqli_num_rows().
Для прохода по строкам используется следующий цикл:
1
2
3
4
5
6
7
for ($i = 0 ; $i < $rows ; ++$i)
{
$row = mysqli_fetch_row($result);
echo "<tr>";
for ($j = 0 ; $j < 3 ; ++$j) echo "<td>$row[$j]</td>";
echo "</tr>";
}
Чтобы извлечь отдельную строку, используется функция mysqli_fetch_row(). После
вызова этой функции указатель в наборе $result переходит к новой строке, поэтому с
каждым новым вызовом мы извлекаем новую строку.
Внутренний цикл осуществляет перебор по ячейкам текущей строки:
1
for ($j = 0 ; $j < 3 ; ++$j) echo "<td>$row[$j]</td>";
Так как при выборки мы получаем данные для всех трех столбцов таблицы, то счетчик $j
проходит от 0 до 3. Каждая строка представляет собой массив ячеек, поэтому с помощью
выражения $row[$j] мы можем получить доступ к конкретной ячейке строки.
Вместо цикла for можно было использовать также цикл while:
1
2
while ($row = mysqli_fetch_row($result)) {
echo "<tr>";
3
4
5
for ($j = 0 ; $j < 3 ; ++$j) echo "<td>$row[$j]</td>";
echo "</tr>";
}
И поскольку переменная $result после выполнения запроса будет хранить данные, то в
конце нам надо очистить память от ненужных данных с помощью
функции mysqli_free_result().
Мы также можем получать не все данные, а, например, данные для определенных
столбцов. Например, получим только названия моделей:
1
2
3
4
5
6
7
8
9
10
11
12
13
$query ="SELECT name FROM tovars";
$result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
if($result)
{
echo "<ul>";
while ($row = mysqli_fetch_row($result)) {
echo "<li>$row[0]</li>";
}
echo "</ul>";
mysqli_free_result($result);
}
В этом случае каждая строка в наборе $result будет содержать только одну ячейку, то есть
обратиться $row[1], мы не сможем, так как в данном случае извлекаем данные только для
одного столбца.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 27
«Создание формы редактирования объекта»
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Редактирование уже имеющихся данных будет немного сложнее получения и добавления
данных из бд. Прежде всего потому, что здесь нам надо совместить, во-первых, получение
редактируемых данных, а затем их обновление базы данных новыми значениями.
Для обновления применяется выражение SQL "UPDATE":
1
$query ="UPDATE tovars SET name='Samsung ACE II', company='Samsung' WHERE id='1'";
После слова SET идет перечисление названий столбцов и новых значений для них. В
конце строки запроса указывается селектор с помощью выражения WHERE. В данном
случае все у всех строк, у которых id='1', устанавливаются значения name='Samsung ACE
II' и company='Samsung'
Теперь создадим новый файл edit.php, который будет содержать логику редактирования. И
добавим в него следующее содержание:
1
2
3
4
5
6
7
8
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
require_once 'connection.php'; // подключаемскрипт
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// подключаемсяксерверу
$link = mysqli_connect($host, $user, $password, $database)
or die("Ошибка " . mysqli_error($link));
// еслизапрос POST
if(isset($_POST['name']) && isset($_POST['company']) && isset($_POST['id'])){
$id = htmlentities(mysqli_real_escape_string($link, $_POST['id']));
$name = htmlentities(mysqli_real_escape_string($link, $_POST['name']));
$company = htmlentities(mysqli_real_escape_string($link, $_POST['company']));
$query ="UPDATE tovars SET name='$name', company='$company' WHERE id='$id'";
$result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
if($result)
echo "<span style='color:blue;'>Данныеобновлены</span>";
}
// еслизапрос GET
if(isset($_GET['id']))
{
$id = htmlentities(mysqli_real_escape_string($link, $_GET['id']));
// созданиестрокизапроса
$query ="SELECT * FROM tovars WHERE id = '$id'";
// выполняемзапрос
$result = mysqli_query($link, $query) or die("Ошибка " . mysqli_error($link));
//если в запросе более нуля строк
if($result && mysqli_num_rows($result)>0)
{
$row = mysqli_fetch_row($result); // получаемпервуюстроку
$name = $row[1];
$company = $row[2];
echo "<h2>Изменитьмодель</h2>
<form method='POST'>
<input type='hidden' name='id' value='$id' />
<p>Введитемодель:<br>
<input type='text' name='name' value='$name' /></p>
<p>Производитель: <br>
<input type='text' name='company' value='$company' /></p>
<input type='submit' value='Сохранить'>
</form>";
mysqli_free_result($result);
}
}
// закрываем подключение
mysqli_close($link);
58
59
60
?>
</body>
</html>
Структурно весь код делится на две части: обработку запроса POST и обработку запроса
GET. Обработка POST-запроса подобна добавлению данных, только в данном случае
используется выражение UPDATE: "UPDATE tovars SET name='$name',
company='$company' WHERE id='$id'"
При обработке запроса GET получаем id записи и по ней получаем всю запись с помощью
выражения "SELECT * FROM tovars WHERE id = '$id'". Если получена более нуля строк,
то выводим содержимое строки в форму для редактирования.
Теперь, чтобы отредактировать первую запись, нам надо обратиться в браузере к скрипту
по адресу http://localhost:8080/edit.php?id=1.
Получив id из запроса PHP пропустит ту часть, которая относится к обработке POSTзапроса, и перейдет к извлечению по id записи из бд и созданию формы. Затем в форму
мы можем ввести некоторые значения и отправить на сервер. Теперь уже будет
задействована та часть, скрипта, которая обрабатывает POST-запрос:
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 28
«Работа с cookiesиз PHP»
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
1. Цель работы
Научиться работать с cookiesиз PHP.
2. Теоритические сведения
Сессии являются простым способом хранения информации для отдельных пользователей
с уникальным идентификатором сессии. Это может использоваться для сохранения
состояния между запросами страниц. Идентификаторы сессий обычно отправляются
браузеру через сессионный cookie и используются для получения имеющихся данных
сессии. Отсутствие идентификатора сессии или сессионного cookie сообщает PHP о том,
что необходимо создать новую сессию и сгенерировать новый идентификатор сессии.
Сессии используют простую технологию. Когда сессия создана, PHP будет либо получать
существующую сессию, используя переданный идентификатор (обычно из сессионного
cookie) или, если ничего не передавалось, будет создана новая сессия. PHP заполнит
суперглобальную переменную $_SESSION сессионной информацией после того, как
будет запущена сессия. Когда PHP завершает работу, он автоматически сериализует
содержимое суперглобальной переменной $_SESSION и отправит для сохранения,
используя сессионный обработчик для записи сессии.
По умолчанию PHP использует внутренний обработчик files для сохранения сессий,
который установлен в INI-переменной session.save_handler. Этот обработчик сохраняет
данные на сервере в директории, указанной в конфигурационной директиве
session.save_path.
Сессии могут запускаться вручную с помощью функции session_start(). Если директива
session.auto_start установлена в 1, сессия автоматически запустится, в начале запроса.
Сессия обычно завершает свою работу, когда PHP заканчивает исполнять скрипт, но
может быть завершена и вручную с помощью функции session_write_close().
3. Пример
Регистрацияпеременнойспомощью $_SESSION
=============================
<?php
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
?>
Отменаобъявленияпеременнойспомощью $_SESSION
=============================
<?php
session_start();
unset($_SESSION['count']);
?>
3. Задание
•
•
•
•
Для каждой страницы из СР №2сделать счетчик просмотров. Хранить значение
счетчиков в сессии.
Вывести значение каждого счетчика на соответствующей странице.
Сделать кнопку для сброса счетчика на соответствующей странице.
Оформить отчет. В отчете должны быть скриншоты всех страниц, кода и массива
$_COOKIE.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №29
«Работа с сессиями из PHP»
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
1. Цель работы
Научиться работать с сессиями из PHP.
2. Теоритические сведения
Сессии являются простым способом хранения информации для отдельных пользователей
с уникальным идентификатором сессии. Это может использоваться для сохранения
состояния между запросами страниц. Идентификаторы сессий обычно отправляются
браузеру через сессионный cookie и используются для получения имеющихся данных
сессии. Отсутствие идентификатора сессии или сессионного cookie сообщает PHP о том,
что необходимо создать новую сессию и сгенерировать новый идентификатор сессии.
Сессии используют простую технологию. Когда сессия создана, PHP будет либо получать
существующую сессию, используя переданный идентификатор (обычно из сессионного
cookie) или, если ничего не передавалось, будет создана новая сессия. PHP заполнит
суперглобальную переменную $_SESSION сессионной информацией после того, как
будет запущена сессия. Когда PHP завершает работу, он автоматически сериализует
содержимое суперглобальной переменной $_SESSION и отправит для сохранения,
используя сессионный обработчик для записи сессии.
По умолчанию PHP использует внутренний обработчик files для сохранения сессий,
который установлен в INI-переменной session.save_handler. Этот обработчик сохраняет
данные на сервере в директории, указанной в конфигурационной директиве
session.save_path.
Сессии могут запускаться вручную с помощью функции session_start(). Если директива
session.auto_start установлена в 1, сессия автоматически запустится, в начале запроса.
Сессия обычно завершает свою работу, когда PHP заканчивает исполнять скрипт, но
может быть завершена и вручную с помощью функции session_write_close().
3. Пример
Регистрацияпеременнойспомощью $_SESSION
=============================
<?php
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
?>
Отменаобъявленияпеременнойспомощью $_SESSION
=============================
<?php
session_start();
unset($_SESSION['count']);
?>
3. Задание
•
•
•
•
Для каждой страницы из СР №2сделать счетчик просмотров. Хранить значение
счетчиков в сессии.
Вывести значение каждого счетчика на соответствующей странице.
На каждой странице сделать кнопку для сброса счетчика.
Оформить отчет. В отчете должны быть скриншоты всех страниц, кода и массива
$_SESSION.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №30
«Создание механизма аутентификации на PHP»
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
1. Цель работы
Научиться реализовывать базовый механизм аутентификации средствами PHP.
2. Теоритические сведения
Идентификация (от латинского identifico — отождествлять): присвоение субъектам и
объектам идентификатора и / или сравнение идентификатора с перечнем присвоенных
идентификаторов. Например, представление человека по имени отчеству - это
идентификация.
Аутентификация (от греческого: αυθεντικός ; реальный или подлинный): подтверждение
подлинности чего-либо или кого либо. Например, предъявление паспорта - это
подтверждение подлинности заявленного имени отчества.
Авторизация является функцией определения прав доступа к ресурсам и управления
этим доступом. Авторизация — это не то же самое что идентификация и аутентификация:
идентификация — это называние лицом себя системе; аутентификация — это
установление соответствия лица названному им идентификатору; а авторизация —
предоставление этому лицу возможностей в соответствие с положенными ему правами
или проверка наличия прав при попытке выполнить какое-либо действие. Например,
авторизацией являются лицензии на осуществление определённой деятельности.
Хэширование или хеширование (англ. hashing) — преобразование массива входных
данных произвольной длины в (выходную) битовую строку фиксированной длины,
выполняемое определённым алгоритмом. Функция, реализующая алгоритм и
выполняющая преобразование, называется «хеш-функцией» или «функцией свёртки».
Исходные данные называются входным массивом, «ключом» или «сообщением».
Результат преобразования (выходные данные) называется «хешем», «хеш-кодом», «хешсуммой», «сводкой сообщения».
В данной лабораторной работе необходимо реализовать механизм аутентификации
пользователя, основанный на сессиях PHP.
3. Пример
Проверка совпадения имени пользователя и хеша пароля
=============================
<?php
if ($username == $_POST['username'] && $password ==
password_hash($_POST['password'], PASSWORD_DEFAULT)) {
// Пользовательаутентифицирован
$_SESSION['user'] = $user_id;
} else {
// Ошибкааутентификации
}
?>
4. Задание
•
•
•
•
•
Создать таблицу users, хранящую логин пользователя и хеш его пароля;
Создать страницу аутентификации. На странице должна быть форма для ввода
логина и пароля и кнопка входа;
Скрипт на странице аутентификации должен проводить проверку существования
пары логин-хеш пароля. Если пара существует – записать idпользователя в сессию,
если нет – перенаправить клиента на страницу входа с сообщением об ошибочном
вводе логина и пароля;
На каждой странице сделать проверку аутентификации пользователя. Если клиент
не аутентифицирован – перенаправить его на страницу входа;
Оформить отчет. В отчете должны быть скриншоты всех страниц и исходного
кода.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 31
«Создание формы редактирования списка объектов»
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
Форма добавления/изменения элементов информационных блоков является одной из
самых часто используемых, а в интернет-магазинах или информационных изданиях эта
форма однозначно является самой популярной в административном разделе. И несмотря
на то, что внешний вид и поля формы изменяются в зависимости от настроек
информационного блока, а также можно настроить вид формы редактирования
элементов стандартными средствами системы, для специфических задач, иногда этого
недостаточно.
В этом случае в /bitrix/php_interface/include/ следует создать один или два (в
зависимости от задачи) дополнительных файла:
• с формой
редактирования элемента;
• отвечающий за обработку полей элемента перед его сохранением.
Затем в настройках инфоблока задать пути к этим файлам:
Файл с формой редактирования элемента
Создадим в папке /bitrix/php_interface/include/, например,
файл iblock_element_edit_my.php, затем скопируем в него код из
файла /bitrix/modules/iblock/admin/iblock_element_edit.php от строки:
<?
//////////////////////////
//START of the custom form
//////////////////////////
достроки:
//////////////////////////
//END of the custom form
//////////////////////////
Теперь можно приступать к редактированию файла, т.е. к изменению внешнего вида
формы редактирования элемента инфоблока под собственные нужды. (Перед процедурой
необходимо отменить настройки формы, если таковые ранее были сделаны.)
• Вы
можете удалить ненужные вам поля инфоблока. Для отображения полей формы
используются конструкции следующего вида:
•
<?
•
$tabControl->BeginCustomField("ACTIVE_TO",
•
GetMessage("IBLOCK_FIELD_ACTIVE_PERIOD_TO"),
•
$arIBlock["FIELDS"]["ACTIVE_TO"]["IS_REQUIRED"] === "Y");
•
?>
•
<trid="tr_ACTIVE_TO">
•
<td><?echo $tabControl->GetCustomLabelHTML()?>:</td>
•
<td><?echo CAdminCalendar::CalendarDate("ACTIVE_TO", $str_ACTIVE_TO, 19,
true)?></td>
•
</tr>
•
<?
•
$tabControl->EndCustomField("ACTIVE_TO", '<input type="hidden"
id="ACTIVE_TO" name="ACTIVE_TO" value="'.$str_ACTIVE_TO.'">');
•
?>
• Для
отображения в форме свойств элементов инфоблока используется
функция _ShowPropertyField():
•
<?
•
$prop_code = "20"; //идентификатор свойства
•
$prop_fields = $PROP[$prop_code];
•
$prop_values = $prop_fields["VALUE"];
•
•
$tabControl->BeginCustomField("PROPERTY_".$prop_fields["ID"],
•
$prop_fields["NAME"],
•
$prop_fields["IS_REQUIRED"]==="Y");
•
?>
•
•
<trid="tr_PROPERTY_<?echo $prop_fields["ID"];?>">
•
<tdclass="adm-detail-valign-top"width="40%"><?if($prop_fields["HINT"]!=""):
•
?><spanid="hint_<?echo $prop_fields["ID"];?>"></span>
•
<script>BX.hint_replace(BX('hint_<?echo $prop_fields["ID"];?>'), '<?echo
CUtil::JSEscape($prop_fields["HINT"])?>');</script>
•
<?endif;?><?echo $tabControl->GetCustomLabelHTML();?>:</td>
•
<tdwidth="60%"><?_ShowPropertyField('PROP['.$prop_fields["ID"].']',
•
$prop_fields,
•
$prop_fields["VALUE"],
•
(($historyId <= 0) &&(!$bVarsFromForm) && ($ID<=0)),
•
$bVarsFromForm, 50000,
•
$tabControl->GetFormName(),
•
$bCopy);?></td>
•
</tr>
•
•
<?
•
$tabControl->EndCustomField("PROPERTY_".$prop_fields["ID"], $hidden);
•
?>
При использовании собственной формы на странице редактирования элемента пропадает
кнопка Настроить, позволяющая отсортировать и настроить отображение полей формы
элемента.
Чтобы не добавлять механизм сортировки полей в iblock_element_edit_my.php и не
отказываться от стандартной функции, необходимо добавить следующий код в файл:
<?
// Кнопка "Настроить"
$aMenu = array();
if (false == ((true == defined('BT_UT_AUTOCOMPLETE')) && (1 ==
BT_UT_AUTOCOMPLETE)))
{
$link = DeleteParam(array("mode"));
$link = $GLOBALS["APPLICATION"]->GetCurPage()."?mode=settings".($link<>""?
"&".$link:"");
$aMenu[] = array(
"TEXT"=>GetMessage("IBEL_E_SETTINGS"),
"TITLE"=>GetMessage("IBEL_E_SETTINGS_TITLE"),
"LINK"=>"javascript:".$tabControl->GetName().".ShowSettings('".urlencode($link)."')",
"ICON"=>"btn_settings",
);
$context = new CAdminContextMenu($aMenu);
$context->Show();
}
?>
Файл, отвечающий за обработку полей элемента перед его сохранением
Чтобы изменить сохраняемые поля, необходимо модифицировать одноименные поля в
массивах $_POST и $_FILES, значения всех свойств необходимо модифицировать в
массиве $PROP.
Создадимв /bitrix/php_interface/include/, например,
файл iblock_element_edit_before_save.php.
Для проверки, что детальный текст элемента введен, используем следующее условие:
if (strlen($_POST['DETAIL_TEXT'])<=0)
$error = new _CIBlockError(2, 'DESCRIPTION_REQUIRED', 'Введитетекстстатьи');
Конструктор объекта _CIBlockError принимает три параметра: степень серьезности
ошибки, произвольный идентификатор и текст ошибки. Если на странице редактирования
определить переменную $error со значением этого объекта, то сохранения внесённых
изменений не произойдет. Для того чтобы значения, пришедшие из формы, не потерялись,
после инициализации переменной $error также инициализируйте
переменную $bVarsFromForm=true. Переменная $bVarsFromForm как раз указывает,
что значения в полях необходимо показывать те, которые пришли из формы.
Для автоматического создания маленькой картинки на основе большой воспользуемся
функцией BXIBlockAfterSave. Если ее определить до сохранения элемента, то она
автоматически будет вызвана после успешного сохранения элемента.
Определимеевначалефайла /bitrix/php_interface/include/iblock_element_edit_before_save.
php:
<?
functionBXIBlockAfterSave($arFields)
{
$dbr = CIBlockElement::GetByID($arFields['ID']);
if(($ar = $dbr->Fetch()) &&$ar['DETAIL_PICTURE']>0)
{
$img_path = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($ar['DETAIL_PICTURE']);
$width = 200;
$height = 200;
list($width_orig, $height_orig) = getimagesize($img_path);
if($width&& ($width_orig<$height_orig))
$width = ($height / $height_orig) * $width_orig;
else
$height = ($width / $width_orig) * $height_orig;
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($img_path);
imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
$new_img_path = tempnam("/tmp", "FOO").".jpg";
imagejpeg($image_p, $new_img_path);
$be = newCIBlockElement();
$be->Update($arFields['ID'], Array('PREVIEW_PICTURE' =>
CFile::MakeFileArray($new_img_path)), false);
@unlink($new_img_path);
}
}
?>
Приведемполныйкодстраницы /bitrix/php_interface/include/iblock_element_edit_before_s
ave.php:
<?
if($REQUEST_METHOD=="POST"&& strlen($Update)>0&&$view!="Y"&& (!$error)
&&empty($dontsave) && strlen($_POST['DETAIL_TEXT'])<=0)
$error = new _CIBlockError(2, "DESCRIPTION_REQUIRED", "Введитетекстстатьи");
functionBXIBlockAfterSave($arFields)
{
$dbr = CIBlockElement::GetByID($arFields['ID']);
if(($ar = $dbr->Fetch()) &&$ar['DETAIL_PICTURE']>0)
{
$img_path = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($ar['DETAIL_PICTURE']);
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА № 32
«Создание класса в PHP»
ПМ.02 «Организация сетевого администрирования»
МДК.02.04«Сетевые языки»
Составители(авторы) Вилков А.Н.. преподаватель ФГБОУ ВО "РЭУ им. Г.В.Плеханова"
1. Цель работы
Научиться создавать и использовать классы в PHP.
2. Теоритические сведения
Класс - это базовое понятие в объектно-ориентированном программировании (ООП).
Классы образуют синтаксическую базу ООП. Их можно рассматривать как своего рода
"контейнеры" для логически связанных данных и функций (обычно называемых методами
— см. ниже). Если сказать проще, то класс - это своеобразный тип данных.
Экземпляр класса - это объект. Объект - это совокупность данных (свойств) и функций
(методов) для их обработки. Свойства и методы называются членами класса. Вообще,
объектом является все то, что поддерживает инкапсуляцию.
Если класс можно рассматривать как тип данных, то объект — как переменную (по
аналогии). Скрипт может одновременно работать с несколькими объектами одного класса,
как с несколькими переменными.
Внутри объекта данные и код (члены класса) могут быть либо открыты, либо нет.
Открытые данные и члены класса являются доступными для других частей программы,
которые не являются частью объекта. А вот закрытые данные и члены класса доступны
только внутри этого объекта.
3. Пример
class Users {
/*
* Класс для работы с таблицей users
* Обспечивает подключение к БД
* Содержит метод select для просмотра всех строк таблицы
*/
protected $name; // Имя таблицы. protected - возможно изменение при наследовании
private $db; // Объект соеденения с БД. private - избежать прямого доступа к объекту
PDO
public function __construct() { // Метод-конструктор объекта
$host = 'localhost'; // Адрес подключения
$db = 'db'; // База данных
$user = 'root'; // Логин пользователя БД
$pass = 'root'; // Пароль пользователя БД
$charset = 'utf8'; // Кодировка
$dsn = "mysql:host=$host;dbname=$db;charset=$charset"; // Строка для подключения
PDO
$this->db = new PDO($dsn, $user, $pass); // Создание и сохранение подключения к БД в
поле $db
$this->name = "users"; // Сохранение в поле $name имени таблицы, с которой будет
работать объект
}
public function select() { // Метод объекта для получения всех строк таблицы
$stmt = $this->db->query('SELECT * FROM `'.$this->name.'`'); // Запрос к БД
$rows = []; // Массив для хранения строк ответа
while (true) {
$row = $stmt->fetch(); // Получение очередной строки
if(!$row) break; // Если вернулось false - строки закончились, выход из цикла
$rows[] = $row; // Добавление в массив очередной строки
}
return $rows; // Возвращение результирующего массива со строками из БД
}
}
$users = new Users(); // Создание объекта класса Users
$rows = $users->select(); // Получение строк из таблицы в массив $rows
foreach($rows as $row) { // Цикл по массиву $rows
echo $row['id'] . " ".$row['name']."<br>"; // Вывод очередной строки
}
3. Задание
•
•
Для любой таблицы сделать класс вывода данных из БД на страницу.
Оформить отчет. В отчете должны быть скриншоты всех страниц, кода и
публичные поля и методы класса.
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №33
«Создание производного класса в PHP»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Наследование классов в PHP
Наследование - это не просто создание точной копии класса, а расширение уже
существующего класса, чтобы потомок мог выполнять какие-нибудь новые, характерные
только ему функции.
Итак, пусть у нас есть некоторый класс A с определенными свойствами и методами. Но
то, что этот класс делает, нас не совсем устраивает — например, пусть он выполняет
большинство функций, по сути нам необходимых, но не реализует некоторых других.
Зададимся целью создать новый класс B, как бы "расширяющий" возможности класса A,
добавляющий ему несколько новых свойств и методов. Сделать это можно двумя
принципиально различными способами. Первый выглядит примерно так:
<?php
class A {
function TestA() { ... }
function Test() { ... }
}
class B {
var $a; // объект класса A
function B(параметры_для_A, другие_параметры){
$a = new A(параметры_для_A);
// инициализируем другие поля B
}
function TestB() { ... }
function Test() { ... }
}
?>
Поясним: в этой реализации объект класса B содержит в своем составе подобъект
класса A в качестве свойства. Это свойство — лишь "частичка" объекта класса B, не более
того. Подобъект не "знает", что он в действительности не самостоятелен, а содержится в
классе B, поэтому не может предпринимать никаких действий, специфичных для этого
класса.
Мы хотели получить расширение возможностей класса A, а не нечто, содержащее
объекты A. Что означает "расширение"? Лишь одно: мы бы хотели, чтобы везде, где
допустима работа с объектами класса A, была допустима и работа с объектами класса B.
Но в приведенном примере это совсем не так.
Итак, мы имеем некоторые проблемы:
1. Мы не видим явно, что класс B лишь расширяет возможности A, а не является
отдельной сущностью;
2. Мы должны обращаться к "части A" класса B через $obj->a->TestA(), а к членам самого
класса B как $obj->TestB(). Последнее может быть довольно утомительным, если, как это
часто бывает, в B будет использоваться очень много методов из A и гораздо меньше —
из B. Кроме того, это заставляет нас постоянно помнить о внутреннем устройстве
класса B.
Теперь на практике рассмотрим, что же представляет собой наследование (или
расширение возможностей) классов:
<?php
class B extends A {
function B(параметры_для_A, другие_параметры) {
$this->A(параметры_для_A);
// инициализируем другие поля B
}
function TestB() { ... }
function Test() { ... }
}
?>
Ключевое слово extends говорит о том, что создаваемый класс является лишь
"расширением" класса A, и не более того. То есть B содержит те же самые свойства и
методы, что и A, но, помимо них и еще некоторые дополнительные, "свои".
Теперь "часть A" находится прямо внутри класса B и может быть легко доступна, наравне
с методами и свойствами самого класса B. Например, для
объекта $obj класса B допустимы выражения $obj->TestA() и $obj->TestB().
Итак, мы видим, что, действительно, класс B является воплощением идеи "расширение
функциональности
класса A". Обратите также внимание: мы можем теперь забыть, что B унаследовал
от A некоторые свойства или методы — снаружи все выглядит так, будто
класс B реализует их самостоятельно.
Немного о терминологии: родительский класс A принято называть базовым классом, а
класс дочерний класс B — производным от A. Иногда базовый класс также
называют суперклассом, а производный — подкласcом.
Рассмотрим еще один пример на PHP:
<?php
class Parent {
function parent_funct() { echo "<h1>Это родительская функция</h1>"; }
function test () { echo "<h1>Это родительский класс</h1>"; }
}
class Child extends Parent {
function child_funct() { echo "<h2>Это дочерняя функция</h2>"; }
function test () { echo "<h2>Это дочерний класс</h2>"; }
}
$object = new Parent;
$object = new Child;
$object->parent_funct(); // Выводит 'Это родительская функция'
$object->child_funct(); // Выводит 'Это дочерняя функция'
$object->test(); // Выводит 'Это дочерний класс'
?>
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №34
«Создание базового класса формы»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Создание форм
Создание форм в MV имеет схожие принципы с созданием моделей. Необходимо задать
список полей, после чего вызвать методы для отображения и проверки данных формы.
При создании формы есть 2 подхода: вывести форму из готовой модели и создать новую
форму отдельно.
Форма из модели
Предположим имеется модель "Вопросы и ответы", на сайте необходимо организовать
возможность для посетителей оставлять вопросы, которые затем будут модерироваться в
административной части.
Пример
1
<?
2
class Faq extends Model
3
{
4
protected $name = "Вопросыиответы";
5
6
protected $model_elements = array(
7
array("Активация", "bool", "active"),
8
array("Имя", "char", "name", array("required" => true)),
9
array("Дата", "date_time", "date"),
10
array("Текствопроса", "text", "question",
11
array("required" => true)),
12
array("Текстответа", "text", "answer")
13
);
14
15
public function display()
16
{
17
... //Отображение списка вопросов и ответов на сайте
18
}
19 }
20 ?>
Таким образом имеется готовая модель, часть полей которой нужно отобразить на сайте в
виде формы. Необходимые нам поля: "Имя" и "Текст вопроса". Предположим наша форма
отображается в шаблоне "view-help.php".
1
2
3
4
5
6
7
8
9
10
11
12
<?
$content = $mv -> pages ->findContent(array("url" => "help",
"active" => 1));
$mv -> display404($content); //Определение страницы в меню
$form = new Form("Faq"); //Создание формы из модели
?>
...
<form action="?ask" method="post">
<h3>Задать вопрос</h3>
13
<table>
14
<? echo $form ->display(array("name", "question"));
15
//Выводим только 2 поля в нужной последовательности ?>
16
</table>
17
<div class="form-submit">
18
<input type="submit" value="Отправить" />
19
</div>
20 </form>
Проверка корректности заполнения полей формы и вывод списка ошибок
1
<?
2
$form = new Form("Faq");
3
4
if(!empty($_POST))
5
{
6
$form ->getDataFromPost() -> validate(array("name", "question"));
7
...
8
}
9
?>
10
11 ...
12
13 <form class="regular simple" action="?ask" method="post">
14
<h3>Задатьвопрос</h3>
15
<? echo $form ->displayErrors(); ?>
16
...
17 </form>
После проверки корректности заполнения полей нам необходимо занести новый вопрос в
базу данных и перезагрузить страницу для сброса POST данных.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
$form = new Form("Faq");
if(!empty($_POST))
{
$form ->getDataFromPost() -> validate(array("name", "question"));
if(!$form -> hasErrors())
{
$mv -> faq ->getDataFromArray($form -> getAllValues());
$mv -> faq ->setValue("date", I18n :: getCurrentDateTime("with-seconds"));
$mv -> faq ->create();
$mv -> redirect("help/?send");
}
}
?>
...
if($form -> hasErrors())
echo $form ->displayErrors();
else if(isset($_GET['send']))
{
24
echo "<p>Ваш вопрос был успешно отправлен.<br />";
25
echo "В скором времени ответ будет опубликован в данном разделе.</p>";
26 }
27
28 if(empty($_GET))
29
echo $mv -> faq ->display();
Форма также может строиться на основе конкретной записи из модели. Такая потребность
возникает например для редактирования записи на frontend части сайта. При этом вторым
параметром при создании формы должен выступать id нужной записи из модели, и тогда в
полях формы будут выведены значения данной записи.
1 $form = new Form("Clients", 52);
2 $form ->loadRecord();
3
4 //Можно передать массив полей которые необходимо заполнить из данных записи
5 $form ->loadRecord(array("first_name", "last_name", "phone", "email"));
Форма без привязки к модели
Для создания отдельной от модели формы необходимо задать список полей. Методы
работы с такой формой аналогичны предыдущему примеру.
1 <?
2 $fields = array(array("Имя", "char", "name", array("required" => true)),
3
array("Email", "email", "email"),
4
array("Файл", "file", "file", array("files_folder" => "form_files")),
5
array("Сообщение", "text", "message", array("required" => true))
6 );
7
8 $form = new Form($fields);
9 ?>
Внимание! Если форма содержит поля типа file или image, то на страницу необходимо
добавить следующий Java Script код (предполагается наличие подключенной библиотеки
JQuery). Данный скрипт позволяет удалить выбранный файл и вернуть поле для загрузки
нового файла. Также, если форма построена не из модели, то должен быть параметр с
названием папки для сохранения файлов, как в примере выше.
1 $(document).ready(function()
2 {
3
$("form .field-input span.delete").click(function()
4
{
5
$(this).parents("div.file-params").empty().next().show();
6
});
7 });
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №35
«Создание класса формы добавления данных»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Создание форм
Создание форм в MV имеет схожие принципы с созданием моделей. Необходимо задать
список полей, после чего вызвать методы для отображения и проверки данных формы.
При создании формы есть 2 подхода: вывести форму из готовой модели и создать новую
форму отдельно.
Форма из модели
Предположим имеется модель "Вопросы и ответы", на сайте необходимо организовать
возможность для посетителей оставлять вопросы, которые затем будут модерироваться в
административной части.
Пример
1
<?
2
class Faq extends Model
3
{
4
protected $name = "Вопросыиответы";
5
6
protected $model_elements = array(
7
array("Активация", "bool", "active"),
8
array("Имя", "char", "name", array("required" => true)),
9
array("Дата", "date_time", "date"),
10
array("Текствопроса", "text", "question",
11
array("required" => true)),
12
array("Текстответа", "text", "answer")
13
);
14
15
public function display()
16
{
17
... //Отображение списка вопросов и ответов на сайте
18
}
19 }
20 ?>
Таким образом имеется готовая модель, часть полей которой нужно отобразить на сайте в
виде формы. Необходимые нам поля: "Имя" и "Текст вопроса". Предположим наша форма
отображается в шаблоне "view-help.php".
1
2
3
4
5
6
7
<?
$content = $mv -> pages ->findContent(array("url" => "help",
"active" => 1));
$mv -> display404($content); //Определение страницы в меню
$form = new Form("Faq"); //Создание формы из модели
?>
8
9
...
10
11 <form action="?ask" method="post">
12
<h3>Задать вопрос</h3>
13
<table>
14
<? echo $form ->display(array("name", "question"));
15
//Выводим только 2 поля в нужной последовательности ?>
16
</table>
17
<div class="form-submit">
18
<input type="submit" value="Отправить" />
19
</div>
20 </form>
Проверка корректности заполнения полей формы и вывод списка ошибок
1
<?
2
$form = new Form("Faq");
3
4
if(!empty($_POST))
5
{
6
$form ->getDataFromPost() -> validate(array("name", "question"));
7
...
8
}
9
?>
10
11 ...
12
13 <form class="regular simple" action="?ask" method="post">
14
<h3>Задатьвопрос</h3>
15
<? echo $form ->displayErrors(); ?>
16
...
17 </form>
После проверки корректности заполнения полей нам необходимо занести новый вопрос в
базу данных и перезагрузить страницу для сброса POST данных.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
$form = new Form("Faq");
if(!empty($_POST))
{
$form ->getDataFromPost() -> validate(array("name", "question"));
if(!$form -> hasErrors())
{
$mv -> faq ->getDataFromArray($form -> getAllValues());
$mv -> faq ->setValue("date", I18n :: getCurrentDateTime("with-seconds"));
$mv -> faq ->create();
$mv -> redirect("help/?send");
}
}
?>
...
19
20 if($form -> hasErrors())
21
echo $form ->displayErrors();
22 else if(isset($_GET['send']))
23 {
24
echo "<p>Ваш вопрос был успешно отправлен.<br />";
25
echo "В скором времени ответ будет опубликован в данном разделе.</p>";
26 }
27
28 if(empty($_GET))
29
echo $mv -> faq ->display();
Форма также может строиться на основе конкретной записи из модели. Такая потребность
возникает например для редактирования записи на frontend части сайта. При этом вторым
параметром при создании формы должен выступать id нужной записи из модели, и тогда в
полях формы будут выведены значения данной записи.
1 $form = new Form("Clients", 52);
2 $form ->loadRecord();
3
4 //Можно передать массив полей которые необходимо заполнить из данных записи
5 $form ->loadRecord(array("first_name", "last_name", "phone", "email"));
Форма без привязки к модели
Для создания отдельной от модели формы необходимо задать список полей. Методы
работы с такой формой аналогичны предыдущему примеру.
1 <?
2 $fields = array(array("Имя", "char", "name", array("required" => true)),
3
array("Email", "email", "email"),
4
array("Файл", "file", "file", array("files_folder" => "form_files")),
5
array("Сообщение", "text", "message", array("required" => true))
6 );
7
8 $form = new Form($fields);
9 ?>
Внимание! Если форма содержит поля типа file или image, то на страницу необходимо
добавить следующий Java Script код (предполагается наличие подключенной библиотеки
JQuery). Данный скрипт позволяет удалить выбранный файл и вернуть поле для загрузки
нового файла. Также, если форма построена не из модели, то должен быть параметр с
названием папки для сохранения файлов, как в примере выше.
1 $(document).ready(function()
2 {
3
$("form .field-input span.delete").click(function()
4
{
5
$(this).parents("div.file-params").empty().next().show();
6
});
7 });
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №36
«Создание класса формы обновления данных»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Создание форм
Создание форм в MV имеет схожие принципы с созданием моделей. Необходимо задать
список полей, после чего вызвать методы для отображения и проверки данных формы.
При создании формы есть 2 подхода: вывести форму из готовой модели и создать новую
форму отдельно.
Форма из модели
Предположим имеется модель "Вопросы и ответы", на сайте необходимо организовать
возможность для посетителей оставлять вопросы, которые затем будут модерироваться в
административной части.
Пример
1
<?
2
class Faq extends Model
3
{
4
protected $name = "Вопросыиответы";
5
6
protected $model_elements = array(
7
array("Активация", "bool", "active"),
8
array("Имя", "char", "name", array("required" => true)),
9
array("Дата", "date_time", "date"),
10
array("Текствопроса", "text", "question",
11
array("required" => true)),
12
array("Текстответа", "text", "answer")
13
);
14
15
public function display()
16
{
17
... //Отображение списка вопросов и ответов на сайте
18
}
19 }
20 ?>
Таким образом имеется готовая модель, часть полей которой нужно отобразить на сайте в
виде формы. Необходимые нам поля: "Имя" и "Текст вопроса". Предположим наша форма
отображается в шаблоне "view-help.php".
1
2
<?
$content = $mv -> pages ->findContent(array("url" => "help",
3
"active" => 1));
4
$mv -> display404($content); //Определение страницы в меню
5
6
$form = new Form("Faq"); //Создание формы из модели
7
?>
8
9
...
10
11 <form action="?ask" method="post">
12
<h3>Задать вопрос</h3>
13
<table>
14
<? echo $form ->display(array("name", "question"));
15
//Выводим только 2 поля в нужной последовательности ?>
16
</table>
17
<div class="form-submit">
18
<input type="submit" value="Отправить" />
19
</div>
20 </form>
Проверка корректности заполнения полей формы и вывод списка ошибок
1
<?
2
$form = new Form("Faq");
3
4
if(!empty($_POST))
5
{
6
$form ->getDataFromPost() -> validate(array("name", "question"));
7
...
8
}
9
?>
10
11 ...
12
13 <form class="regular simple" action="?ask" method="post">
14
<h3>Задатьвопрос</h3>
15
<? echo $form ->displayErrors(); ?>
16
...
17 </form>
После проверки корректности заполнения полей нам необходимо занести новый вопрос в
базу данных и перезагрузить страницу для сброса POST данных.
1
2
3
4
5
6
7
8
9
10
11
12
13
<?
$form = new Form("Faq");
if(!empty($_POST))
{
$form ->getDataFromPost() -> validate(array("name", "question"));
if(!$form -> hasErrors())
{
$mv -> faq ->getDataFromArray($form -> getAllValues());
$mv -> faq ->setValue("date", I18n :: getCurrentDateTime("with-seconds"));
$mv -> faq ->create();
$mv -> redirect("help/?send");
14
}
15 }
16 ?>
17
18 ...
19
20 if($form -> hasErrors())
21
echo $form ->displayErrors();
22 else if(isset($_GET['send']))
23 {
24
echo "<p>Ваш вопрос был успешно отправлен.<br />";
25
echo "В скором времени ответ будет опубликован в данном разделе.</p>";
26 }
27
28 if(empty($_GET))
29
echo $mv -> faq ->display();
Форма также может строиться на основе конкретной записи из модели. Такая потребность
возникает например для редактирования записи на frontend части сайта. При этом вторым
параметром при создании формы должен выступать id нужной записи из модели, и тогда в
полях формы будут выведены значения данной записи.
1 $form = new Form("Clients", 52);
2 $form ->loadRecord();
3
4 //Можно передать массив полей которые необходимо заполнить из данных записи
5 $form ->loadRecord(array("first_name", "last_name", "phone", "email"));
Форма без привязки к модели
Для создания отдельной от модели формы необходимо задать список полей. Методы
работы с такой формой аналогичны предыдущему примеру.
1 <?
2 $fields = array(array("Имя", "char", "name", array("required" => true)),
3
array("Email", "email", "email"),
4
array("Файл", "file", "file", array("files_folder" => "form_files")),
5
array("Сообщение", "text", "message", array("required" => true))
6 );
7
8 $form = new Form($fields);
9 ?>
Внимание! Если форма содержит поля типа file или image, то на страницу необходимо
добавить следующий Java Script код (предполагается наличие подключенной библиотеки
JQuery). Данный скрипт позволяет удалить выбранный файл и вернуть поле для загрузки
нового файла. Также, если форма построена не из модели, то должен быть параметр с
названием папки для сохранения файлов, как в примере выше.
1 $(document).ready(function()
2 {
3
$("form .field-input span.delete").click(function()
4
{
5
$(this).parents("div.file-params").empty().next().show();
6
});
7 });
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №37
«Создание интерфейса в PHP»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Интерфейс PHP
В PHP ООП интерфейс — это класс, в котором все методы являются абстрактными и
открытыми.
Быстро пробежимся по трем терминам, используемым в этом определении. Класс,
абстрактный и открытый. Класс представляет собой шаблон или образец объекта, он
является основой объектно-ориентированного программирования. Абстрактный — это
специальный метод, который объявляется, но не имеет тела, только пустые скобки.
Открытый — это модификатор доступа public, он связан с доступом к методам. Это
означает, что он доступен из любого места: из этого класса, вне его пределов и из любого
производного класса.
Интерфейс PHP представляет собой инструмент для создания надежного кода,
определяющего методы, которые должны быть реализованы с помощью класса без
определения обработки этих методов. Это мощная и простая концепция, используемая в
объектно-ориентированном PHP. Для его создания используется ключевое слово interface,
он определяется так же, как класс PHP. Методы, содержащиеся в нем, не имеют никакого
функционала, но интерфейс задает, какие методы необходимы для других классов. Любой
класс, наследующийся от интерфейса, должен содержать те же методы, которые
содержатся в интерфейсе, иначе выдается ошибка.
В интерфейсе ООП PHP мы задаем только имена методов и их параметры, а реализованы
они могут быть позже. Принято объявлять все методы интерфейса как public. Для
реализации интерфейса используется ключевое слово implements. При необходимости
класс может реализовать более одного интерфейса, между собой они разделяются запятой.
Как и класс, интерфейс может содержать константы. Единственное отличие заключается в
том, что они не могут быть переопределены в производном классе.
Определение и использование интерфейсов
Интерфейс определяется с помощью ключевого слова interface. Все методы в нем должны
быть открытыми и абстрактными:
interfaceanimal
{
}
Это пустой интерфейс. Мы добавим в него абстрактный метод motion. Таким образом, мы
создадим простой PHP 5 ООП интерфейс, который может быть реализован позже:
interfaceanimal
{
publicfunctionmotion(){}
}
Этот интерфейс может быть реализован любым классом animal, все классы animal будут
содержать метод motion. Давайте рассмотрим пример. Для реализации интерфейса мы
используем ключевое слово implements:
classLionimplementsanimal
{
publicfunctionmotion()
{ // Задайте здесь функционал этого метода для класса lion
}
}
classFishimplementsanimal
{
publicfunctionmotion()
{ // Задайте функционал этого метода для класса fish
}
}
PHP-интерфейс и абстрактные классы
Интерфейсы и абстрактные классы очень похожи по своей концепции. Они помогают в
создании шаблонов для классов, которые будут использоваться в приложении. Согласно
основам ООП PHP, они отличаются друг от друга следующим:
1. В интерфейсе все методы являются абстрактными (без реализации). В абстрактном
классе лишь некоторые методы являются абстрактными. Абстрактный класс
должен содержать, по крайней мере, один абстрактный метод. Иначе это будет
стандартный класс PHP;
2. В интерфейсе PHP все объявленные методы являются открытыми, а в абстрактном
классе методы могут быть открытыми, частными или защищенными.
Следовательно, для интерфейсов существует ограничение на использование
модификаторов доступа, а в абстрактном классе таких ограничений нет;
3. Класс может реализовать неограниченное количество интерфейсов. В то же время
класс PHP может породить только один абстрактный класс;
4. Вы должны переопределять все методы интерфейса, а в абстрактном классе у вас
есть выбор: переопределять методы или оставить их без изменений;
5. Интерфейсы имеют более строгие правила, чем абстрактные классы.
Интерфейс PHP призван обеспечить определенную логику, он выступает в качестве
пустой оболочки или шаблона для других классов.
Для чего используются интерфейсы PHP
Интерфейс помогает программисту мыслить в правильном направлении. С точки
зрения PHP ООП, класс представляет собой шаблон, а объект — это набор возможностей.
Мы в большей степени связаны с функционалом, что он делает, а не как он это делает.
Поэтому мы определяем основной интерфейс, который является общим, а затем он
реализуется, что помогает мыслить в правильном направлении.
Корректировка кода в будущем
Разработка на объектно-ориентированном PHP позволяет корректировать код в будущем,
не затрагивая при этом основной функционал. При написании кода в будущем эти
характеристики всегда будут учитываться, а затем включаться дополнительные функции,
но это не окажет никакого влияния на основные характеристики уже существующих
объектов.
Лучшая структура программы
Объектно-ориентированный PHP был реализован для улучшения структуры создаваемых
приложений. Добавление интерфейсов в PHP способствует тому, что кодирование
становится аккуратным и чистым. Интерфейсы препятствуют написанию кода, который
трудно поддерживать и изменять. С помощью интерфейсов мы можем легко
поддерживать и модифицировать код, что повышает эффективность работы
программистов.
Добавление всех важных функций
С помощью интерфейсов PHP мы можем создавать базовый функционал, который может
быть определен для различных объектов по-разному, а затем добавить другие функции,
если это потребуется.
Еще один в ООП PHP пример реализации интерфейса
Пример:
<?php
interfaceRecipe
{
publicfunctionmethodology();
}
?>
classCakeimplementsRecipe
{
publicfunctionmethodology()
{
}
}
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №38
«Получение данных из БД MongoDB»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Наиболее простой способом получения содержимого БД представляет использование
функции find. Действие этой функции во многом аналогично обычному запросу SELECT
* FROM Table, который извлекает все строки. Например, чтобы извлечь все документы из
коллекции users, созданной в прошлой теме, мы можем использовать
команду db.users.find().
Для вывода документов в более удобном наглядном представлении мы можем добавить
вызов метода pretty():
1
>db.users.find().pretty()
Однако что, если нам надо получить не все документы, а только те, которые
удовлетворяют определенному требованию. Например, мы ранее в базу добавили
следующие документы:
1
2
3
>db.users.insertOne({"name": "Tom", "age": 28, languages: ["english", "spanish"]})
>db.users.insertOne({"name": "Bill", "age": 32, languages: ["english", "french"]})
>db.users.insertOne({"name": "Tom", "age": 32, languages: ["english", "german"]})
Выведем все документы, в которых name=Tom:
1
>db.users.find({name: "Tom"})
Такой запрос выведет нам два документа, в которых name=Tom.
Теперь более сложный запрос: нам надо вывести те объекты, у которых name=Tom и
одновременно age=32. То есть на языке SQL это могло бы выглядеть так: SELECT *
FROM Table WHERE Name='Tom' AND Age=32. Данному критерию у нас соответствует
последний добавленный объект. Тогда мы можем написать следующий запрос:
1
>db.users.find({name: "Tom", age: 32})
Также несложно отыскать по элементу в массиве. Например, следующий запрос выводит
все документы, у которых в массиве languages есть english:
1
>db.users.find({languages: "english"})
Усложним запрос и получим те документы, у которых в массиве languages одновременно
два языка: "english" и "german":
1
>db.users.find({languages: ["english", "german"]})
Теперь выведем все документы, в которых "english" в массиве languages находится на
первом месте:
1
>db.users.find({"languages.0": "english"})
Соответственно если нам надо вывести документы, где english на втором месте
(например, ["german", "english"]), то вместо нуля ставим единицу: languages.1.
Проекция
Документ может иметь множество полей, но не все эти поля нам могут быть нужны и
важны при запросе. И в этом случае мы можем включить в выборку только нужные поля,
использовав проекцию. Например, выведем только порцию информации, например,
значения полей "age" у все документов, в которых name=Tom:
1
>db.users.find({name: "Tom"}, {age: 1})
Использование единицы в качестве параметра {age: 1} указывает, что запрос должен
вернуть только содержание свойства age.
И обратная ситуация: мы хотим найти все поля документа кроме свойства age. В этом
случае в качестве параметра указываем 0:
1
>db.persons.find({name: "Tom"}, {age: 0})
При этом надо учитывать, что даже если мы отметим, что мы хотим получить только поле
name, поле _id также будет включено в результирующую выборку. Поэтому, если мы не
хотим видеть данное поле в выборке, то надо явным образом указать: {"_id":0}
Альтернативно вместо 1 и 0 можно использовать true и false:
1
>db.users.find({name: "Tom"}, {age: true, _id: false})
Если мы не хотим при этом конкретизировать выборку, а хотим вывести все документы,
то можно оставить первые фигурные скобки пустыми:
1 >db.users.find({}, {age: 1, _id: 0})
Запрос к вложенным объектам
Предыдущие запросы применялись к простым объектам. Но документы могут быть очень
сложными по структуре. Например, добавим в коллекцию persons следующий документ:
1
>db.users.insert({"name": "Alex", "age": 28, company: {"name":"microsoft", "country":"USA"}})
Здесь определяется вложенный объект с ключом company. И чтобы найти все документы,
у которых в ключе company вложенное свойство name=microsoft, нам надо использовать
оператор точку:
1 >db.users.find({"company.name": "microsoft"})
Использование JavaScript
MongoDB предоставляет замечательную возможность, создавать запросы, используя язык
JavaScript. Например, создадим запрос, возвращающий те документы, в которых
name=Tom. Для этого сначала объявляется функция:
1
2
> fn = function() { returnthis.name=="Tom"; }
>db.users.find(fn)
Этот запрос эквивалентен следующему:
1
>db.users.find("this.name=='Tom'")
Собственно только запросами область применения JavaScript в консоли mongo не
ограничена. Например, мы можем создать какую-нибудь функцию и применять ее:
1 > functionsqrt(n) { returnn*n; }
2 >sqrt(5)
3 25
Использование регулярных выражений
Еще одной замечательной возможностью при построении запросов является
использование регулярных выражений. Например, найдем все документы, в которых
значение ключа name начинается с буквы T:
>db.users.find({name:/T\w+/i})
Настройка запросов и сортировка
MongoDB представляет ряд функций, которые помогают управлять выборкой из бд. Одна
из них - функция limit. Она задает максимально допустимое количество получаемых
документов. Количество передается в виде числового параметра. Например, ограничим
выборку тремя документами:
1
>db.users.find().limit(3)
В данном случае мы получим первые три документа (если в коллекции 3 и больше
документов). Но что, если мы хотим произвести выборку не сначала, а пропустив какое-то
количество документов? В этом нам поможет функция skip. Например, пропустим первые
три записи:
1
>db.users.find().skip(3)
MongoDB предоствляет возможности отсортировать полученный из бд набор данных с
помощью функции sort. Передавая в эту функцию значения 1 или -1, мы можем указать в
каком порядке сортировать: по возрастанию (1) или по убыванию (-1). Во многом эта
функция по действию аналогична выражению ORDER BY в SQL. Например, сортировка
по возрастанию по полю name:
1
>db.users.find().sort({name: 1})
Ну и в конце надо отметить, что мы можем совмещать все эти функции в одной цепочке:
1 >db.users.find().sort({name: 1}).skip(3).limit(3)
Поиск одиночного документа
Если все документы извлекаются функцией find, то одиночный документ извлекается
функцией findOne. Ее действие аналогично тому, как если бы мы использовали
функцию limit(1), которая также извлекает первый документ коллекции. А комбинация
функций skip и limit извлечет документ по нужному местоположению.
Параметр $natural
Если вдруг нам надо отсортировать ограниченную коллекцию, то мы можем
воспользоваться параметром $natural. Этот параметр позволяет задать сортировку:
документы передаются в том порядке, в каком они были добавлены в коллекцию, либо в
обратном порядке.
Например, отберем последние пять документов:
1 >db.users.find().sort({ $natural: -1 }).limit(5)
Оператор $slice
$slice является в некотором роде комбинацией функций limit и skip. Но в отличие от них
$slice может работать с массивами.
Оператор $slice принимает два параметра. Первый параметр указывает на общее
количество возвращаемых документов. Второй параметр необязательный, но если он
используется, тогда первый параметр указывает на смещение относительно начала (как
функция skip), а второй - на ограничение количества извлекаемых документов.
Например, в каждом документе определен массив languages для хранения языков, на
которых говорит человек. Их может быть и 1, и 2, и 3 и более. И допустим, ранее мы
добавили следующий объект:
1
>db.users.insert({"name": "Tom", "age": "32", languages: ["english", "german"]})
И мы хотим при выводе документов сделать так, чтобы в выборку попадал только один
язык из массива languages, а не весь массив:
1
>db.users.find ({name: "Tom"}, {languages: {$slice : 1}})
Данный запрос при извлечении документа оставит в результате только первый язык из
массива languages, то есть в данном случае english.
Обратная ситуация: нам надо оставить в массиве также один элемент, но не с начала, а с
конца. В этом случае необходимо передать в параметр отрицательное значение:
1
>db.users.find ({name: "Tom"}, {languages: {$slice : -1}});
Теперь в массиве окажется german, так как он первый с конца в добавленном элементе.
Используем сразу два параметра:
1
>db.users.find ({name: "Tom"}, {languages: {$slice : [-1, 1]}});
Первый параметр говорит начать выборку элементов с конца (так как отрицательное
значение), а второй параметр указывает на количество возвращаемых элементов массива.
В итоге в массиве language окажется "german"
Курсоры
Результат выборки, получаемой с помощью функции find, называется курсором:
1
> varcursor = db.users.find(); null;
Чтобы получить курсор и сразу же не выводить все содержащиеся в нем данные, после
метода find() добавляет через точку с запятой выражение null;
Курсоры инкапсулируют в себе наборы получаемых из бд объектов. Используя синтаксис
языка javascript и методы курсоров, мы можем вывести полученные документы на экран и
как-то их обработать. Например:
1
2
3
4
5
> varcursor = db.users.find();null;
> while(cursor.hasNext()){
... obj = cursor.next();
... print(obj["name"]);
... }
Курсор обладает методом hasNext, который показывает при переборе, имеется ли еще в
наборе документ. А метод next извлекает текущий документ и перемещает курсор к
следующему документу в наборе. В итоге в переменной obj оказывается документ, к
полям которого мы можем получить доступ.
Также для перебора документов в курсоре в качестве альтернативы мы можем
использовать конструкцию итератора javascript - forEach:
1
2
3
4
> varcursor = db.users.find()
>cursor.forEach(function(obj){
... print(obj.name);
... })
Чтобы ограничить размер выборки, используется метод limit, принимающий количество
документов:
1
2
3
4
5
6
7
> varcursor = db.users.find();null;
null
>cursor.limit(5);null;
null
>cursor.forEach(function(obj){
... print(obj.name);
... })
Используя метод sort(), можно отсортировать документы в курсоре:
1
2
3
4
5
6
7
> varcursor = db.users.find();null;
null
>cursor.sort({name:1});null;
null
>cursor.forEach(function(obj){
... print(obj.name);
... })
Выражение cursor.sort({name:1}) сортирует документы в курсоре по полю name по
возрастанию. Если мы хотим отсортировать по убыванию, то вместо 1 используем 1: cursor.sort({name:-1})
И еще один метод skip() позволяет пропустить при выборке определенное количество
документов:
1
2
3
4
5
6
7
> varcursor = db.users.find();null;
null
>cursor.skip(2);null;
null
>cursor.forEach(function(obj){
... print(obj.name);
... })
В данном случае пропускаем два документа.
И кроме того, можно объединять все эти методы в цепочки:
1
> varcursor = db.users.find();null;
2
3
4
5
6
7
null
>cursor.sort({name:1}).limit(3).skip(2);null;
null
>cursor.forEach(function(obj){
... print(obj.name);
... })
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №39
«Добавление данных в БД MongoDB»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Добавление данных
Установив бд, теперь мы можем добавить в нее данные. Все данные хранятся в бд в
формате BSON, который близок к JSON, поэтому нам надо также вводить данные в этом
формате. И хотя у нас, возможно, на данный момент нет ни одной коллекции, но при
добавлении в нее данных она автоматически создается.
Как ранее говорилось, имя коллекции - произвольный идентификатор, состоящий из не
более чем 128 различных алфавитно-цифровых символов и знака подчеркивания. В то же
время имя коллекции не должно начинаться с префикса system., так как он зарезервирован
для внутренних коллекций (например, коллекция system.users содержит всех
пользователей базы данных). И также имя не должно содержать знака доллара - $.
Для добавления в коллекцию могут использоваться три ее метода:
•
•
•
insertOne(): добавляет один документ
insertMany(): добавляет несколько документов
insert(): может добавлять как один, так и несколько документов
Итак, добавим один документ:
1
>db.users.insertOne({"name": "Tom", "age": 28, languages: ["english", "spanish"]})
Документ представляет набор пар ключ-значение. В данном случае добавляемый
документ имеет три ключа: name, age, languages, и каждому из них сопоставляет
определенное значение. Например, ключу languages в качесте значения сопоставляется
массив.
Некоторые ограничения при использовании имен ключей:
•
•
Символ $ не может быть первым символом в имени ключа
Имя ключа не может содержать символ точки .
При добавлении данных, если мы явным образом не предоставили значение для поля "_id"
(то есть уникального идентификатора документа), то оно генерируется автоматически. Но
в принципе мы можем сами установить этот идентификатор при добавлении данных:
1
>db.users.insertOne({"_id": 123457, "name": "Tom", "age": 28, languages: ["english", "spanish"]})
Стоит отметить, что названия ключей могут использоваться в кавычках, а могут и без
кавычек.
В случае удачного добавления на консоль будет выведен идентификатор добавленного
документа.
И чтобы убедиться, что документ в бд, мы его выводим функцией find.
1
>db.users.find()
Чтобы вывести в более читабельном виде добавим метод pretty():
1
>db.users.find().pretty()
Если надо добавить ряд документов, то мы можем воспользоваться методом insertMany():
1
2
>db.users.insertMany([{"name": "Bob", "age": 26, languages: ["english", "frensh"]},
{"name": "Alice", "age": 31, languages:["german", "english"]}])
После добавления консоль выводит идентификаторы добавленных документов:
И третий метод - insert() демонстрирует более универсальный способ добавления
документов. При его вызове в него также передается добавляемый документ:
1
>db.users.insert({"name": "Tom", "age": 28, languages: ["english", "spanish"]})
После его вызова на консоль выводится количество добавленных записей:
1
WriteResult({ "nInserted": 1 })
Есть еще один способ добавления в бд документа, который включает два этапа:
определение документа (document = ( { ... } )) и собственно его добавление:
1
2
> document=({"name": "Bill", "age": 32, languages: ["english", "french"]})
>db.users.insert(document)
При желании опять же можно с помощью функции db.users.find() убедиться, что документ
попал в бд.
Возможно, не всем будет удобно вводить в одну строчку все пары ключей и свойств. Но
интеллектуальный интерпретатор MongoDB на основе javascript позволяет также вводить
и многострочные команды. Если выражение не закончено (с точки зрения языка
JavaScript), и вы нажимаете Enter, то ввод следующей части выражения автоматически
переносится на следующую строку:
Загрузка данных из файла
Данные для базы данных mongodb можно определять в обычном текстовом файле, что
довольно удобно, поскольку мы можем переносить или пересылать этот файл независимо
от базы данных mongodb. Например, определим где-нибудь на жестком диске
файл users.js со следующим содержимым:
1
2
3
4
5
db.users.insertMany([
{"name": "Alice", "age": 31, languages: ["english", "french"]},
{"name": "Lene", "age": 29, languages: ["english", "spanish"]},
{"name": "Kate", "age": 30, languages: ["german", "russian"]}
])
То есть здесь с помощью метода insertMany добавляются три документа в коллекцию
users.
Для загузки файла в текущую базу данных применяется функция load(), в которую в
качестве параметра передается путь к файлу:
1
> load("D:/users.js")
В данном случае предполагается, что файл располагается по пути "D:/users.js".
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Российский экономический университет им. Г.В. Плеханова»
Московский приборостроительный техникум
ЛАБОРАТОРНАЯ РАБОТА №40
«Изменение данных в БД MongoDB»
( время на выполнение – 2 часа )
ПМ.02 «Организация сетевого администрирования»
МДК.02.04 «Сетевые языки»
Составители(авторы) Вилков А.Н.преподаватель ФГБОУ ВО "РЭУ им. Г.В. Плеханова"
Для этих целей в MongoDB существуют методы update() и save(). Метод update() изменяет
значения уже существующего документа в то время, как метод save() перезаписывает
существующий документ.
Метод update()
Общий метод имеет следующий вид:
db.ИМЯ_КОЛЛЕКЦИИ.update(КРИТЕРИЙ_ВЫБОРА, ИЗМЕНЁННЫЕ_ДАННЫЕ)
Для понимания того, как это работает на практике, рассмотрим простой пример:
Предположим, что у нас есть коллекция developers, которая содержит следующие
документы:
>db.developers.find().pretty()
{
"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
"title" : "Eugene Suleimanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 2000
}
{
"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
"title" : "Ivan Ivanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3000
}
{
"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
"title" : "Nikolai Nikolaev",
"specialty" : "C++",
"skills" : [
"C++",
"STL",
"SQL"
],
"salary" : 2500
}
Допустим, что мы хотим изменить поле salary у разработчика с именем Eugene
Suleimanov. Для этого нам необходимо выполнить следующую команду:
>db.developers.update( {'title':'Eugene Suleimanov'}, {$set : { 'salary': 2500 }} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Проверим содержимое коллекции developers после выполнения предыдущей команды:
>db.developers.find().pretty()
{
"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
"title" : "Eugene Suleimanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 2500
}
{
"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
"title" : "Ivan Ivanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3000
}
{
"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
"title" : "Nikolai Nikolaev",
"specialty" : "C++",
"skills" : [
"C++",
"STL",
"SQL"
],
"salary" : 2500
}
Как мы видим, запись была изменена.
Для того, чтобы изменить несколько записей необходимо установить параметр multi в
значение true.
Изменим зарплату всем разработчикам, со специальностью Java:
>db.developers.update( {'specialty':'Java'}, {$set : { 'salary': 3500 }}, {multi: true} )
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Проверимнашуколлекцию developers ещёраз:
>db.developers.find().pretty()
{
"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
"title" : "Eugene Suleimanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3500
}
{
"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
"title" : "Ivan Ivanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3500
}
{
"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
"title" : "Nikolai Nikolaev",
"specialty" : "C++",
"skills" : [
"C++",
"STL",
"SQL"
],
"salary" : 2500
}
Как мы видим – все разработчики со специальностью Java имеют зарплату 3500.
Метод save()
Данный метод используется для перезаписи уже существующего документа новым.
Данный метод имеет следующий синтаксис:
db.ИМЯ_КОЛЛЕКЦИИ.save( {_id:ObjectId(), НОВЫЕ_ДАННЫЕ} )
Для понимания того, как это работает на практике рассмотрим простой пример:
Наша коллекция developers имеет следующий вид:
>db.developers.find().pretty()
{
"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
"title" : "Eugene Suleimanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3500
}
{
"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
"title" : "Ivan Ivanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3500
}
{
"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
"title" : "Nikolai Nikolaev",
"specialty" : "C++",
"skills" : [
"C++",
"STL",
"SQL"
],
"salary" : 2500
}
Перезапишем объект с ID:5815f4f535ee883c37ac8b4f.
Для этого нам необходимо использовать следующую команду:
>db.developers.save( { "_id": ObjectId("5815f4f535ee883c37ac8b4f"), "title" : "Nikolay
Nikolaev", "specialty": "C++", "skills": ["C++", "STL", "SQL"], "salary" : 3500 } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Проверимнашуколлекцию developers ещёраз:
>db.developers.find().pretty()
{
"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
"title" : "Eugene Suleimanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3500
}
{
"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
"title" : "Ivan Ivanov",
"specialty" : "Java",
"skills" : [
"Java",
"Hibernate",
"Spring"
],
"salary" : 3500
}
{
"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
"title" : "Nikolay Nikolaev",
"specialty" : "C++",
"skills" : [
"C++",
"STL",
"SQL"
],
"salary" : 3500
}
На этом мы заканчиваем изучение способов изменений документов в коллекциях.
В следующей статье мы рассмотрим, как удалять документы в MongoDB.
Download