Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Разработка WEB-ресурса по обмену книгами «BookTrade.org»

Содержание:

Введение

Цель данной работы – разработка веб-ресурса, направленного на реализацию обмена книг, BookTrade.org с возможностью последующей доработки и реализации как полноценного проекта для размещения в сети Интернет. Разрабатываемый ресурс направлен как на возможность обмена бумажными книгами между пользователями, так и на поиск нового литературного опыта. Таким образом, разделы сайта и их реализация должны отвечать обеим поставленным задачам в полной мере и предоставлять функционал для выполнения этих задач. Основными разделами ресурса выбраны “Home page” (домашняя страница), “What to read?” (что почитать), “Quotes” (цитаты), “Users’ reviews” (пользовательские рецензии), “Trade offers” (предложения обмена) и “Literature news” (новости литературы). Таким образом, все разделы сайта должны быть направлены на выполнение информационной, коммуникативной и развлекательной целей и имеют соответствующий функционал.

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

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

1. Техническое задание

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

В частности, основные разделы сайта имеют следующие функции:

  • Home page – знакомство новых пользователей с веб-ресурсом, а также с последними нововведениями на портале.
  • What to read? – раздел, предназначенный для того, чтобы пользователь мог получить случайную книгу из базы данных и, возможно, заинтересоваться как новым литературным опытом.
  • Quotes – раздел со случайной цитатой из базы данных, направленный на то, чтобы заинтересовать пользователя в, возможно, новом для него произведении.
  • Users’ reviews – обзоры пользователей на книги, где пользователь также может подобрать для себя нечто новое.
  • Trade offers – предложения пользователей об обмене с краткой информацией о предложении, а также возможностью сразу написать личное сообщение автору объявления.
  • Literature news – новости литературы, добавляемые администраторами и модераторами.

Активность, доступная пользователям зависит от того, к какой категории он относится и какие соответственно права имеет. Так пользователи делятся на четыре категории:

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

При регистрации пользователь в обязательном порядке указывает логин, электронную почту и пароль; данная информация заносится в таблицу users, используемую для аутентификации пользователя; при регистрации пользователь автоматически получает обычные права, что также заносится в эту таблицу. При желании также указывает такие данные как полное имя, возраст, место жительства и информацию о себе; данная информация хранится в другой таблице – user_info, и используется уже непосредственно при работе с сайтом. При аутентификации пользователя в сессию заносятся логин и права из таблицы users, а также обновляется дата и время последней аутентификации и ставится отметка об онлайне в таблице user_info. При выходе из портала (log out) также обновляется отметка о последней активности и ставится отметка о том, что пользователь оффлайн. Весь контент, добавляемый пользователями, хранится в базе данных на сервере, сортируемый по специфике по разным таблицам. Используемая для менеджмента базы данных СУБД – MySQL. Для реализации всей статичной части сайта используется связка HTML+CSS, для реализации серверной – PHP. Используемый серверный движок – Apache.

2. Описание модулей серверной части программы и их взаимодействие

Для разработки веб-ресурса была выбрана среда разработки MS Visual Code с установленными плагинами на подсветку синтаксиса для HTML, CSS и PHP. Также перед разработкой была разработана модель, отражающая логистику, функциональную связь модулей разрабатываемого веб-ресурса. Она продемонстрирована на рисунке 1. Подробное описание модулей, их основных компонентов, назначения и входных-выходных данных предоставлено в таблице 1. Описание вспомогательных компонентов предоставлено в таблице 2.

Рисунок 1

Таблица 1

Модуль

Компонент

Назначение компонента

Входные и выходные данные

Аутентификация

register.php

Добавление нового пользователя в систему

Входные данные:

Users (Username, Email, Password), user_info (Full name, Age, Location, User information).

Аутентификация, авторизация

login.php

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

Входные данные: users (Username, Password). Выходные данные: user_info (Rights, Active, Last online).

Общий модуль

index.php

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

Входные данные: данные сессии (Username, Rights). Выходные данные: модуль новостей портала site_news (title, text, date), для неавторизованных пользователей справка о портале.

Общий модуль

goread.php

Случайная книга

Выходные данные: случайная книга из библиотеки books (bookname, author, genre).

Общий модуль

quote.php

Случайная цитата

Выходные данные: случайная цитата из цитатника quotes (bookname, quote_text) и справка по книге из библиотеки books (author, genre).

Общий модуль

reviews.php

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

Входные данные: данные сессии (Username, Rights). Выходные данные: пользовательские обзоры reviews (bookname, author, username, review, rating).

Общий модуль, обзоры

addreview.php

Добавление обзора

Входные данные: данные сессии (username, rights), добавление обзора reviews (bookname, author, username, review, rating).

Общий модуль, обзоры

editreview.php

Редактирование обзора

Входные данные: данные сессии (username, rights), редактирование обзора reviews (bookname, author, username, review, rating). Выходные данные: информация о старом обзоре reviews (bookname, author, review, rating).

Продолжение таблицы 1

Общий модуль

news.php

Новости литературы

Входные данные: данные сессии user_info (Username, Rights). Выходные данные: новости lit_news (title, small_text, date).

Общий модуль, новости

litnews.php

Развернутая новость из раздела с новостями литературы

Входные данные:

Users (Username, Email, Password). Выходные данные: новость lit_news (title, text, date).

Общий модуль, новости

editnews.php

Редактирование новости

Входные данные: users (Username, Password), новый текст lit_news (title, small_text, text). Выходные данные: старый текст lit_news (title, small_text, text).

Модуль пользователя

user.php

Персональная страница пользователя

Входные данные: данные сессии (Username, Rights). Выходные данные:user_info (id, username, fullname, age, location, userinfo), w_trade (bookname, author, trade_info, date), w_read (bookname, author), readed (bookname, author), reviews (bookname, author, review, rating).

Модуль пользователя

useredit.php

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

Входные данные: данные сессии (Username, Rights), вводимые данные userinfo (fullname, age, location, userinfo). Выходные данные: старые данные user_info (id, username, fullname, age, location, userinfo).

Модуль пользователя

addbook.php

Добавить книгу в один из пользовательских разделов

Входные данные: данные сессии (Username, Rights), w_trade (bookname, author, trade_info, date), w_read (bookname, author), readed (bookname, author).

Продолжение таблицы 1

Модуль пользователя, личные сообщения

messages.php

Личные сообщения пользователя

Входные данные: данные сессии (Username, Rights). Выходные данные: список сообщений messages (data, u_from, u_to, flag).

Модуль пользователя, личные сообщения

read_mes.php

Развернуть личное сообщение

Входные данные: данные сессии (Username, Rights). Выходные данные: сообщение messages (data, u_from, u_to, message).

Модуль пользователя, личные сообщения

pm.php

Отправить сообщение

Входные данные: данные сессии (Username, Rights), сообщение messages (data, u_from, u_to, message).

Модуль администратора

adminpanel.php

Панель администратора с функциями бана, разбана, добавления книг и цитат в библиотеки и их редактирования

Входные данные: данные сессии (Username, Rights). Выходные данные: user_info (username, rights), books (book_id, bookname, author, genre), site_news (title, text, username), lit_news (title, small_text, text, username), quotes (bookname, quote_text).

Модуль администратора, библиотека

library.php

Справка по библиотеке для администратора

Входные данные: данные сессии (Username, Rights). Выходные данные: books (book_id, bookname, author, genre).

Таблица 2

Модуль

Компонент

Назначение компонента

Входные и выходные данные

Включено во всех модулях

connect.php

Включение переменных, содержащих данные для коннекта с СУБД и выбора конкретной БД на сервере, также устанавливается кодировка

Включено во всех общих модулях

header.php

«Шапка» для авторизованного пользователя

Входные данные: данные сессии (Username). Выходные данные: (Username), форма log out, ссылка на модуль личных сообщений, для администратора – ссылка на панель администратора.

Продолжение таблицы 2

Включено во всех общих модулях

aheader.php

«Шапка» для неавторизованного пользователя

Кнопки входа (log in) и регистрации (register).

Включено во всех модулях

footer.php

«подвал»

Текст копирайта.

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

logout.php

Кнопка окончания сессии

Входные данные: данные сессии (Username), обновление активности пользователя и даты последней активности user_info (active, date).

Модуль пользователя, перенаправление

delete.php

Удаление объявление об обмене

Входные данные: данные сессии (Username, Rights), удаляемая позиция w_trade (item_id).

Модуль пользователя, перенаправление

deletew.php

Удаление желаемой книги

Входные данные: данные сессии (Username), удаляемая позиция w_read (w_id).

Для передачи данных на сервер для работы с базой данных во всех модулях использовался метод POST. Для реализации динамически генерируемых страниц пользователей и страниц, содержащих личные сообщения, а также страниц, содержащих конкретную новость, использован метод GET. При этом если адрес к странице пользователя имеет следующий вид: «booktrade.org/user.php», то пользователь попадает на свою страницу. Также метод GET используется для реализации удаления записей с использованием отдельных модулей и обязательной проверкой прав пользователя; таким образом, запись может удалить исключительно либо пользователь, разместивший ее, либо администратор. Во всех модулях используются сессии, обязательно содержащие идентификационный номер, логин и права пользователя; данное решение было принято для реализации проверок подлинности пользователя во всех разделах, доступ к добавлению, редактированию, удалению и просмотру контента которых ограничен правами пользователей. При переходе на страницу logout.php все данные о сессии стираются и пользователь перенаправляется на стартовую страницу.

3. Описание структуры базы данных

Подключение к базе данных осуществляется с использованием расширения драйвера реляционных баз данных, используемого в PHP, MySQLi. Для упрощения работы с СУБД, а также упрощения возможного перехода на другой сервер, в отдельный подключаемый файл connect.php были прописаны переменные, содержащие данные для подключения к базе данных, а также прописана кодировка UTF8. Все последующие модули включают в себя данный файл и, как следствие, отсутствует необходимость в каждом файле прописывать подключение к СУБД, выбор конкретной БД и кодировку для обращения к СУБД. Также при разработке модуля личных сообщений было использовано расширение PHP Data Object (PDO). Код, прописанный в файле connect.php, при разработке веб-ресурса на домашнем компьютере показан на рисунке 2.

Рисунок 2

Структура разработанной базы данных показана на рисунке 3 в виде ER-модели.

Таблица ‘users’ (структура отображена в таблице 3) используется для регистрации и аутентификации пользователя. В нее заносится логин, электронная почта и пароль пользователя при регистрации. Таблица ‘user_info’ (таблица 4) содержит второстепенную информацию о пользователе, в обязательном порядке при регистрации пользователем заполняется только поля, содержащие логин пользователя, при желании также заполняются остальные поля либо во время регистрации, либо после; также при определенных действиях пользователя (начало и конец сессии) изменяются поля, содержащие информацию об онлайне и дате последней активности пользователя.

Рисунок 3

Таблица 3

Столбец

Тип

Атрибуты

Назначение

id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

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

username

varchar(255)

INDEX

UNIQUE

NOT_NULL

Имя (логин) пользователя

email

varchar(255)

NOT_NULL

Электронная почта пользователя

password

varchar(255)

NOT_NULL

Пароль пользователя

rights

int(1)

NULL

Определяет права пользователя (при регистрации заполняется как 1, при бане – 0, для администраторов – 2)

Таблица 4

Столбец

Тип

Атрибуты

Назначение

username

varchar(255)

INDEX

NOT_NULL

Имя (логин) пользователя

fullname

varchar(255)

NULL

Полное имя пользователя

age

int(3)

NULL

Возраст пользователя

location

varchar(255)

NULL

Место жительства пользователя

userinfo

varchar(255)

NULL

Информация о пользователе

active

int(1)

NULL

Онлайн пользователя (1 – онлайн, 0 – оффлайн)

active_date

timestamp

Отметка о дате и времени последней активности

Таблица ‘messages’ (таблица 5) содержит имена отправителя и получателя. Имя отправителя берется из сессии и автоматически заполняется при отправке пользователем сообщения, имя получателя вводится пользователем вручную. Также таблица содержит данные о том, прочитано сообщение или нет, что использовано при отображении списка входящих сообщений в пользовательском интерфейсе.

Таблица 5

Столбец

Тип

Атрибуты

Назначение

m_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер сообщения

data

timestamp

Дата отправки сообщения

u_from

varchar(255)

NOT_NULL

От кого

u_to

varchar(255)

NOT_NULL

Кому

message

text

NOT_NULL

Текст сообщения

flag

int(11)

NOT_NULL

Отметка о прочтении сообщения

Таблица ‘books’ (таблица 6) является своего рода библиотекой веб-ресурса и содержит в себе названия, авторов и жанры книг.

Таблица 5

Столбец

Тип

Атрибуты

Назначение

book_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер книги

bookname

varchar(255)

INDEX

NOT_NULL

Название книги

author

varchar(255)

NOT_NULL

Автор книги

genre

varchar(255)

NOT_NULL

Жанры книги

Таблица ‘quotes’ (таблица 7) является сборником цитат и содержит текст цитаты и название книги, из которых взята эта цитата.

Таблица 7

Столбец

Тип

Атрибуты

Назначение

quote_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер цитаты

bookname

varchar(255)

INDEX

NOT_NULL

Название книги

quote_text

text

NOT_NULL

Текст цитаты

Таблица ‘readed’ (таблица 8) предназначена для составления персональных библиотек пользователей и содержит имя пользователя, название и автора книги, дату добавления.

Таблица 8

Столбец

Тип

Атрибуты

Назначение

r_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер прочитанной книги

username

varchar(255)

INDEX

NOT_NULL

Имя пользователя

bookname

varchar(255)

INDEX

NOT_NULL

Название книги

author

varchar(255)

NOT_NULL

Автор книги

date

timestamp

Дата добавления

Таблица ‘w_read’ (таблица 9) предназначена для составления персональных пожеланий пользователя и содержит имя пользователя, название и автора книги.

Таблица 9

Столбец

Тип

Атрибуты

Назначение

wr_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер желаемой книги

username

varchar(255)

INDEX

NOT_NULL

Имя пользователя

bookname

varchar(255)

INDEX

NOT_NULL

Название книги

author

varchar(255)

NOT_NULL

Автор книги

Таблица ‘w_trade’ (таблица 10) предназначена для составления предложений для обмена книгами и содержит имя пользователя, название и автора книги, информацию об обмене и дату добавления предложения.

Таблица 10

Столбец

Тип

Атрибуты

Назначение

item_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер предложения об обмене

username

varchar(255)

INDEX

NOT_NULL

Имя пользователя

bookname

varchar(255)

INDEX

NOT_NULL

Название книги

author

varchar(255)

NOT_NULL

Автор книги

trade_info

text

NOT_NULL

Информация об обмене

date

timestamp

Дата добавления

Таблица ‘reviews’ (таблица 11) предназначена для хранения обзоров пользователей на книги и содержит название и автора книги, имя пользователя, текст обзора, оценку книги, дату добавления обзора.

Таблица 11

Столбец

Тип

Атрибуты

Назначение

review_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер обзора

bookname

varchar(255)

INDEX

NOT_NULL

Название книги

author

varchar(255)

NOT_NULL

Автор книги

username

varchar(255)

INDEX

NOT_NULL

Имя пользователя

review

text

NOT_NULL

Текст обзора

rating

int(2)

NOT_NULL

Оценка по десятибалльной шкале

date

timestamp

Дата добавления

Таблица ‘lit_news’ (таблица 12) предназначена для хранения новостей литературы и содержит название новости, краткое содержание, основное содержание (текст) новости, имя пользователя и дату добавления.

Таблица 12

Столбец

Тип

Атрибуты

Назначение

new_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер новости

title

varchar(255)

NOT_NULL

Название новости

small_text

varchar(255)

NOT_NULL

Краткий текст новости

text

text

NOT_NULL

Полный текст

username

varchar(255)

INDEX

NOT_NULL

Имя пользователя

date

timestamp

Дата добавления

Таблица ‘site_news’ (таблица 13) предназначена для хранения новостей и оповещений о веб-ресурсе и содержит название новости, текст, имя пользователя и дату добавления.

Таблица 13

Столбец

Тип

Атрибуты

Назначение

n_id

int(11)

AUTO_INCREMENT

PRIMARY_KEY

Идентификационный номер новости

title

varchar(255)

NOT_NULL

Название новости

text

text

NOT_NULL

Текст новости

username

varchar(255)

INDEX

NOT_NULL

Имя пользователя

date

timestamp

Дата добавления

4. Описание структуры клиентской части

4.1. Описание интерфейса пользователя

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

Рисунок 5

Рисунок 6

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

Страницы ‘What to read?’ и ‘Quotes’ выглядят одинаково как для аутентифицированных пользователей, так и для неаутентифицированных и выглядят следующим образом (рисунок 7, 8 соответственно).

Рисунок 7

Рисунок 8

При нажатии на кнопки “Get another book!” и “Get another quote!” страницы обновляются и выдают другие случайные данные из БД.

Страница ‘Users’ reviews’ выглядит следующим образом (рисунок 9). На нее выводятся из базы данных пять абсолютно случайных обзоров. Для аутентифицированных пользователей также присутствует кнопка ‘Add your review!’ и соответственно возможность добавить свой обзор. Если авторизованный пользователь является автором обзора, он может перейти на страницу редактирования обзора, нажав на кнопку ‘Edit review’.

Рисунок 9

Страница с формой добавления обзора выглядит следующим образом (рисунок 10). При добавлении обзора используется метод POST.

Рисунок 10

Страница редактирования обзора выглядит следующим образом (рисунок 11) и генерируется автоматически с помощью метода GET. Все данные, отредактированные в данной форме, отправляются методом POST.

Рисунок 11

Страница ‘Trade offers’ выглядит следующим образом (рисунок 12). На странице формируется динамически сто последних предложений обмена, для удобства сразу же присутствует кнопка для перенаправления на форму написания сообщения автору объявления. При переходе посредством нажатия на эту кнопку строка адресата заполняется автоматически. Для неаутентифицированного пользователя кнопка ‘Add your trade offer!’ отсутствует. Данная кнопка перенаправляет пользователя на внутренний пользовательский интерфейс (см. рисунок 18).

Рисунок 12

Страница ‘Literature news’ выглядит следующим образом (рисунок 13) и формируется динамически из заголовков и кратких содержаний новостей литературы, содержащихся в базе данных. Внутренние страницы, содержащие сами новости, выглядят так, как показано на рисунке 14, и формируются динамически с помощью метода GET.

Рисунок 13

Рисунок 14

Страница пользователя выглядит следующим образом (рисунок 15) и генерируется динамически с помощью метода GET. Присутствует возможность удалять книги из всех разделов, кроме readed и reviews. Также происходит проверка данных и в случае, если страница не принадлежит пользователю, она выглядит несколько иначе (рисунок 16), то есть отсутствуют кнопки работы с контентом на своей страницы, редактирования профиля и добавления книг в разделы, но присутствует кнопка для отправки сообщения пользователю.

Рисунок 15

Рисунок 17

Формы добавления книг в различные разделы профиля выглядит следующим образом (рисунок 18). Передача данных осуществляется методом POST. При попытке добавления книг, происходит проверка, определяющая, не забанен ли пользователь. В случае, если пользователь забанен, контент на странице не выводится.

Рисунок 18

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

Рисунок 19

Страница с личными сообщениями выглядит следующим образом (рисунок 20). Содержит информацию о сообщении, а также ссылку на прочтение.

Рисунок 20

Страница с конкретным сообщением выглядит следующим образом (рисунок 21) и формируется динамически с помощью метода GET.

Рисунок 21

При нажатии на кнопку ‘answer’, пользователь переходит на страницу с формой отправки сообщения (рисунок 22), где с помощью метода GET поле адресата автозаполняется. В случае, если пользователь просто перешел на страницу «booktrade.org/pm.php», поле остается пустым. Также при попытке перейти на форму отправления сообщения происходит проверка прав пользователя и в случае, если пользователь забанен, форма не выводится. Сообщения отправляются с помощью метода POST.

Рисунок 22

Для завершения сессии пользователь должен нажать на кнопку ‘Log out’ (рисунок 23) на любой из страниц основного модуля.

Рисунок 23

4.2. Описание интерфейса администратора

«Шапка» для администратора несколько отлична от «шапки» обычного пользователя (рисунок 24). Помимо основных кнопок, добавляется также кнопка перехода на панель администрирования.

Рисунок 24

На странице ‘Users’ reviews’ у администратора, в отличие от обычного пользователя, присутствует возможность редактировать любой обзор, а не только обзор своего авторства (рисунок 25).

Рисунок 25

Также, в отличие от обычного пользователя, присутствует кнопка редактирования текста новости из раздела ‘Literature news’ в случае перехода на страницу с основным содержанием. Форма редактирования текста новости выглядит следующим образом (рисунок 26) и формируется динамически с помощью метода GET. Отправляются измененные данные с помощью метода POST.

Рисунок 26

Непосредственно панель администратора выглядит следующим образом (рисунок 27). Данные отправляются с помощью метода POST.

Рисунок 27

Кнопка ‘Library’ ведет на соответствующую страницу (рисунок 28) и позволяет администратору просматривать библиотеку (таблицу books) сайта. Страница доступна только пользователям с правами администратора.

Рисунок 28

Также администратор может удалять записи из чужих профилей, кроме readed (рисунок 29).

Рисунок 29

4.3. Инструкция пользователя

Впервые посетив сайт и ознакомившись с информацией на домашней странице, новому пользователю следует обратить внимание на верхнюю часть наполнения страницы и нажать на кнопку ‘REGISTER’, чтобы создать свою учетную запись (рисунок 30).

Рисунок 30

После нажатия на кнопку пользователь попадает на страницу регистрации, где он обязательно должен заполнить поля, обозначенные «звездочкой», и по желанию заполнить остальные поля (рисунок 31).

Рисунок 31

После заполнения полей пользователь должен нажать на кнопку ‘Register’ в нижней части страницы (рисунок 32).

Рисунок 32

Когда пользователь зарегистрировался, ему будет выдано следующее сообщение (рисунок 33). Для продолжения работы он может нажать как на ‘Log in’, так и на ‘Home page’, после чего пройти аутентификацию, нажав на кнопку ‘LOG IN’ в основном модуле сайта.

Рисунок 33

Для того, чтобы пройти аутентификацию, пользователь должен заполнить оба поля на странице аутентификации, после чего нажать на кнопку ‘Log in’ (рисунок 34).

Рисунок 34

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

Рисунок 35

После перехода на персональную страницу, пользователь может добавить книгу в какой-либо из разделов, нажав на кнопку ‘Add book to readed, wanted or trade offers’, либо отредактировать персональную информацию, нажав на кнопку ‘Edit profile’, либо вернуться на домашнюю страницу, нажав на кнопку ‘Back to home page’ (рисунок 36).

Рисунок 36

Для добавления книги в какой-либо из разделов, пользователь должен заполнить все доступные поля, относящиеся к интересующей его секции, и нажать соответствующую кнопку (рисунок 37).

Рисунок 37

Для редактирования профиля пользователь должен заполнить желаемые поля и нажать на кнопку ‘OK’ (рисунок 38).

Рисунок 38

Для добавления своего обзора, пользователь должен перейти в раздел ‘Users’ reviews’ основного модуля и нажать на кнопку ‘Add your review!’ (рисунок 39). Таким же образом пользователь может перейти к форме добавления предложения на обмен.

Рисунок 39

Для отправки сообщения другому пользователю, необходимо перейти на его страницу и нажать на кнопку ‘Private mail’ (рисунок 40).

Рисунок 40

Далее необходимо ввести желаемое сообщение в форму и нажать ‘Send’ (рисунок 41).

Рисунок 41

Для просмотра личных сообщений необходимо нажать на кнопку ‘PM’ в «шапке» основного модуля (рисунок 42). Для просмотра сообщения – нажать ‘Open’ (рисунок 43). И для ответа на сообщение – нажать ‘Answer’ (рисунок 44).

Рисунок 42

Рисунок 43

Рисунок 44

Заключение

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

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

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

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

