Autor Zpráva
Mortem
Profil
Zdravím mám školní projekt udělat školní knihovku udělal jsem knihy, kde jsem dal obsah z danych knih. Přidal jsem do databaze sloupec "zivotopis" a chtěl bych tam zapsat něco o autorovi atd. Ale jelikož mám pár případů kde autor napsal třebas 2 knihy. Tak se chci zeptat jestli by nějak udělat, aby se mi zobrazil jenom 1x v seznamu autorů, ale zapsal se k oboum knihám.
juriad
Profil
To je samozřejmé, pokud máš správně navrženou databázovou strukturu. Jak vypadá tvá databáze (tabulky, sloupce a jejich datové typy)?

Přečti si první polovinu programujte.com/clanek/2008071900-normalizace-relacnich-databazi.
Mortem
Profil
juriad:
pokud máš správně navrženou databázovou strukturu. Jak vypadá tvá databáze (tabulky, sloupce a jejich datové typy)?


To je moje databáze, kod v php mám napsaný jako normální výpis.
juriad
Profil
Tak to je úplně špatně.

Máš tam mít několik tabulek:
kniha (id INT PK, autor_id INT, zanr_id INT, obsah TEXT, rok_vydani YEAR)
autor (id INT PK, jmeno VARCHAR, zivotopis TEXT)
zanr (id INT PK, nazev VARCHAR)
Přičemž akceptovatelné by ještě bylo nemít tabulku pro žánry, ale rovnou je uvádět v tabulce kniha.

Tabulky potom při SELECTech budeš spojovat pomocí JOINů. Toto zajistí, že všechny údaje budou v databázi právě jednou.
Mortem
Profil
juriad:
Přičemž akceptovatelné by ještě bylo nemít tabulku pro žánry, ale rovnou je uvádět v tabulce kniha.
A mužu se zeptat jak to teda potom propojím? Když si vytvořím tydle tabulky
juriad
Profil
Seznam autorů je zřejmý. Seznam žánrů také. To jsou dotazy z jediné tabulky.

Seznam knih:
SELECT k.*, a.jmeno, z.nazev
FROM kniha k
JOIN autor a ON k.autor_id = a.id
JOIN zanr z ON k.zanr_id = z.id
# můžeš si přidat filtrování třeba podle autora:
# WHERE a.id = 42
# nebo podle žánru:
# WHERE z.id = 3
Mortem
Profil
vytvořil jsem si teda ty dvě tabulky, autor a kniha. Ale mám problem hned s tím autorem přitom to nevypisuje žádnou chybu nebo tak .. Když chci přidat autora. Tak vlastně všechno proběhne v pohodě, až na to že se nepřidá. Předtím mi to tímto způsobem fungovalo bezproblému neví někdo v čem muže byt chyba?

Kod mám takhle


Tabulku takhle


Dobrý příště se lépe podívám chyběl mi tam apostrof :D
juriad
Profil
Mortem:
Nevkládej sem obrázky zdrojáku! Kdo to má číst? V INSERTu ti chybí apostrof. A zapomínáš kontrolovat a escapovat uživatelské vstupy.
Kajman
Profil
Možná bude chtít vyučující přidat jedné knize více autorů nebo žánrů. Pak potřebujete ještě více tabulek.

kniha (id INT PK, obsah TEXT, rok_vydani YEAR)
autor (id INT PK, jmeno VARCHAR, zivotopis TEXT)
zanr (id INT PK, nazev VARCHAR)
kniha_autor (kniha_id INT, autor_id INT)
kniha_zanr (kniha_id INT, zanr_id INT)

A pak stejná kniha může mít opakované vydání v různých rocích (ale může říct vyučujícímu, že může mít i jiný překlad, takže potřebujete jiný obsah).
Mortem
Profil
juriad:
Máš pravdu screenovat kod je blbost omlovám se.

Autori fungujou jak mají teď se dostávám k problemu jak přidat tu knihu aji s autorem do db, nevím jak jak na to.

<?php
$errors = array();
$pom = "1";

if (isset($_POST['pridat'])) {
    
    $nazev = $_POST['nazev'];
    $rok = $_POST['rok'];
    $obsah = $_POST['obsah'];

    if (empty($nazev)) {
        array_push($errors, 'Nazev knihy musí byt vyplněný!');
    }

    if (empty($errors)) {
        $zapis = mysqli_query($con, "INSERT INTO kniha (autor,obsah,rok_vydani,nazev) VALUES ('$obsah','$rok','$nazev');");   
        echo "<p class='hlaska'>Kniha byla úspěšně přidána do DB. <a class='hlaska' href='administrace.php?stranka=Sprava-knih'>Přejít zpět</a></p>";
        echo "<meta http-equiv='refresh' content='1;url=administrace.php?stranka=Sprava-knih'>";
        die();
        $pom = "0";
    }
}




if ($pom == "1") {
?>                

Takhle to mám napsané, ale to je jenom na vložení knihy a já tam chci vybrat i autora třebas ze seznamu rozbalovacího, ale nevím jak jej tam vypsat popř připojit.
juriad
Profil
Takovýto select dokážeš vygenerovat pomocí PHP jednoduchým dotazem do tabulky autorů.
<select name="autor">
<option value="1">Franta</option>
<option value="2">Pepa</option>
...
</select>
Poradím ti, vytvoř si na to funkci.

Při přidávání autora pak už budeš pracovat jen s id autora, zkontroluješ jen, zda id autora existuje v databázi. (Pokud si do databáze přidáš cizí klíče, bude ti databáze pak sama kontrolovat, aby autor skutečně existoval. Ale to je asi příliš pokročilá technika.)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: