Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:30.6.2017 11:11

Zdravím mám takový problém mam jednu tabulku kniha(id, jmeno, rok) a druhou tabulku ctenar(id, jmeno) kdy může knihu číst více ctenaru. Moje stránka by měla vypadat tak, že na úvodní stránce bude formulář kde bude:
textbox - jméno
textbox - rok
a 5x z tabulky ctenar
selectbox - jmeno (jména budou v tabulce pevně danná a můžou se opakovat)
A jsem opravdu ztracený, protože nevím jestli mám tabulky nějak propojit v databázi, dále nevím kam a jak mám ukládat ctenaře...
Jsem v tom opravdu ztracený... děkuju moc za každou pomoc :)

Editováno 30.6.2017 11:12
 
Odpovědět
30.6.2017 11:11
Avatar
Odpovídá na Petr Kasnal
Martin Konečný (pavelco1998):30.6.2017 11:24

Ahoj,

pokud jednu knihu může číst více čtenářů, pak to bude vazba M:N, kdy si uděláš tzv. vazební tabulku:

[kniha_ctenar] (
        id,
        kniha_id,
        ctenar_id
)

Dále popravdě moc nevím, co přesně chceš. Pokud chceš select se čtenáři do formuláře, vyhledáš si všechny čtenáře a v každém tom optionu jako 'value' bude ID čtenáře a jméno uvidíš v tom seznamu.

Nahoru Odpovědět
30.6.2017 11:24
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:30.6.2017 11:39

Díky moc za odpověď.
Můj první problém je, že nevím jak vytvořit vazební tabulku... Musím to v phpmyadmin nějak nastavovat ? propojovat atd ?
A ostatní zkusím vysvětlit lépe:
Budu mít stránku, kde bude formulář ve kterém bude možno zadat: jmeno knihy, rok knihy a poté zde bude 5 selectboxů, kde budou na vyber jmena ctenaru z tabulky ctenar (těchto jmen bude v každém selectboxu 10 a můžou se opakovat) - to znamená, že tabulka user obsahuje 10 jmen
Tady nastává problém, že při odeslání formulář nevím co mám dělat s tima selectboxama, kam je mám ukládat atd..
Druhá část stránky bude už jen pro výpis z databáze - který taky přesně nevím jak províct ale to až déle.. Ted je pro mě hlavní to uložení a propojení tabulek
A jenom mě napadlo nejedná se spíše o 1:N ?

 
Nahoru Odpovědět
30.6.2017 11:39
Avatar
Odpovídá na Petr Kasnal
Martin Konečný (pavelco1998):30.6.2017 11:54

Teoreticky nic víc, než udělat tu vazební tabulku se třemi sloupci, nemusíš, jen je obvykle lepší tomu nastavit i cizí klíče, aby ti tam nevznikl bordel.

V tom kódu bych to řešil tak, že budeš mít klasicky formulář, ve kterém ty selectboxy budou jako pole, tzn.:

// zde si musíš vyhledat ty čtenáře tak, abys měl pole ve tvaru  ID čtenáře => jméno, tzn. třeba
$ctenari = array(
  1 => "Jméno 1",
  2 => "Jméno 2",
  3 => "Jméno 3",
  ...
);

<input type="text" name="nazev_knihy" />
<input type="text" name="rok_knihy" />

// tady si těch pět selectů můžeš vytvořit cyklem, každému z nich pak cyklem uděláš ty optiony
for ($i = 0; $i < 5; $i++) {
        <select name="ctenari[]">

        foreach ($ctenari as $id => $jmeno) {
                <option value="$id">$jmeno</option>
        }

        </select>
}

Tím, že budeš mít selecty jako pole (tzn. v tom name budou na konci ty hranaté závorky), tak to v proměnné $_POST pak dostaneš jako:

$_POST["ctenari"] = array(
        ID z prvního selectu,
        ID z druhého selectu,
        ID z třetího selectu,
        ...
)

No a cílem je, že ten název a rok knihy vložíš (INSERT) do tabulky 'kniha', zjistíš si její ID (databáze umí získat poslední vložené ID, nevím, jaký ovladač používáš), pak projedeš ty čtenáře a vložíš je do té vazební tabulky.

foreach ($_POST["ctenari"] as $id) {
        INSERT INTO kniha_ctenar (kniha_id, ctenar_id)
        VALUES ($knihaId, $id);
}

Popsal jsem to hodně zjednodušeně, snad to z toho nějak pochopíš. Nevím, kam až ses v PHP dostal :D

Nahoru Odpovědět
30.6.2017 11:54
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Petr Kasnal:30.6.2017 12:12