Список литературы

  1. Мейер, Б. Инструменты, алгоритмы и структуры данных / Б. Мейер. - 2-е изд., испр. - М. : Национальный Открытый Университет «ИНТУИТ», 2016.
  2. Савельева, Н.В. Язык программирования PHP / Н.В. Савельева. - 2-е изд., испр. - М. : Национальный Открытый Университет «ИНТУИТ», 2016
  3. Прохоренок, Н. HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера / Н. Прохоренок. - СПб.: БХВ - Петербург., 2010. - 900 с.
  4. Электронный ресурс: [https://stackoverflow.com/]
  5. Электронный ресурс: [https://toster.ru/]
  6. Электронный ресурс: [https://habr.com/]
  7. Электронный ресурс: [http://htmlbook.ru/].
  8. Электронный ресурс: [https://www.internet-technologies.ru/]
  9. Электронный ресурс: [https://php.net/]
  10. Электронный ресурс: [https://php.su/]

Приложение

Исходные коды

connect.php

<?php

$connection = mysqli_connect('localhost', 'root', '');

$select_db = mysqli_select_db($connection, 'booktrade.org');

mysqli_query($connection, "SET NAMES utf8");

?>

header.php

<style type="text/css">

h1 {

width: 898px;

height: 50px;

border: 1px dashed #777;

font-variant: small-caps;

}

.button {

display: block;

width: 120px;

height: 30px;

border: 1px solid #094b9c;

background: #3986c9;

color: #fff;

float: left;

font-size: 11pt;

padding-top: 13px;

margin-left: 5px;

margin-right: 5px;

margin-bottom: 20px;

margin-top: -5px;

cursor: pointer;

}

.button1 {

margin-left: 322px;

}

.button:hover {

background: #094b9c;

color: #efefef;

border: 1px solid #094b9c;

}

</style>

<div class="header">

<h1>BookTrade</h1>

<a href="login.php"><div class="button button1">LOG IN</div></a>

<a href="register.php"><div class="button">REGISTER</div></a>

</div>

aheader.php

<style type="text/css">

h1 {

width: 898px;

height: 50px;

border: 1px dashed #777;

font-variant: small-caps;

}

.button {

display: block;

width: 120px;

height: 30px;

border: 1px solid #094b9c;

background: #3986c9;

color: #fff;

float: right;

font-size: 11pt;

padding-top: 13px;

margin-top: -45px;

margin-bottom: 15px;

cursor: pointer;

}

.button:hover {

background: #094b9c;

color: #efefef;

}

</style>

<div class="header">

<h1>BookTrade</h1>

<p>Welcome,

<?php

$username = $_SESSION['username'];

echo "<a href='user.php?name=$username' title='personal page'>$username</a>! <a href='messages.php'>PM</a>";

?>

<?php if ($_SESSION['rights'] == 2) {

echo "<a href='adminpanel.php'> Go to admin. panel </a>";

} ?>

</p>

<a href="includes/logout.php"><div class="button">LOG OUT</div></a>

</div>

footer.php

<style type="text/css">

.footer {

font-size: 12px;

text-align: center;

margin-top: 20px;

}

.pf {

color: #777;

}

</style>

<div class="footer">

<p class="pf">All rights reserved © booktrade.org 2019</p>

</div>

logout.php

<?php

session_start();

require('connect.php');

$username = $_SESSION['username'];

$query_active = "UPDATE user_info SET active=0 WHERE username='$username'";

$update_active = mysqli_query($connection, $query_active);

session_destroy();

header('Location: /booktrade.org/index.php');

exit;

?>

delete.php

<?php

session_start();

require('connect.php');

$item_id = $_GET['id'];

$wrg = mysqli_query($connection, "SELECT username FROM w_trade WHERE item_id = '$item_id'");

do {

$username = $res['username'];

} while ($res = mysqli_fetch_array($wrg));

if ($_SESSION['username'] == $username || $_SESSION['rights'] == 2) {

$sql = "DELETE FROM w_trade WHERE item_id = '$item_id'";

if (mysqli_query($connection, $sql)) {

mysqli_close($connection);

header('Location: /booktrade.org/user.php');

exit;

}

else {

echo "Error deleting record";

}

}

?>

deletew.php

<?php

session_start();

require('connect.php');

$wr_id = $_GET['id'];

$wrg = mysqli_query($connection, "SELECT username FROM w_read WHERE wr_id = '$wr_id'");

do {

$username = $res['username'];

} while ($res = mysqli_fetch_array($wrg));

if ($_SESSION['username'] == $username) {

$sql = "DELETE FROM w_read WHERE wr_id = '$wr_id'";

if (mysqli_query($connection, $sql)) {

mysqli_close($connection);

header('Location: /booktrade.org/user.php');

exit;

}

else {

echo "Error deleting record";

}

}

?>

index.php

<?php

session_start();

require('includes/connect.php');

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<?php

if (isset($_SESSION['username'])) {

include('includes/aheader.php');

} else {

include('includes/header.php');

}

?>

<div class="plot">

<ul>

<a href="index.php"><li class="li_first">Home page</li></a>

<a href="goread.php"><li class="li_reg">What to read?</li></a>

<a href="quotes.php"><li class="li_reg">Quotes</li></a>

<a href="reviews.php"><li class="li_reg">Users' reviews</li></a>

<a href="toffers.php"><li class="li_reg">Trade offers</li></a>

<a href="news.php"><li class="li_last">Literature news</li></a>

</ul>

<br>

<?php

if ($_SESSION['username'] == NULL) {

echo "<h3 align='center'>This site was made by book lovers for book lovers. Here you can find the latest literature news, exchange books with other users or even find new friends.<br>Our resource is not aimed at providing information, but in the search for something new. You can find something new for yourself by looking at a section with a random book, random quotes, or even a selection of random reviews!</h3>";

}

?>

<img src='graphics/sharing.png' align='center' width = 880px>

<hr>

<h5>Users online now:</h5>

<p>

<?php

$query_online = "SELECT * FROM user_info WHERE active=1";

$result_online = mysqli_query($connection, $query_online) or die("Ошибка " . mysqli_error($connection));

if($result_online) {

$rows = mysqli_num_rows($result_online);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result_online);

echo "<a href='user.php?name=$row[0]'>$row[0]</a> ";

}

}

?>

</p>

<hr>

<?php

$query = ('SELECT title, text FROM (SELECT * FROM site_news ORDER BY n_id DESC LIMIT 5) AS T ORDER BY n_id ASC');

$result = mysqli_query($connection, $query) or die("Ошибка " . mysqli_error($connection));

if($result) {

$rows = mysqli_num_rows($result);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result);

echo "<h3>$row[0]</h3>";

echo "<p>$row[1]</p>";

echo "<h5>$row[3]</h5>";

echo "<br>";

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

addbook.php

<?php

session_start();

require('includes/connect.php');

$username = $_SESSION['username'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Add book</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

</body>

<div class="wrapper">

<div class="plott">

<?php

echo "<a href='index.php'><- Back to home page</a><br><a href='user.php?name=$username'><- Back to userpage</a>";

if ($_SESSION['rights'] > 0) {

$tbookname = $_POST['tbookname'];

$tradeinfo = $_POST['tradeinfo'];

$tauthor = $_POST['tauthor'];

if ($tbookname != NULL && $tradeinfo != NULL && $tauthor != NULL) {

$query_trade = "INSERT INTO w_trade (username, bookname, author, trade_info) VALUES ('$username', '$tbookname', '$tauthor', '$tradeinfo')";

$add_trade = mysqli_query($connection, $query_trade) or die(mysqli_error($connection));

echo "<p>You added trade offer.</p>";

}

$wbookname = $_POST['wbookname'];

$wauthor = $_POST['wauthor'];

if ($wbookname != NULL && $wauthor != NULL) {

$query_wanted = "INSERT INTO w_read (username, bookname, author) VALUES ('$username', '$wbookname', '$wauthor')";

$add_wanted = mysqli_query($connection, $query_wanted) or die(mysqli_error($connection));

echo "<p>You added $wbookname to wanted books.</p>";

}

$rbookname = $_POST['rbookname'];

if ($rbookname != NULL && $rauthor != NULL) {

$query_readed = "INSERT INTO readed (username, bookname, author) VALUES ('$username', '$rbookname', '$rauthor')";

$add_readed = mysqli_query($connection, $query_readed) or die(mysqli_error($connection));

echo "<p>You added $rbookname to readed books.</p>";

}

echo "<form action='addbook.php' id='addtrade' method='POST' name='addtrade'>

<h4>Add trade offer:</h4>

<p>Book name:</p>

<p><input class='input' id='tbookname' name='tbookname' size='32' type='text' placeholder='book name'></p>

<p>Author:</p>

<p><input class='input' id='tauthor' name='tauthor' size='32' type='text' placeholder='author'></p>

<p>Trade info:</p>

<p><textarea class='input' id='tradeinfo' name='tradeinfo' cols='50' rows='5' placeholder='trade info'></textarea></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Add trade offer'></p></form><hr>";

echo "<form action='addbook.php' id='addwanted' method='POST' name='addwanted'>

<h4>Add wanted book:</h4>

<p>Book name:</p>

<p><input class='input' id='wbookname' name='wbookname' size='32' type='text' placeholder='book name'></p>

<p>Author:</p>

<p><input class='input' id='wauthor' name='wauthor' size='32' type='text' placeholder='author'></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Add wanted book'></p></form><hr>";

echo "<form action='addbook.php' id='addreaded' method='POST' name='addeaded'>

<h4>Add readed book:</h4>

<p>Book name:</p>

<p><input class='input' id='rbookname' name='rbookname' size='32' type='text' placeholder='book name'></p>

<p>Author:</p>

<p><input class='input' id='rauthor' name='rauthor' size='32' type='text' placeholder='author'></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Add readed book'></p></form><hr>";

}

?>

</div>

</div>

</body>

addreview.php

<?php

session_start();

require('includes/connect.php');

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Literature news</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<?php

if (isset($_SESSION['username'])) {

include('includes/aheader.php');

} else {

include('includes/header.php');

}

?>

<div class="plot">

<ul>

<a href="index.php"><li class="li_first">Home page</li></a>

<a href="goread.php"><li class="li_reg">What to read?</li></a>

<a href="quotes.php"><li class="li_reg">Quotes</li></a>

<a href="reviews.php"><li class="li_reg">Users' reviews</li></a>

<a href="toffers.php"><li class="li_reg">Trade offers</li></a>

<a href="news.php"><li class="li_last">Literature news</li></a>

</ul>

<br>

<?php

if ($_SESSION['rights'] > 0) {

$bookname = $_POST['bookname'];

$review = $_POST['review'];

$rating = $_POST['rating'];

$author = $_POST['author'];

if ($bookname != NULL && $review != NULL && $rating != NULL) {

$query = "INSERT INTO reviews (bookname, username, review, rating, author) VALUES ('$bookname', '$username', '$review', '$rating', '$author')";

$update_active = mysqli_query($connection, $query) or die(mysqli_error($connection));

echo "<p>You added review.</p>";

}

echo "<h2>Add your review!</h2>

<form action='addreview.php' id='litnews' method='POST' name='litnews'>

<p>Book name:</p>

<p><input class='input' id='bookname' name='bookname' size='110' type='text' placeholder='book name'></p>

<p>Author:</p>

<p><input class='input' id='author' name='author' size='110' type='text' placeholder='author'></p>

<p>Your review:</p>

<p><textarea class='input' id='review' name='review' cols='110' rows='20' placeholder='review'></textarea></p>

<p>Your mark:</p>

<p><input class='input' id='rating' name='rating' size='10' type='value' min='1' max='10'></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Add review!'></p></form>";

} else {

echo "<p>You haven't rights to use this page.</p>";

if ($_SESSION['username'] == NULL) {

echo "<p>You should register or log in to add your review.</p>";

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

adminpanel.php

<?php

session_start();

require("includes/connect.php");

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Adminpanel</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<style type="text/css">

.button {

border: solid 1px #094b9c;

background: #3986c9;

color: #fff;

height: 30px;

width: 150px;

padding: 7px 12px;

cursor: pointer;

}

.button:hover {

background: #094b9c;

}

input {

background: #fbfbfb;

font-size: 12pt;

line-height: 1;

width: 300px;

padding: 3px;

padding-left: 10px;

margin: 0 6px 5px 0;

outline: none;

border-bottom: 1px solid #d9d9d9;

border-top: 0px;

border-left: 0px;

border-right: 0px;

}

</style>

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class='wrapper'>

<div class='plott'>

<?php

if ($_SESSION['rights'] == 2) {

$busername = $_POST['busername'];

if ($busername != NULL) {

$query = "UPDATE users SET rights='0' WHERE username='$busername'";

$update_active = mysqli_query($connection, $query) or die(mysqli_error($connection));

echo "<p>You banned $busername.</p>";

}

$unbusername = $_POST['unbusername'];

if ($unbusername != NULL) {

$query = "UPDATE users SET rights='1' WHERE username='$unbusername'";

$update_active = mysqli_query($connection, $query) or die(mysqli_error($connection));

echo "<p>You unbanned $unbusername.</p>";

}

$bookname = $_POST['bookname'];

$author = $_POST['author'];

$genre = $_POST['genre'];

if ($bookname != NULL && $author != NULL && $genre != NULL) {

$query = "INSERT INTO books (bookname, author, genre) VALUES ('$bookname', '$author', '$genre')";

$update_active = mysqli_query($connection, $query) or die(mysqli_error($connection));

echo "<p>You added book: $bookname by $author ($genre).</p>";

}

$bookid = $_POST['bookid'];

$ebookname = $_POST['ebookname'];

$eauthor = $_POST['eauthor'];

$egenre = $_POST['egenre'];

if ($bookid != NULL && $ebookname != NULL) {

$query_active = "UPDATE books SET bookname='$ebookname' WHERE book_id='$bookid'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

}

if ($bookid != NULL && $eauthor != NULL) {

$query_active = "UPDATE books SET author='$eauthor' WHERE book_id='$bookid'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

}

if ($bookid != NULL && $egenre != NULL) {

$query_active = "UPDATE books SET genre='$egenre' WHERE book_id='$bookid'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

}

$stitle = $_POST['stitle'];

$stext = $_POST['stext'];

$usr = $_SESSION['username'];

if ($stitle != NULL && $stext != NULL) {

$query = "INSERT INTO site_news (title, text, username) VALUES ('$stitle', '$stext', '$usr')";

$update_active = mysqli_query($connection, $query) or die(mysqli_error($connection));

echo "<p>You added site news: $stitle.</p>";

}

$ltitle = $_POST['ltitle'];

$lstext = $_POST['lstext'];

$ltext = $_POST['ltext'];

if ($ltitle != NULL && $lstext != NULL && $ltext != NULL) {

$query = "INSERT INTO lit_news (title, small_text, text, username) VALUES ('$ltitle', '$lstext', '$ltext', '$usr')";

$update_active = mysqli_query($connection, $query) or die(mysqli_error($connection));

echo "<p>You added site news: $ltitle.</p>";

}

$qtext = $_POST['qtext'];

$qbookname = $_POST['qbookname'];

if ($qtext != NULL && $qbookname != NULL) {

$query = "INSERT INTO quotes (bookname, quote_text) VALUES ('$qbookname', '$qtext')";

$update_active = mysqli_query($connection, $query) or die(mysqli_error($connection));

echo "<p>You added quote: $qtext.</p>";

}

echo "<p><a href='index.php'><- Back to home page</a></p>

<br>

<form action='adminpanel.php' id='ban_user' method='POST' name='ban_user'>

<p>Ban user:</p>

<p><input class='input' id='busername' name='busername' size='32' type='text' placeholder='username'></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Ban'></p></form>

<br>

<form action='adminpanel.php' id='unban_user' method='POST' name='unban_user'>

<p>Unban user:</p>

<p><input class='input' id='unbusername' name='unbusername' size='32' type='text' placeholder='username'></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Unban'></p></form>

<br>

<form action='adminpanel.php' id='addbook' method='POST' name='addbook'>

<p><a href='library.php'>Library (all added books)</a>.</p>

<p>Add book to library:</p>

<p><input class='input' id='bookname' name='bookname' size='50' type='text' placeholder='book'></p>

<p><input class='input' id='author' name='author' size='50' type='text' placeholder='author'></p>

<p><input class='input' id='genre' name='genre' size='50' type='text' placeholder='genres'></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Add book'></p></form>

<br>

<form action='adminpanel.php' id='editbook' method='POST' name='editbook'>

<p>Edit book from library:</p>

<p><input class='input' id='bookid' name='bookid' size='5' type='value' placeholder='book id'></p>

<p><input class='input' id='ebookname' name='ebookname' size='50' type='text' placeholder='book'></p>

<p><input class='input' id='eauthor' name='eauthor' size='50' type='text' placeholder='author'></p>

<p><input class='input' id='egenre' name='egenre' size='50' type='text' placeholder='genres'></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Edit book'></p></form>

<br>

<form action='adminpanel.php' id='sitenews' method='POST' name='sitenews'>

<p>Add site news:</p>

<p><input class='input' id='stitle' name='stitle' size='50' type='text' placeholder='title'></p>

<p><textarea class='input' id='stext' name='stext' cols='50' rows='5' placeholder='text'></textarea></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Add site news'></p></form>

<br>

<form action='adminpanel.php' id='litnews' method='POST' name='litnews'>

<p>Add literature news:</p>

<p><input class='input' id='ltitle' name='ltitle' size='50' type='text' placeholder='title'></p>

<p><input class='input' id='lstext' name='lstext' size='50' type='text' placeholder='small text'></p>

<p><textarea class='input' id='ltext' name='ltext' cols='50' rows='5' placeholder='main text'></textarea></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Add lit news'></p></form>

<br>

<form action='adminpanel.php' id='quotes' method='POST' name='quotes'>

<p>Add quote (don't forget add book to the library!):</p>

<p><input class='input' id='qbookname' name='qbookname' size='50' type='text' placeholder='bookname'></p>

<p><textarea class='input' id='qtext' name='qtext' cols='50' rows='5' placeholder='quote'></textarea></p>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Add quote'></p></form>

";

} else {

echo "You haven't rights to use this page.";

}

?>

</div>

</div>

</body>

</html>

editnews.php

<?php

session_start();

require('includes/connect.php');

$id = $_GET['id'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Literature news</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<?php

if (isset($_SESSION['username'])) {

include('includes/aheader.php');

} else {

include('includes/header.php');

}

?>

<div class="plot">

<ul>

<a href="index.php"><li class="li_first">Home page</li></a>

<a href="goread.php"><li class="li_reg">What to read?</li></a>

<a href="quotes.php"><li class="li_reg">Quotes</li></a>

<a href="reviews.php"><li class="li_reg">Users' reviews</li></a>

<a href="toffers.php"><li class="li_reg">Trade offers</li></a>

<a href="news.php"><li class="li_last">Literature news</li></a>

</ul>

<br>

<?php

$query = ("SELECT title, small_text, text, username FROM lit_news WHERE new_id='$id'");

$result = mysqli_query($connection, $query) or die("Ошибка " . mysqli_error($connection));

if($result) {

$rows = mysqli_num_rows($result);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result);

$title = $row[0];

$stext = $row[1];

$text = $row[2];

$author = $row[3];

}

}

if ($_SESSION['username'] == $author || $_SESSION['rights'] == 2) {

echo "<form action='editnews.php?id=$id' id='editnews' method='POST' name='editnews'>

<p>Add literature news:</p>

<p><input class='input' id='title' name='title' size='110' type='text' value='$title'></p>

<p><input class='input' id='stext' name='stext' size='110' type='text' value='$stext'></p>

<p><textarea class='input' id='text' name='text' cols='120' rows='20'>$text</textarea></p><br>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Edit'></p></form>";

$title = $_POST['title'];

$stext = $_POST['stext'];

$text = $_POST['text'];

if ($title != NULL && $stext != NULL && $text != NULL) {

$query_active = "UPDATE lit_news SET title='$title', small_text='$stext', text='$text' WHERE new_id='$id'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

echo "<p>Text was updated. <a href='litnews.php?id=$id'>Go back?</a></p>";

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

editreview.php

<?php

session_start();

require('includes/connect.php');

$id = $_GET['id'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Literature news</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<?php

if (isset($_SESSION['username'])) {

include('includes/aheader.php');

} else {

include('includes/header.php');

}

?>

<div class="plot">

<ul>

<a href="index.php"><li class="li_first">Home page</li></a>

<a href="goread.php"><li class="li_reg">What to read?</li></a>

<a href="quotes.php"><li class="li_reg">Quotes</li></a>

<a href="reviews.php"><li class="li_reg">Users' reviews</li></a>

<a href="toffers.php"><li class="li_reg">Trade offers</li></a>

<a href="news.php"><li class="li_last">Literature news</li></a>

</ul>

<br>

<?php

$query = ("SELECT bookname, review, rating, username FROM reviews WHERE review_id='$id'");

$result = mysqli_query($connection, $query) or die("Ошибка " . mysqli_error($connection));

if($result) {

$rows = mysqli_num_rows($result);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result);

$bookname = $row[0];

$review = $row[1];

$rating = $row[2];

$author = $row[3];

}

}

if ($_SESSION['username'] == $author || $_SESSION['rights'] == 2) {

echo "<form action='editreview.php?id=$id' id='editnews' method='POST' name='editreview'>

<p>Edit review:</p>

<p>$bookname</p>

<p><textarea class='input' id='review' name='review' cols='110' rows='20'>$review</textarea></p>

<p><input class='input' id='rating' name='rating' size='10' type='value' min='1' max='10' value='$rating'></p><br>

<p class='submit'><input class='button' id='admit' name='admit' type='submit' value='Edit'></p></form>";

$review = $_POST['review'];

$rating = $_POST['rating'];

if ($review != NULL && $rating != NULL) {

$query_active = "UPDATE reviews SET review='$review', rating='$rating' WHERE review_id='$id'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

echo "<p>Text was updated. <a href='reviews.php'>Go back?</a></p>";

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

goread.php

<?php

session_start();

require('includes/connect.php');

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Go read!</title>

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

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<p><a href="index.php"><- Back to home page</a></p>

<div class="wrapper">

<?php

$query = "SELECT * FROM `books` ORDER BY RAND()";

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));

do {

$bookname = $myrow['bookname'];

$author = $myrow['author'];

$genre = $myrow['genre'];

} while ($myrow = mysqli_fetch_array($result));

?>

<h2>I think you should read...</h2>

<h1>«<?php echo "$bookname"; ?>»</h1>

<h3>by <?php echo "$author"; ?></h3>

<h3>Genres: <?php echo "$genre"; ?></h3>

<br>

<h3><a href="goread.php">Get another book!</a></h3>

</div>

</body>

</html>

library.php

<?php

session_start();

require('includes/connect.php');

?>

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>library</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

</head>

<body>

<p><a href="adminpanel.php"><- Back to admin panel</a></p>

<?php

if ($_SESSION['rights'] == 2) {

$query = "SELECT * FROM books";

$result = mysqli_query($connection, $query) or die("Ошибка " . mysqli_error($connection));

if($result) {

$rows = mysqli_num_rows($result);

echo "<table border=1><tr><th> id </th><th> Book name </th><th> Author </th><th> Genres </th></tr>";

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result);

echo "<tr>";

for ($j = 0 ; $j < 4 ; ++$j) echo "<td>$row[$j]</td>";

echo "</tr>";

}

echo "</table>";

}

} else {

echo "You haven't rights to use this page.";

}

?>

</body>

</html>

litnews.php

<?php

session_start();

require('includes/connect.php');

$id = $_GET['id'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Literature news</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<?php

if (isset($_SESSION['username'])) {

include('includes/aheader.php');

} else {

include('includes/header.php');

}

?>

<div class="plot">

<ul>

<a href="index.php"><li class="li_first">Home page</li></a>

<a href="goread.php"><li class="li_reg">What to read?</li></a>

<a href="quotes.php"><li class="li_reg">Quotes</li></a>

<a href="reviews.php"><li class="li_reg">Users' reviews</li></a>

<a href="toffers.php"><li class="li_reg">Trade offers</li></a>

<a href="news.php"><li class="li_last">Literature news</li></a>

</ul>

<br>

<?php

$query = ("SELECT title, text, username, date FROM lit_news WHERE new_id='$id'");

$result = mysqli_query($connection, $query) or die("Ошибка " . mysqli_error($connection));

if($result) {

$rows = mysqli_num_rows($result);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result);

echo "<h2>$row[0]</h2>";

echo "<h5>$row[3]</h5>";

echo "<br>";

echo "<p>$row[1]</p><br>";

$author = $row[2];

}

}

if ($_SESSION['username'] == $author || $_SESSION['rights'] == 2) {

echo "<p><a href='editnews.php?id=$id'>Edit text</a></p>";

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

login.php

<?php

session_start();

require('includes/connect.php');

if (isset($_SESSION['username'])) {

header('Location: index.php');

exit;

}

if (isset($_POST['username']) && isset($_POST['password'])) {

$username = $_POST['username'];

$password = $_POST['password'];

$query = "SELECT * FROM users WHERE username='$username' and password='$password'";

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));

$count = mysqli_num_rows($result);

if ($count == 1) {

$_SESSION['username'] = $username;

$query_active = "UPDATE user_info SET active=1 WHERE username='$username'";

$update_active = mysqli_query($connection, $query_active);

$query = "SELECT * FROM `users` WHERE username='$username'";

$result = mysqli_query($connection, $query, $select_db) or die(mysqli_error($connection));

do{

$_SESSION['id'] = $myrow['id'];

$_SESSION['rights'] = $myrow['rights'];

}while ($myrow = mysqli_fetch_array($result));

header('Location: index.php');

exit;

} else {

$fmsg = "Incorrect login or password. Try again.";

}

}

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Log in!</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="container mlogin">

<div id="login">

<h1>Log in</h1>

<?php

echo $fmsg;

?>

<form action="" id="loginform" method="post" name="loginform">

<p><label for="user_login">Login:<br>

<input class="input" id="username" name="username" size="20" type="text" value=""></label></p>

<p><label for="user_pass">Password:<br>

<input class="input" id="password" name="password" size="20" type="password" value=""></label></p>

<p class="submit"><input class="button" name="login" type= "submit" value="Log in"></p>

<p class="regtext">Haven't an account yet? <a href= "register.php">Create an account</a>!</p>

</form>

</div>

</div>

<?php include('includes/footer.php'); ?>

</body>

</html>

messages.php

<?php

session_start();

require('includes/connect.php');

$u_name = $_SESSION['username'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | <?php echo $_SESSION['username']; ?></title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<div class="plott">

<p><a href="index.php"><- Back to home page</a></p>

<?php

$db_user = 'root';

$db_name = 'booktrade.org';

$db_pass = '';

$db = new PDO('mysql:dbname='.$db_name.'; host=localhost',$db_user,$db_pass);

$db->exec("SET CHARACTER SET utf8");

$sql="select * from messages where u_to=? order by m_id desc";

$sth=$db->prepare($sql);

$sth->bindParam(1,$u_name,PDO::PARAM_INT);

$sth->execute();

$res=$sth->fetchAll(PDO::FETCH_ASSOC);

foreach ($res as $row){

echo '<p>Message No '.$row['m_id'].' From: '.$row['u_from'].' To: '.$row['u_to'].' <a href="read_mes.php?id='.$row['m_id'].'">Open</a>';

if ($row['flag'] != 0) {

echo ' Readed</p>';

} else {

echo " Unread</p>";

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

news.php

<?php

session_start();

require('includes/connect.php');

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Literature news</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<?php

if (isset($_SESSION['username'])) {

include('includes/aheader.php');

} else {

include('includes/header.php');

}

?>

<div class="plot">

<ul>

<a href="index.php"><li class="li_first">Home page</li></a>

<a href="goread.php"><li class="li_reg">What to read?</li></a>

<a href="quotes.php"><li class="li_reg">Quotes</li></a>

<a href="reviews.php"><li class="li_reg">Users' reviews</li></a>

<a href="toffers.php"><li class="li_reg">Trade offers</li></a>

<a href="news.php"><li class="li_last">Literature news</li></a>

</ul>

<br>

<?php

echo "<table align=center border=0px><tr><td><img src='graphics/news.png' width=300px></tr></td></table>";

$query = ('SELECT new_id, title, small_text, date FROM (SELECT * FROM lit_news ORDER BY new_id DESC LIMIT 20) AS T ORDER BY new_id ASC');

$result = mysqli_query($connection, $query) or die("Ошибка " . mysqli_error($connection));

if($result) {

$rows = mysqli_num_rows($result);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result);

echo "<a href='litnews.php?id=$row[0]'><h3>$row[1]</h3></a>";

echo "<h5>$row[3]</h5>";

echo "<p>$row[2]</p>";

echo "<hr><br>";

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

pm.php

<?php

session_start();

require('includes/connect.php');

$to_usr = $_GET['name'];

$from_usr = $_SESSION['username'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | <?php echo $username; ?></title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<div class="plott">

<a href="index.php"><- Back to home page</a>

<?php

if ($_SESSION['username'] != NULL && $_SESSION['rights'] > 0) {

echo "<form action='pm.php' method='post' enctype='multipart/form-data'>

<p>Send to:</p>

<p><input name='to_usr' id='to_usr' value='$to_usr' size='90'></p>

<p>Message text:</p>

<p><textarea name='message' rows='10' cols='91'></textarea></p>

<p><input type='submit' value='Send'></p>

</form>";

$message = htmlspecialchars($_POST['message']);

$to = $_POST['to_usr'];

$db_user='root';

$db_name='booktrade.org';

$db_pass='';

$db = new PDO('mysql:dbname='.$db_name.'; host=localhost',$db_user,$db_pass);

$db->exec("SET CHARACTER SET utf8");

$sql="insert into messages (u_from,u_to,message,flag) values

(:u_from,:u_to,:message,:flag)";

$sth=$db->prepare($sql);

$sth->bindValue(':u_from', $from_usr);

$sth->bindValue(':u_to', $to);

$sth->bindValue(':message', $message);

$sth->bindValue(':flag', 0);

$sth->execute();

$error=$sth->errorInfo();

if($error[0]==0){

echo '<p>Message succesfully sent. Go to <a href="messages.php">your messages</a>.</p>';

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

quotes.php

<?php

session_start();

require('includes/connect.php');

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Quote!</title>

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

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<p><a href="index.php"><- Back to home page</a></p>

<div class="wrapper">

<?php

$query = "SELECT * FROM `quotes` ORDER BY RAND()";

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));

do {

$bookname = $myrow['bookname'];

$text = $myrow['quote_text'];

} while ($myrow = mysqli_fetch_array($result));

$query = "SELECT author FROM `books` WHERE bookname='$bookname'";

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));

do {

$author = $myrow['author'];

} while ($myrow = mysqli_fetch_array($result));

?>

<h1>«<?php echo "$text"; ?>»</h1>

<h3>«<?php echo "$bookname"; ?>» by <?php echo "$author"; ?></h3>

<br>

<h3><a href="quotes.php">Get another quote!</a></h3>

</div>

</body>

</html>

read_mes.php

<?php

session_start();

require('includes/connect.php');

$u_name = $_SESSION['username'];

$id_mess=(int)$_GET['id'];

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | <?php echo $username; ?></title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<div class="plott">

<p><a href="index.php"><- Back to home page</a></p>

<p><a href="messages.php"><- Back to messages list</a></p>

<?php

$db_user = 'root';

$db_name = 'booktrade.org';

$db_pass = '';

$db = new PDO('mysql:dbname='.$db_name.'; host=localhost',$db_user,$db_pass);

$db->exec("SET CHARACTER SET utf8");

$sql="select * from messages where u_to = :u_to and m_id = :id_mess";

$sth=$db->prepare($sql);

$sth->bindParam(':u_to',$u_name,PDO::PARAM_STR);

$sth->bindParam(':id_mess',$id_mess,PDO::PARAM_INT);

$sth->execute();

$res=$sth->fetch(PDO::FETCH_ASSOC);

$sql="update messages set flag = 1 where u_to = :u_to and m_id = :id_mess";

$sth=$db->prepare($sql);

$sth->bindParam(':u_to',$u_name,PDO::PARAM_STR);

$sth->bindParam(':id_mess',$id_mess,PDO::PARAM_INT);

$sth->execute();

if($res['m_id']<>''){

echo '<p>Sent by: '.$res['u_from'].'</p>';

echo '<div>'.$res['message'].'</div>Date: '.$res['data'];

echo '<p><a href="pm.php?name='.$res['u_from'].'">Answer</a></p>';

}else{

echo "Message doesn't exist or was sent to another user.";

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

register.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Registration</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="container mregister">

<div id="login">

<h1>Registration</h1>

<?php

require('includes/connect.php');

if (isset($_POST['username']) && isset($_POST['password'])) {

$username = $_POST['username'];

$email = $_POST['email'];

$password = $_POST['password'];

$query = "INSERT INTO users (username, email, password, rights) VALUES ('$username', '$email', '$password', 1)";

$result = mysqli_query($connection, $query);

if ($result) {

$fullname = $_POST['fullname'];

$age = $_POST['age'];

$location = $_POST['location'];

$userinfo = $_POST['userinfo'];

$active_date = time();

$query_all = "INSERT INTO user_info (username, fullname, age, location, userinfo, active_date) VALUES ('$username', '$fullname', '$age', '$location', '$userinfo', '$active_date')";

$result_all = mysqli_query($connection, $query_all);

$smsg = "Account successfully created";

echo "<a href='login.php' align=center>Log in</a><br><a href='index.php' align=center>Home page</a>";

} else {

$fsmsg = "Account with that name already created.";

}

}

if(isset($smsg)) { ?><div class="alert" role="alert"> <?php echo $smsg; ?> </div> <?php }

if(isset($fsmsg)) { ?><div class="alert" role="alert"> <?php echo $fsmsg; ?> </div> <?php }

?>

<form action="register.php" id="registerform" method="POST" name="registerform">

<p><label for="user_login">Login*:<br>

<input class="input" id="username" name="username" size="32" type="text" placeholder="username" required></label></p>

<p><label for="user_email">E-mail*:<br>

<input class="input" id="email" name="email" size="32" type="email" placeholder="e-mail" required></label></p>

<p><label for="user_pass">Password*:<br>

<input class="input" id="password" name="password" size="32" type="password" placeholder="password" required></label></p>

<p><label for="user_name">Full name:<br>

<input class="input" id="fullname" name="fullname" size="32" type="text" placeholder="full name"></label></p>

<p><label for="user_age">Age:<br>

<input class="input" id="age" name="age" size="32" type="number" min="1" max="130" step="1" placeholder="age"></label></p>

<p><label for="user_location">Location:<br>

<input class="input" id="location" name="location" size="32" type="text" placeholder="location"></label></p>

<p><label for="user_info">Personal info:<br>

<textarea class="input" id="userinfo" name="userinfo" cols="32" rows="5" placeholder="about"></textarea></label></p>

<p class="submit"><input class="button" id="register" name="register" type="submit" value="Register"></p>

<p class="regtext">Have an account? <a href="login.php">Log in</a>!</p>

</form>

</div>

</div>

<?php include('includes/footer.php'); ?>

</body>

</html>

reviews.php

<?php

session_start();

require('includes/connect.php');

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Reviews</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<?php

if (isset($_SESSION['username'])) {

include('includes/aheader.php');

} else {

include('includes/header.php');

}

?>

<div class="plot">

<ul>

<a href="index.php"><li class="li_first">Home page</li></a>

<a href="goread.php"><li class="li_reg">What to read?</li></a>

<a href="quotes.php"><li class="li_reg">Quotes</li></a>

<a href="reviews.php"><li class="li_reg">Users' reviews</li></a>

<a href="toffers.php"><li class="li_reg">Trade offers</li></a>

<a href="news.php"><li class="li_last">Literature news</li></a>

</ul>

<br>

<?php

if ($_SESSION['rights'] > 0) {

echo "<p align='center'><a href='addreview.php'>Add your review!</a></p><br>";

}

echo "<table align=center border=0px><tr><td><img src='graphics/reviews.png' width=400px></tr></td></table>";

$query = "SELECT * FROM `reviews` ORDER BY RAND() LIMIT 10";

$result = mysqli_query($connection, $query) or die;

if($result) {

$rows = mysqli_num_rows($result);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result);

$id = $row[0];

echo "<h4>«$row[1]» by $row[2]</h4>";

echo "<h5><a href='user.php?name=$row[3]'>$row[3]</a></h5>";

echo "<p>$row[4]</p>";

echo "<p align=right>$row[5]/10</p>";

echo "<h5 align='right'>$row[6]</h5>";

$author = $row[3];

if ($_SESSION['username'] == $author || $_SESSION['rights'] == 2) {

echo "<p align=center><a href='editreview.php?id=$id'>Edit review</a></p>";

}

echo "<hr>";

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

toffers.php

<?php

session_start();

require('includes/connect.php');

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | Trade offers</title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<?php

if (isset($_SESSION['username'])) {

include('includes/aheader.php');

} else {

include('includes/header.php');

}

?>

<div class="plot">

<ul>

<a href="index.php"><li class="li_first">Home page</li></a>

<a href="goread.php"><li class="li_reg">What to read?</li></a>

<a href="quotes.php"><li class="li_reg">Quotes</li></a>

<a href="reviews.php"><li class="li_reg">Users' reviews</li></a>

<a href="toffers.php"><li class="li_reg">Trade offers</li></a>

<a href="news.php"><li class="li_last">Literature news</li></a>

</ul>

<br>

<?php

if ($_SESSION['rights'] > 0) {

echo "<p align='center'><a href='addbook.php'>Add your trade offer!</a></p><br>";

}

echo "<table align=center border=0px><tr><td><img src='graphics/trade.png' width=300px></tr></td></table>";

$query = ('SELECT username, bookname, author, trade_info, date FROM (SELECT * FROM w_trade ORDER BY item_id DESC LIMIT 100) AS T ORDER BY item_id ASC');

$result = mysqli_query($connection, $query) or die;

if($result) {

$rows = mysqli_num_rows($result);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result);

$id = $row[0];

echo "<h4>«$row[1]» by $row[2]</h4>";

echo "<p>$row[3]</p>";

echo "<h5 align='right'>$row[4]</h5>";

echo "<h5 align='center'><a href='pm.php?name=$row[0]'>Send mail to $row[0]</a></h5><hr>";

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

user.php

<?php

session_start();

require('includes/connect.php');

$username = $_GET['name'];

if ($username == NULL) {

$username = $_SESSION['username'];

}

$id = $_SESSION['id'];

$query = "SELECT * FROM `user_info` WHERE username='$username'";

$result = mysqli_query($connection, $query, $select_db) or die(mysqli_error($connection));

do {

$fullname = $myrow['fullname'];

$age = $myrow['age'];

$location = $myrow['location'];

$userinfo = $myrow['userinfo'];

$active = $myrow['active'];

} while ($myrow = mysqli_fetch_array($result));

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | <?php echo $username; ?></title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<div class="plott">

<a href="index.php"><- Back to home page</a>

<?php

echo "<p>ID: $id</p>

<p>Username: $username</p>

<p>Full name: $fullname</p>

<p>Age: $age</p>

<p>From $location</p>

<p>$userinfo</p>";

if ($active == 1) {

echo "<p>User is online</p>";

} else {

echo "<p>User is offline</p>";

}

if ($_GET['name'] != $_SESSION['username']) {

echo "<p><a href='pm.php?name=$username'>Private mail</a></p>";

}

if ($_GET['name'] == $_SESSION['username'] && $_SESSION['rights'] != 0) {

echo "<p><a href='addbook.php'>Add book to readed, wanted or trade offers</a></p>";

}

if ($_GET['name'] == $_SESSION['username']) {

echo "<p><a href='useredit.php'>Edit profile</a></p>";

}

echo "<h3 align='center'>$username's trade offers:</h3>";

$query_trade = "SELECT * FROM `w_trade` WHERE username='$username'";

$result_trade = mysqli_query($connection, $query_trade) or die(mysqli_error($connection));

if(isset($result_trade)) {

$rows = mysqli_num_rows($result_trade);

for ($i = 0 ; $i < $rows ; ++$i) {

$row = mysqli_fetch_row($result_trade);

echo "<h4>«$row[2]» by $row[3]</h4><p>$row[4]</p>";

echo "<h5 align='right'>$row[5]</h5>";

if ($username == $_SESSION['username'] || $_SESSION['rights'] == 2) {

echo "<h5 align=center><a href='includes/delete.php?id=$row[0]'>Remove an offer</a></h5>";

}

}

}

echo "<hr><h3 align='center'>$username's wanted books:</h3>";

$query_wanted = "SELECT * FROM `w_read` WHERE username='$username'";

$result_wanted = mysqli_query($connection, $query_wanted) or die(mysqli_error($connection));

if(isset($result_wanted)) {

$rows = mysqli_num_rows($result_wanted);

for ($i = 0 ; $i <= $rows ; ++$i) {

$row = mysqli_fetch_row($result_wanted);

if ($row[0] != NULL) {

echo "<h4>«$row[2]» by $row[3]</h4>";

if ($username == $_SESSION['username'] || $_SESSION['rights'] == 2) {

echo "<h5 align=center><a href='includes/deletew.php?id=$row[0]'>Remove a wanted book</a></h5>";

}

}

}

}

echo "<hr><h3 align='center'>$username's readed books:</h3>";

$query_readed = "SELECT * FROM `readed` WHERE username='$username'";

$result_readed = mysqli_query($connection, $query_readed) or die(mysqli_error($connection));

if(isset($result_readed)) {

$rows = mysqli_num_rows($result_readed);

for ($i = 0 ; $i <= $rows ; ++$i) {

$row = mysqli_fetch_row($result_readed);

if ($row[0] != NULL) {

echo "<h4>«$row[2]» by $row[3]</h4>";

}

}

}

echo "<hr><h3 align='center'>$username's reviews:</h3>";

$query_reviews = "SELECT * FROM `reviews`";

$result_reviews = mysqli_query($connection, $query_reviews) or die(mysqli_error($connection));

if(isset($result_reviews)) {

$rows = mysqli_num_rows($result);

for ($i = 0 ; $i <= $rows ; ++$i) {

$row = mysqli_fetch_row($result_reviews);

if ($row[0] != NULL) {

echo "<h4>«$row[1]» by $row[2]</h4>";

echo "<p>$row[4]</p>";

echo "<p align='right'>$row[5]/10</p>";

echo "<h5 align='right'>$row[6]</h5>";

$author = $row[3];

if ($_SESSION['username'] == $author || $_SESSION['rights'] == 2) {

echo "<p align=center><a href='editreview.php?id=$id'>Edit review</a></p>";

}

} else {

echo "<p>$username didn't add anything to this section yet.</p>";

break;

}

}

}

?>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

useredit.php

<?php

session_start();

require('includes/connect.php');

$username = $_SESSION['username'];

$id = $_SESSION['id'];

$query = "SELECT * FROM `user_info` WHERE username='$username'";

$result = mysqli_query($connection, $query, $select_db) or die(mysqli_error($connection));

do {

$fullname = $myrow['fullname'];

$age = $myrow['age'];

$location = $myrow['location'];

$userinfo = $myrow['userinfo'];

} while ($myrow = mysqli_fetch_array($result));

$cfullname = $_POST['fullname'];

$cage = $_POST['age'];

$clocation = $_POST['location'];

$cuserinfo = $_POST['userinfo'];

if ($cfullname != NULL) {

$query_active = "UPDATE user_info SET fullname='$cfullname' WHERE username='$username'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

}

if ($cage != NULL) {

$query_active = "UPDATE user_info SET age='$cage' WHERE username='$username'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

}

if ($clocation != NULL) {

$query_active = "UPDATE user_info SET location='$clocation' WHERE username='$username'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

}

if ($cuserinfo != NULL) {

$query_active = "UPDATE user_info SET userinfo='$cuserinfo' WHERE username='$username'";

$update_active = mysqli_query($connection, $query_active) or die(mysqli_error($connection));

}

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="utf-8" content="text/html">

<title>BookTrade | <?php echo $username; ?></title>

<link rel="SHORTCUT ICON" href="favicon.ico" type="image/x-icon">

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

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

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

<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

</head>

<body>

<div class="wrapper">

<div class="plott">

<?php

echo "<p>ID: $id</p>

<p>$username</p>

<form action='useredit.php' id='editform' method='POST' name='editform'>

<p>Изменить отображаемое имя:</p>

<p><input class='input' id='fullname' name='fullname' size='32' type='text' placeholder='$fullname'></p>

<p>Возраст:</p>

<p><input class='input' id='age' name='age' size='32' type='number' min='1' max='130' step='1' placeholder='$age'></p>

<p>Место жительства:</p>

<p><input class='input' id='location' name='location' size='32' type='text' placeholder='$location'></p>

<p>Информация о Вас:</p>

<p><textarea class='input' id='userinfo' name='userinfo' cols='50' rows='5' placeholder='$userinfo'></textarea></p>";

?>

<p class="submit"><input class="button" id="admit" name="admit" type="submit" value="OK"></p>

</form>

<p><a href="index.php"><- Back to user page</a></p>

</div>

<?php include('includes/footer.php'); ?>

</div>

</body>

</html>

main.css

body {

background: #efefef;

font-family: 'Open Sans', sans-serif;

color: #777;

}

p {

padding-left: 17px;

padding-right: 10px;

font-family: sans-serif;

}

a {

color: #094b9c;

font-weight: 400;

font-family: sans-serif;

}

.wrapper {

margin: 0 auto 0;

text-align: center;

width: 900px;

}

.plot {

padding: 25px 16px 25px 10px;

font-weight: 400;

overflow: hidden;

height: auto;

background: #fff;

-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.13);

-moz-box-shadow: 0 1px 3px rgba(0,0,0,.13);

box-shadow: 0 1px 3px rgba(0,0,0,.13);

width: 875px;

text-align: justify;

}

goread.css

body {

background: #e5c4ec;

}

.wrapper {

margin: 0 auto 0;

text-align: center;

}

a {

color: #836fa9;

}

h2 {

color: #836fa9;

font-family: New Century Schoolbook, TeX Gyre Schola, serif;

}

h1 {

color: #161616;

text-transform: uppercase;

font-family: DejaVu Sans Mono, monospace;

background: #b39ddb;

}

h3 {

color: #836fa9;

font-family: New Century Schoolbook, TeX Gyre Schola, serif;

}

loginform.css

body {

background: #efefef;

font-family: 'Open Sans', sans-serif;

color: #777;

}

a {

color: #094b9c;

font-weight: 400;

}

span {

font-weight: 300;

color: #094b9c;

}

.mlogin {

margin: 170px auto 0;

}

.mregister {

margin: 80px auto 0;

}

.error {

margin: 40px auto 0;

border: 1px solid #777;

padding: 3px;

color: #fff;

text-align: center;

width: 650px;

background: #094b9c;

}

.regtext {

font-size: 13px;

margin-top: 26px;

color: #777;

}

.container {

padding: 25px 16px 25px 10px;

font-weight: 400;

overflow: hidden;

width: 350px;

height: auto;

background: #fff;

-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.13);

-moz-box-shadow: 0 1px 3px rgba(0,0,0,.13);

box-shadow: 0 1px 3px rgba(0,0,0,.13);

}

/*#welcome {

width: 600px;

padding: 30px;

background: #fff;

margin: 160px auto 0;

-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.13);

-moz-box-shadow: 0 1px 3px rgba(0,0,0,.13);

box-shadow: 0 1px 3px rgba(0,0,0,.13);

}*/

.container h1 {

color: #777;

text-align: center;

font-weight: 300;

border: 1px dashed #777;

margin-top: 13px;

}

.container label {

color: #777;

font-size: 14px;

}

#login {

width: 320px;

margin: auto;

padding-bottom: 15px;

}

.container form .input,.container input[type=text],.container input[type=password],.container input[type=e] {

background: #fbfbfb;

font-size: 24px;

line-height: 1;

width: 100%;

padding: 3px;

margin: 0 6px 5px 0;

outline: none;

border: 1px solid #d9d9d9;

}

.container form .input:focus {

border: 1px solid #094b9c;

-webkit-box-shadow: 0 0 3px 0 rgba(9, 75, 156, 0.75);

-moz-box-shadow: 0 0 3px 0 rgba(9, 75, 156, 0.75);

box-shadow: 0 0 3px 0 rgba(9, 75, 156, 0.75);

}

.button {

border: solid 1px #094b9c;

background: #3986c9;

color: #fff;

height: 30px;

padding: 7px 12px;

float: right;

cursor: pointer;

}

.button:hover {

background: #094b9c;

}

navigation.css

ul {

list-style-type: none;

margin-left: -50px;

text-align: center;

margin-top: -25px;

padding-bottom: 20px;

}

li {

float: left;

height: 30px;

background: #3986c9;

color: #fff;

padding-top: 15px;

border-bottom: 1px solid #094b9c;

}

.li_first {

width: 150px;

border-right: 1px solid #094b9c;

}

.li_reg {

width: 149px;

border-right: 1px solid #094b9c;

}

.li_last {

margin-right: -20px;

width: 151px;

}

li:hover {

background: #094b9c;

color: #efefef;

}

ubody.css

.plott {

padding: 25px 16px 25px 10px;

font-weight: 400;

overflow: hidden;

height: auto;

background: #fff;

-webkit-box-shadow: 0 1px 3px rgba(0,0,0,.13);

-moz-box-shadow: 0 1px 3px rgba(0,0,0,.13);

box-shadow: 0 1px 3px rgba(0,0,0,.13);

width: 675px;

margin-left: 100px;

text-align: justify;

}

uedit.css

.button {

border: solid 1px #094b9c;

background: #3986c9;

color: #fff;

height: 30px;

width: 150px;

padding: 7px 12px;

float: right;

cursor: pointer;

}

.button:hover {

background: #094b9c;

}

input {

background: #fbfbfb;

font-size: 12pt;

line-height: 1;

width: 300px;

padding: 3px;

margin: 0 6px 5px 0;

outline: none;

border: 1px solid #d9d9d9;

}

textarea {

background: #fbfbfb;

font-size: 12pt;

line-height: 1;

width: 300px;

padding: 3px;

margin: 0 6px 5px 0;

outline: none;

border: 1px solid #d9d9d9;

}