
- •Оглавление
- •Постановка задачі
- •Мета створення
- •Призначення системи
- •Вимоги до програми
- •Програмно-технічні засоби
- •Анотація
- •Структура об’єктів і зв’язків предметної області
- •Опис структури проекту
- •Керівництво користувача
- •Основна інформація
- •Головна сторінка
- •Сторінка з таблицею менеджерів
- •Сторінка з таблицею товарів
- •Сторінка з таблицею складу
- •Сторінка користувачів сайту
- •Сторінка покупців
- •Сторінка попередніх замовлень
- •Сторінка замовлень
- •Сторінка зі списком товарів для покупки
- •Сторінка з інформацією про товар
- •Код MySql
- •Створення резервної копії бази даних.
- •Висновок
- •Використана література
- •Додаток
- •Сторінки рhp програми де використовуються sql запити.
Сторінка замовлень
Дана сторінка містить інформацію про замовлення та кнопки редагування і видалення записів. Вона представлена на рис 5.9.1
Рисунок 5.9.1.
В цій таблиці також відображається ціна замовлення, яка розраховується як ціна товару помножена на замовлену кількість. Перед тим як змінити статус оплати, необхідно вказати, що товар відправлений, ввівши у відповідне поле 1. Статус оплати може бути або “credit”, або “cash”, або “canceled”. При введенні одного з двох перших значень, кількість успішних угод менеджера автоматично збільшується, а останнього – кількість невдалих угод.
Сторінка зі списком товарів для покупки
Дана сторінка представлена на рис. 5.10.1.
Рисунок 5.10.1.
Вона містить список товарів у зручній для покупця формі, де вказані код товару, назва, картинка, короткий опис, наявність на складі та ціна. У лівій частині відображений список фірм, по натиску на якусь із них відбудеться фільтрований по цій фірмі вивід товарів. Також присутня кнопка купити, після натиску на яку відкривається сторінка з формою для введення особистих даних користувача, яка представлена на рис. 5.10.2.
Рисунок 5.10.2.
Якщо користувач був залогінений в систему – то його дані автоматично будуть занесені в цю форму і він може при бажанні редагувати їх чи просто підтвердити. Після чого виведеться відповідне повідомлення про успішну покупку товару. Якщо ж покупець натиснув не на кнопку купити, а на гіперпосилання у вигляді назви товару – то йому відкриється сторінка з детальною інформацією про товар.
Сторінка з інформацією про товар
Дана сторінка представлена на рис. 5.11.1. Вона додатково містить блок для виводу додаткових даних про товар, таку як повний опис або характеристику товару, та кнопки для вибору яку саме інформацію виводити.
Рисунок 5.11.1
Код MySql
//#Створення бази даних інтернет магазину.
//#Створення бази даних інтернет магазину.
CREATE DATABASE internet_shop DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
//#Створення користувачів різних типів магазину.
CREATE USER 'shop_admin'@'%' IDENTIFIED BY 'administrator';
CREATE USER 'guest'@'%' IDENTIFIED BY 'g';
CREATE USER 'user'@'%' IDENTIFIED BY 'u';
CREATE USER 'maneger'@'%' IDENTIFIED BY 'm';
//#Надання користувачам прав на базу даних інтернет магазину.
GRANT ALL PRIVILEGES ON internet_shop.* TO 'shop_admin'@'%' WITH GRANT OPTION;
GRANT INSERT,SELECT ON internet_shop.user TO 'guest'@'%';
GRANT INSERT,SELECT ON internet_shop.customer TO 'guest'@'%';
GRANT SELECT ON internet_shop.product TO 'guest'@'%';
GRANT SELECT ON internet_shop.storage_item TO 'guest'@'%';
GRANT INSERT ON internet_shop.preorder TO 'guest'@'%';
GRANT SELECT ON internet_shop.user TO 'user'@'%';
GRANT INSERT ON internet_shop.preorder TO 'user'@'%';
GRANT SELECT ON internet_shop.customer TO 'user'@'%';
GRANT SELECT ON internet_shop.storage_item TO 'user'@'%';
GRANT SELECT ON internet_shop.product TO 'user'@'%';
GRANT SELECT ON internet_shop.product TO 'maneger'@'%';
GRANT SELECT ON internet_shop.storage_item TO 'maneger'@'%';
GRANT SELECT ON internet_shop.maneger TO 'maneger'@'%';
GRANT SELECT,INSERT,UPDATE,DELETE ON internet_shop.customer TO 'maneger'@'%';
GRANT SELECT,INSERT,UPDATE,DELETE ON internet_shop.order TO 'maneger'@'%';
GRANT SELECT,INSERT,UPDATE,DELETE ON internet_shop.preorder TO 'maneger'@'%';
GRANT EXECUTE ON *.* TO 'maneger'@'%';
//#Створення таблиці покупців
CREATE TABLE internet_shop.customer (
customer_id INT(5) AUTO_INCREMENT,
lastname VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
contact_phone VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
adress VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY(customer_id)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
//#Створення індексу для таблиці покупців на поле прізвище покупця.
CREATE INDEX cus_fullname_index ON internet_shop.customer(lastname,`name`);
//#Створення таблиці менеджерів
CREATE TABLE internet_shop.maneger (
maneger_id INT(5) AUTO_INCREMENT,
fullname VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
succes_orders INT(5) DEFAULT 0,
canceled_orders INT(5) DEFAULT 0,
rate INT(3) DEFAULT 0,
PRIMARY KEY(maneger_id)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
//#Створення таблиці товарів. Ієрархічна таблиця, де первинний батько - клас товару, далі вид товару, фірма виробник і кінцевий нащодок - назва самого товару.
//#Наприклад: Комп'ютери - ноутбуки - Asus - Eee PC 1011PX-VLK018W.
CREATE TABLE internet_shop.product(
product_id INT(5) AUTO_INCREMENT,
father_id INT(5),
title VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
picture BLOB,
small_description TINYTEXT CHARACTER SET utf8 COLLATE utf8_general_ci,
full_description TEXT CHARACTER SET utf8 COLLATE utf8_general_ci,
characteristic TEXT CHARACTER SET utf8 COLLATE utf8_general_ci,
PRIMARY KEY(product_id)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
//#Створення індексу для таблиці товарів на поле назву товару.
CREATE INDEX product_title_index ON internet_shop.product(title);
//#Створення таблиці складу для збереження товарів на складі та їх кількості
CREATE TABLE internet_shop.storage_item(
storage_item_id INT(5) AUTO_INCREMENT,
product_id INT(5),
arrival_date DATE,
product_number int(3),
price FLOAT,
PRIMARY KEY(storage_item_id),
FOREIGN KEY (product_id) REFERENCES internet_shop.product(product_id)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
//#Таблиця попередніх замовлень
CREATE TABLE internet_shop.preorder(
preorder_id INT(5) AUTO_INCREMENT,
customer_id INT(5),
lastname VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
contact_phone VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
adress VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
storage_item_id INT(5),
product_number INT(5) DEFAULT 1,
PRIMARY KEY(preorder_id),
FOREIGN KEY (storage_item_id) REFERENCES internet_shop.storage_item(storage_item_id)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
//#Таблиця замовлень.
CREATE TABLE internet_shop.order(
order_id INT(5) AUTO_INCREMENT,
storage_item_id INT(5),
maneger_id INT(5),
customer_id INT(5),
sent TINYINT(1) DEFAULT 0,
product_number INT(5) DEFAULT 1,
payment VARCHAR(8) CHARACTER SET utf8 COLLATE utf8_general_ci,
price FLOAT,
PRIMARY KEY(order_id),
FOREIGN KEY (storage_item_id) REFERENCES internet_shop.storage_item(storage_item_id),
FOREIGN KEY (maneger_id) REFERENCES internet_shop.maneger(maneger_id),
FOREIGN KEY (customer_id) REFERENCES internet_shop.customer(customer_id)
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
//#Таблиця логінів та паролей користувачів
CREATE TABLE internet_shop.user(
user_id INT(5),
login VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
password VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
status VARCHAR(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;
#Процедура для наступної функції (динамічні твердження не дозволяються у функціях та триггерах).
CREATE PROCEDURE(IN login_var VARCHAR(50), OUT )
#Функція для перевірки наявності запису з вказаним логіном в таблиці користувачів
DELIMITER //
CREATE FUNCTION internet_shop.check_login(login_var VARCHAR(50)) RETURNS TINYINT(1)
BEGIN
DECLARE existence TINYINT(1);
SET @login_var = login_var;
SET @s = 'SELECT customer_id INTO ? WHERE EXIST(SELECT user_id FROM internet_shop.user WHERE login=?)';
PREPARE stmt FROM @s;
EXECUTE stmt USING @existence,@login_var;
SET existence = @existence;
RETURN existence;
END//
DELIMITER ;
//#Процедура додавання нового менеджера з обробкою виключення щодо пустого поля імені
DROP PROCEDURE internet_shop.add_maneger;
DELIMITER //
CREATE PROCEDURE internet_shop.add_maneger(IN name VARCHAR(50))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET @message = 'Пусте поле імені!';
END;
INSERT INTO internet_shop.maneger(fullname) VALUES (name);
SET @message = 'Процедура виконалась успішно.';
END//
DELIMITER ;
CALL internet_shop.add_maneger(NULL);
SELECT @message;
//#Процедура для реалізації наступного тригеру для INSERT та UPDATE.
DROP PROCEDURE internet_shop.father_field_procedure;
DELIMITER //
CREATE PROCEDURE internet_shop.father_field_procedure(IN new_father_id INT(5))
BEGIN
DECLARE some_product_number INT(5);
DECLARE no_parrent CONDITION FOR SQLSTATE '23000';
DECLARE existence TINYINT(1) DEFAULT 0;
DECLARE id INT(5);
DECLARE done INT DEFAULT 0;
DECLARE ids CURSOR FOR SELECT product_id FROM internet_shop.product;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DECLARE EXIT HANDLER FOR no_parrent
BEGIN
SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Відсутній клас товару з вказаним кодом!';
END;
IF new_father_id != 0 THEN
OPEN ids;
REPEAT
FETCH ids INTO id;
IF id = new_father_id THEN
SET existence = 1;
END IF;
UNTIL done END REPEAT;
CLOSE ids;
ELSE
SET existence = 1;
END IF;
IF existence = 0 THEN
SIGNAL no_parrent;
END IF;
END//
DELIMITER ;
#//Тринер для перевірки батьківського поля у таблиці товарів, при додаванні чи зміні запису
DROP TRIGGER internet_shop.father_field_trigger;
DELIMITER //
CREATE TRIGGER internet_shop.father_field_trigger_ins BEFORE INSERT ON internet_shop.product
FOR EACH ROW
BEGIN
CALL internet_shop.father_field_procedure(new.father_id);
END//
DELIMITER ;
DELIMITER //
CREATE TRIGGER internet_shop.father_field_trigger_upd BEFORE UPDATE ON internet_shop.product
FOR EACH ROW
BEGIN
CALL internet_shop.father_field_procedure(new.father_id);
END//
DELIMITER ;
INSERT INTO internet_shop.product(father_id,title) values(15,'asdfg');
SELECT * FROM log;
#Тригер для перевірки правильного встановлення віх значень в полях таблиці замовлень до оновлення
#ISNULL(var) ~ var IS NULL
INSERT INTO internet_shop.orders(storage_item_id,maneger_id,customer_id,sent,price) VALUES(1,1,1,1,30);
INSERT INTO internet_shop.orders(storage_item_id,customer_id,sent,price) VALUES(2,2,2,10);
UPDATE internet_shop.orders SET payment = 'cash' WHERE order_id = 1;
UPDATE internet_shop.orders SET payment = 'canceled' WHERE order_id = 2;
UPDATE internet_shop.orders SET price = 40, maneger_id = 2 WHERE order_id = 2;
DROP TRIGGER internet_shop.check_order_trigger;
DELIMITER //
CREATE TRIGGER internet_shop.check_order_trigger BEFORE UPDATE ON internet_shop.order
FOR EACH ROW
BEGIN
DECLARE correct INT(2) DEFAULT 0;
IF STRCMP(new.payment,old.payment) != 0 THEN
IF ISNULL(old.order_id) THEN
SET correct = 1;
ELSEIF ISNULL(old.storage_item_id) THEN
SET correct = 2;
ELSEIF ISNULL(old.maneger_id) THEN
SET correct = 3;
ELSEIF ISNULL(old.customer_id) THEN
SET correct = 4;
ELSEIF ISNULL(old.sent) AND old.sent=0 THEN
SET correct = 5;
ELSEIF ISNULL(old.product_number) AND old.product_number<1 THEN
SET correct = 6;
ELSEIF ISNULL(old.price) AND old.price<1 THEN
SET correct = 7;
END IF;
CASE correct
WHEN 1 THEN SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Введіть дані в поле коду корзини покупця!';
WHEN 2 THEN SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Введіть дані в поле коду товару!';
WHEN 3 THEN SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Введіть дані в поле коду менеджера!';
WHEN 4 THEN SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Введіть дані в поле коду покупця!';
WHEN 5 THEN SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Для встановлення оплати товар має дути надісланим!';
WHEN 6 THEN SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Введіть кількість товарів, яка має бути більшою за 1!';
WHEN 7 THEN SIGNAL SQLSTATE '42000' SET MESSAGE_TEXT = 'Введіть коректну ціну!';
ELSE SET @message="Оновлення інформації виконалось успішно.";
END CASE;
END IF;
END//
DELIMITER ;
#Тригер для підвищення кількості вдалих або ні угод менеджера та зменшення кількості товарів на складі після покупки
DROP TRIGGER internet_shop.maneger_deals_trigger;
DELIMITER //
CREATE TRIGGER internet_shop.maneger_deals_trigger AFTER UPDATE ON internet_shop.order
FOR EACH ROW
BEGIN
DECLARE correct TINYINT(1) DEFAULT 0;
IF new.payment IS NOT NULL THEN
IF STRCMP(new.payment,'cash') = 0 OR STRCMP(new.payment,'credit') = 0 THEN
UPDATE internet_shop.maneger SET succes_orders = succes_orders + 1 WHERE maneger_id=new.maneger_id;
UPDATE internet_shop.storage_item SET product_number=new.product_number WHERE storage_item_id=new.storage_item_id;
ELSEIF STRCMP(new.payment,'canceled') = 0 THEN
UPDATE internet_shop.maneger SET canceled_orders = canceled_orders + 1 WHERE maneger_id=new.maneger_id;
ELSE
SET correct = 1;
END IF;
END IF;
IF correct = 1 THEN
SET @message = 'Введене значення в поле платні некоректне!';
END IF;
END//
DELIMITER ;
#Тригер для розрахування вартості товару
DROP TRIGGER internet_shop.price_count;
DELIMITER //
CREATE TRIGGER internet_shop.price_count BEFORE INSERT ON internet_shop.order
FOR EACH ROW
BEGIN
DECLARE price_var INT(5);
DECLARE product_number_var INT(5);
SELECT price, product_number INTO price_var, product_number_var FROM internet_shop.storage_item WHERE storage_item_id = new.storage_item_id;
SET new.price = price_var*product_number_var;
END//
DELIMITER ;
#Процедура для автоматичного додавання користувача.
DROP PROCEDURE internet_shop.auto_add_customer;
DELIMITER //
CREATE PROCEDURE internet_shop.auto_add_customer(IN lastname_var VARCHAR(50), IN name_var VARCHAR(50), IN contact_phone_var INT(10), adress_var VARCHAR(50))
BEGIN
SET @s = 'INSERT INTO internet_shop.customer(lastname,`name`,contact_phone,adress) values(?,?,?,?)';
PREPARE stmt FROM @s;
SET @lastname_var = lastname_var;
SET @name_var = name_var;
SET @contact_phone_var = contact_phone_var;
SET @adress_var = adress_var;
EXECUTE stmt USING @lastname_var,@name_var,@contact_phone_var,@adress_var;
END//
DELIMITER ;
CALL internet_shop.auto_add_customer('Івічук','Семен','вул. Артема 7 кв.15',0445456784);
#Процедура для автоматичного оновлення даних користувача.
DROP PROCEDURE internet_shop.auto_update_customer;
DELIMITER //
CREATE PROCEDURE internet_shop.auto_update_customer(IN customer_id_var INT(5),IN lastname_var VARCHAR(50), IN name_var VARCHAR(50), IN contact_phone_var INT(10), adress_var VARCHAR(50))
BEGIN
SET @s = 'UPDATE internet_shop.customer SET lastname = ?,`name`=?,contact_phone = ?,adress = ? WHERE customer_id = ?';
PREPARE stmt FROM @s;
SET @lastname_var = lastname_var;
SET @name_var = name_var;
SET @contact_phone_var = contact_phone_var;
SET @adress_var = adress_var;
SET @customer_id_var = customer_id_var;
EXECUTE stmt USING @lastname_var,@name_var,@contact_phone_var,@adress_var,@customer_id_var;
END//
DELIMITER ;
CALL internet_shop.auto_update_customer(2,'Smith','John',888888,'work');
#Процедура для автоматичного додавання замовлень.
DROP PROCEDURE internet_shop.auto_add_order;
DELIMITER //
CREATE PROCEDURE internet_shop.auto_add_order(IN maneger_id_var INT(5),IN customer_id_var INT(5), IN storage_item_id_var INT(5), IN product_number_var INT(5))
BEGIN
SET @s = 'INSERT INTO internet_shop.order(maneger_id,customer_id, storage_item_id,product_number) values(?,?,?,?)';
PREPARE stmt FROM @s;
SET @maneger_id_var = maneger_id_var;
SET @customer_id_var = customer_id_var;
SET @storage_item_id_var = storage_item_id_var;
SET @product_number_var = product_number_var;
EXECUTE stmt USING @maneger_id_var,@customer_id_var,@storage_item_id_var,@product_number_var;
END//
DELIMITER ;
#Функція для підрахунку рейтингу за кількістю вдалих та невдалих угод.
DELIMITER //
CREATE FUNCTION count_rate(succes INT(5),canceled INT(5),avg_succes INT(5),avg_canceled INT(5))
RETURNS INT(5)
DETERMINISTIC
BEGIN
DECLARE rate INT(5);
SET rate = succes - avg_succes - canceled + avg_canceled;
RETURN rate;
END//
DELIMITER ;
#Процедура для автоматичного розрахунку рейтингу менеджера.
DROP PROCEDURE internet_shop.auto_maneger_rate;
DELIMITER //
CREATE PROCEDURE internet_shop.auto_maneger_rate()
BEGIN
DECLARE rate INT(5);
DECLARE avg_succes INT(5);
DECLARE avg_canceled INT(5);
DECLARE id INT(5);
DECLARE succes INT(5);
DECLARE canceled INT(5);
DECLARE done INT DEFAULT 0;
DECLARE meneg CURSOR FOR SELECT maneger_id,2*succes_orders,2*canceled_orders FROM internet_shop.maneger;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
SET @s = 'UPDATE internet_shop.maneger SET rate = ? WHERE maneger_id = ?';
PREPARE stmt FROM @s;
SELECT AVG(succes_orders) INTO avg_succes FROM internet_shop.maneger;
SELECT AVG(canceled_orders) INTO avg_canceled FROM internet_shop.maneger;
OPEN meneg;
REPEAT
FETCH meneg INTO id,succes,canceled;
SELECT count_rate(succes,canceled,avg_succes,avg_canceled) INTO rate;
SET @rate = rate;
SET @id = id;
EXECUTE stmt USING @rate,@id;
UNTIL done END REPEAT;
CLOSE meneg;
END//
DELIMITER ;
CALL internet_shop.auto_maneger_rate();
#Процедура обнулення вдалих та невдалиг угод менеджера
DELIMITER //
CREATE PROCEDURE internet_shop.auto_null_deals()
BEGIN
UPDATE internet_shop.maneger SET succes_orders = 0, canceled_orders = 0;
END//
DELIMITER ;
CALL internet_shop.auto_null_deals();