Díky moc vypadá to dobře zkusím to nějak udělat jenom jsem zapomněl říct že to dělám v nette takže se ten kód bude lišit ale nějak to zkusím udělat dííky moc dám vedět :)

 
Nahoru Odpovědět
30.6.2017 12:12
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Petr Kasnal:30.6.2017 13:37

Tk se nepovedlo... Jak dělam v tom Nette tak tam je to trošku jiný a jsem prostě uplně ztracenej...

Editováno 30.6.2017 13:39
 
Nahoru Odpovědět
30.6.2017 13:37
Avatar
Odpovídá na Petr Kasnal
Martin Konečný (pavelco1998):30.6.2017 13:53

Jelikož to asi nebude nic důležitýho, tak nebudu řešit, že tam ten select opakuju ručně 5x.

class HomepagePresenter extends BasePresenter
{

        /** @var Nette\Database\Context @inject */
        public $db;


        public function actionDefault()
        {
                $usersItems = $this->db->table("user")->fetchPairs("id", "name");

                $form = $this["bookForm"];
                $form["user1"]->setItems($usersItems);
                $form["user2"]->setItems($usersItems);
                $form["user3"]->setItems($usersItems);
                $form["user4"]->setItems($usersItems);
                $form["user5"]->setItems($usersItems);
        }



        public function createComponentBookForm()
        {
                $form = new Form();
                $form->addText("bookName", "Název knihy")
                        ->setRequired(TRUE);

                $form->addText("bookYear", "Rok knihy")
                        ->setRequired(TRUE);

                $form->addSelect("user1", "Čtenář 1");
                $form->addSelect("user2", "Čtenář 2");
                $form->addSelect("user3", "Čtenář 3");
                $form->addSelect("user4", "Čtenář 4");
                $form->addSelect("user5", "Čtenář 5");

                $form->addSubmit("submit", "Odeslat");

                $form->onSuccess[] = array($this, "bookFormSubmitted");

                return $form;
        }


        public function bookFormSubmitted(Form $form, $values)
        {
                $book = $this->db->table("book")->insert(array(
                        "name" => $values->bookName,
                        "year" => $values->bookYear
                ));


                // toto 5x to samé, jen s user1,  user2, user3, user4, user5
                $this->db->table("book_user")->insert(array(
                        "book_id" => $book->id,
                        "user_id" => $values->user1
                ));

                $this->db->table("book_user")->insert(array(
                        "book_id" => $book->id,
                        "user_id" => $values->user2
                ));

                // zbylé inserty

                $this->flashMessage("Kniha byla uložena", "success");
                $this->redirect("this");
        }

}


// v šabloně pak stačí jen
{control bookForm}

Zkušení uživatelé mi jistě prominou, že cpu databázi do presenteru a že mám všech pět selectboxů psaných ručně.

Edit:
Toto řešení předpokládá takovou strukturu tabulek:

[book] (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR,
        year VARCHAR / INT -- to je fuk
),

[user] (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR
),

[book_user] (
        id INT PRIMARY KEY AUTO_INCREMENT,
        book_id INT,
        user_id INT
)
Editováno 30.6.2017 13:55
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
30.6.2017 13:53
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Petr Kasnal:30.6.2017 14:29

Strašlivě ti děkuju ! Funguje to ! Fkt moc dík... Kdyby si měl chvilku napsal by si mi prosím jk se ty prvky z tý databáze vypíšou ?

 
Nahoru Odpovědět
30.6.2017 14:29
Avatar
Odpovídá na Petr Kasnal
Martin Konečný (pavelco1998):30.6.2017 14:31

Jak je konkrétně chceš vypsat?

Nahoru Odpovědět
30.6.2017 14:31
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Petr Kasnal:30.6.2017 14:46

Jméno, Rok a Ctenare všechny normálně v tabulce třeba :)

 
Nahoru Odpovědět
30.6.2017 14:46
Avatar
Odpovídá na Petr Kasnal
Martin Konečný (pavelco1998):30.6.2017 14:52

Umíš udělat cizí klíče v těch tabulkách v databázi?

Nahoru Odpovědět
30.6.2017 14:52
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:30.6.2017 15:01

Todle to asi neni že ?

 
Nahoru Odpovědět
30.6.2017 15:01
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Petr Kasnal:30.6.2017 16:39

A omlouvám se nemá tam bejt project_id ale book_id
Udělal jsem to pomocí tohoto příkazu: ALTER TABLE book_user ADD FOREIGN KEY ( book_id ) REFERENCES book (id);

Editováno 30.6.2017 16:41
 
Nahoru Odpovědět
30.6.2017 16:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.