MySQL Релация

PHP, MySQL, Javascript, XHTML и др.
Отговори
Потребителски аватар

Автор на темата
hackera457 СОТА
Модератор
Модератор
Мнения: 632
Регистриран: 01 ное 2016, 09:46
Местоположение: София
Получена благодарност: 65 пъти
Години: 24
Контакти:

MySQL Релация

Мнение от hackera457 СОТА » 30 ное 2018, 22:57

В този урок ще ви покажа как да правите връзка между таблиците, тъй като това е полезно много при изработката на системи.

Нека имаме две таблици `lessons_categories` и `lessons`. На картинката виждате двете таблици.
Изображение

Нека да разсъждаваме върху картинката. На нея виждате, че няколко урока могат да са от една и съща категория. Тъй като няма да е много практично да използваме информацията от полето `cat` на таблицата `lesson_categories`, ние ще използваме id-то на категорията. Както е дадено на картинката, връзката между таблиците `lessons` и `lessons_cats` е полето lesson_id от `lessons` и полето id от `lessons_categories`. Ние може да използваме една заявка, за да определи ме кой урок към коя категория спада.
Е нека пристъпим към практическото реализиране:
Да си направим един файл init.php, който ще съдържа връзката към базата данни

Код: Избери всички

<?php
mysql_connect('localhost', 'root', 'parola') or die ('No server!');
mysql_select_db('database') or die ('No database!');
 mysql_query('SET NAMES UTF8');
?>
До тук добре, сега трябва да си създадем таблиците /за примера са добавени примерни категории/

Код: Избери всички

CREATE TABLE `lessons` (
  `id` int(15) NOT NULL auto_increment,
  `title` varchar(200) NOT NULL,
  `lesson` text NOT NULL,
  `lesson_id` int(15) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

-- 
-- Дъмп (схема) на данните в таблицата `lessons`
-- 

INSERT INTO `lessons` VALUES (1, 'Въведение в HTML', 'Моят първи урок за HTML', 1);
INSERT INTO `lessons` VALUES (2, 'Въведение в HTML', 'Моят първи урок за HTML', 1);
INSERT INTO `lessons` VALUES (4, 'Урок по PHP', 'Това е първият урок от серията уроци за PHP', 4);

-- --------------------------------------------------------

-- 
-- Структура на таблица `lessons_categories`
-- 

CREATE TABLE `lessons_categories` (
  `id` int(12) NOT NULL auto_increment,
  `cat` varchar(120) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

-- 
-- Дъмп (схема) на данните в таблицата `lessons_categories`
-- 

INSERT INTO `lessons_categories` VALUES (1, 'HTML');
INSERT INTO `lessons_categories` VALUES (2, 'CSS');
INSERT INTO `lessons_categories` VALUES (3, 'JAVA SCRIPT');
INSERT INTO `lessons_categories` VALUES (4, 'PHP');
INSERT INTO `lessons_categories` VALUES (5, 'MySQL');
Сега да преминем към създаването на логиката, първо ще направим скрипта, с който ще показваме категориите, тях можете да ги показвате като подменю на главното меню или като някакъв box. Ето ви пример как се вадят категориите

Код: Избери всички

    <?php
    include 'init.php';
    $rs = mysql_query('SELECT id,cat FROM  `lessons_categories` ORDER BY id');
    while($row = mysql_fetch_assoc($rs))
    {
      print '<a href="lessons.php?lid='.$row['id'].'">'.$row['cat'].'</a><br />';
    }
    ?>
Резултата трябва да е следния:
Изображение

Сега да създадем файла lessons.php, където ще показваме урока от категорията. За тази цел ние ще ползваме id-то на категорията от таблицата `lessons_categories`, което изкарахме гори при извеждането на списъка с категориите

Създаваме файла lessons.php със следното съдържание:

Код: Избери всички

    <?php
    include 'init.php';
    if(isset($_GET['lid']))
    {
         $lid = (int)$_GET['lid'];
    }

    if($lid >0)
    {
        $rs = mysql_query('SELECT l.title, l.lesson, c.cat FROM  `lessons` AS l INNER JOIN  `lessons_categories` AS c ON l.lesson_id = c.id WHERE l.lesson_id ="'.$lid.'"');
        if(mysql_num_rows($rs) ==0)
        {
            print 'Няма добавени уроци в тази категория!';
        }else{
            while($row = mysql_fetch_assoc($rs))
            {
                print '<article>
                    <h1><a href="readlessons.php?id='.$row['id'].'">'.$row['title'].'</a></h1><hr />
                    <b>Категория: </b>'.$row['cat'].'</div><br>
                    '.$row['lesson'].'<br />
                    </article>';
            }
        }
    }else{
        header('Location: index.php');
        exit;
    }
    ?>
Какво прави кода? В началото си включваме файла init.php, където сме задали връзката към базата данни. Тъй като при отваряне на страницата, в бара на браузера ще видите линк от рода на:

Код: Избери всички

http://sait.com/lesson.php?lid=1
lid служи за идентификатор. Името може да е каквото си пожелаете и може да приема и други типове данни
За да прихванеме стойността на този идентификатор използваме $_GET. Правим проверка ЗАДЪЛЖИТЕЛНО дали е въобще подаваме нещо през $_GET. Ако e сетната $_GET['lid'] указваме, че подадените стойности ще са само числа /прави се с цел сигурност, но това е друга тема/. След това проверяваме дали стойността е по-голяма от 0. Ако стойността е нула ние нямаме такава категория и следователно чрез хедърите връщаме потребителя в главната страница, ако е по-голяма стойността от 0 то тогава правим заявка, за да извадим съдържанието на съответния урок от категорията. За целта ще използваме в заявката едно животно INNER JOIN. Какво прави INNER JOIN? Най-просто INNER JOIN избира записите, чийто стойности съвпаднат в двете таблици.Ако стойността на поле от таблица 1 съвпадне със стойността от таблица 2 се изкарва резултата.След като е изпълнена заявката правим проверка дали са върнати записи. Ако има върнати записи вадим заглавието, категорията и съдържанието на всички уроци публикувани в съответната категория като можете да използвате substr() за да не показва целия текст от урока, а само част от него.
Резултата от изпълнението на кода трябва да е:
Изображение
Както споменах по-горе ако няма зададена стойност на идентификатора lid, то потребителя ще бъде пренасочен към index.php /може към друга страница, това вие решавате/. В този файл ще се съдържа както менюто с категориите както и ще вади няколко урока от различните категории или пък всичките уроци като можете да добавите и странициране. Отново ще използваме INNER JOIN
Скрипта би могъл да се реализира така:

Код: Избери всички

<?php
include 'init.php';
$rs =mysql_query('SELECT l.id,l.title, l.lesson, c.cat FROM  `lessons` AS l INNER JOIN  `lessons_categories` AS c ON l.lesson_id = c.id');
if(mysql_num_rows($rs) ==0)
{
    print 'Няма добавени уроци!';
}else{
    while($row = mysql_fetch_assoc($rs))
    {
        print '<article>
        <h1><a href="readlessons.php?id='.$row['id'].'">'.$row['title'].'</a></h1><hr />
        <b>Категория: </b>'.$row['cat'].'</div><br>
        '.$row['lesson'].'<br />
        </article>';
    }
} 
Какво прави този скрит? Ами прави заявка, ако заявката не върне резултат вади грешка, че няма добавени уроци, а ако има - вади всички уроци
И резултата трябва да бъде:
Изображение
Предполагам, че забелязахте подчертаното в синьо заглавие, това е линк, към страницата, където ще прегледаме целия урок.
И накрая остана да създадем последния файл, а именно страницата, където потребителя ще може да прочете урока.
Създаваме файла readlesson.php
Отново имаме идентификатор в лентата на браузера, абсолютно идентично с кода от lessons.php. Ето как би изглеждал скрипта във файла readlesson.php:

Код: Избери всички

    <?php
    include 'init.php';

    if(isset($_GET['id']))
    {
        $id = (int)$_GET['id'];
    }

    if($id >0)
    {
        $rs = mysql_query('SELECT l.title, l.lesson, c.cat FROM  `lessons` AS l INNER JOIN  `lessons_categories` AS c ON l.lesson_id = c.id WHERE l.id ="'.$id.'"');
        if(mysql_num_rows($rs) ==0)
        {
            print 'Няма добавени уроци в тази категория!';
            }else{
            while($row = mysql_fetch_assoc($rs))
            {
                print '<article>
                <h2>'.$row['title'].'</h2><hr />
                <b>Категория: </b>'.$row['cat'].'</div><br>
                '.$row['lesson'].'<br />
                </article>';
            }
        }
        }else{
        header('Location: index.php');
        exit;
    }
    ?>
И резултата ще е следния
Изображение

Това е просто пример как биха могли да се използва релацията /връзка/ между таблиците. Не е кой знае каква философия

Урока е писан лично от мен и забранявам копирането му без мое знание
Моите плъгини

Код: Избери всички

#include <hambeer>

RegisterHamBeer(HamBeer_Spawn, "player", "GivePlayerBeer", 1);

public GivePlayerBeer(Pl){
    if(!is_user_alive(Pl)){
        ham_give_beer(Pl, 5)
        client_print(Pl, print_chat, "Go Go Go"){
}  


Потребителски аватар

Bupyc Conficke
Рекламатор
Рекламатор
Мнения: 49
Регистриран: 13 яну 2017, 01:17
Местоположение: Перник
Се отблагодари: 4 пъти
Получена благодарност: 2 пъти
Години: 31
Контакти:

MySQL Релация

Мнение от Bupyc Conficke » 09 дек 2018, 19:39

Здравейте, виждам ,че урока е сравнително нов и искам да попитам не е ли по добре да се използва mysqli?
Всичко за вашият сайт на едно място
Изображение
Изработка на сайт/форум напълно безплатно

Потребителски аватар

Автор на темата
hackera457 СОТА
Модератор
Модератор
Мнения: 632
Регистриран: 01 ное 2016, 09:46
Местоположение: София
Получена благодарност: 65 пъти
Години: 24
Контакти:

MySQL Релация

Мнение от hackera457 СОТА » 09 дек 2018, 20:41

Попринцип урока е с цел да се схване принципа на MySQL релацията, а не кой драйвер да се използва. Естествено, че в новите версии MySQL драйвера е вече DEPRECATED и трябва да се мигрира към MySQLi или PDO
Моите плъгини

Код: Избери всички

#include <hambeer>

RegisterHamBeer(HamBeer_Spawn, "player", "GivePlayerBeer", 1);

public GivePlayerBeer(Pl){
    if(!is_user_alive(Pl)){
        ham_give_beer(Pl, 5)
        client_print(Pl, print_chat, "Go Go Go"){
}  


Отговори

Върни се в “Уеб Програмиране”

Кой е на линия

Потребители, разглеждащи този форум: Няма регистрирани потребители и 2 госта