Diskuze: Data z DB
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 21 zpráv z 21.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Použiješ PDO a pomocí metod (ted si nevzpomenu, podívej se tady na tutoriály) ti to vrátí asociativní pole.
Například v DB máš sloupec ID - takže v poli máš klíč také ID
Jo, tu metodu jsem právě tady v tutoriálech hledal, ale nedohledal
Teď jsem se díval na metodu PDO fetch assoc, příklad co tam měli:
Kód:
<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();
/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:\n");
$result = $sth->fetchAll();
print_r($result);
?>
Výsledek:
Fetch all of the remaining rows in the result set:
Array
(
[0] => Array
(
[NAME] => pear
[0] => pear
[COLOUR] => green
[1] => green
)
[1] => Array
(
[NAME] => watermelon
[0] => watermelon
[COLOUR] => pink
[1] => pink
)
)
A já bych potřeboval nejlépe
Příkaz
SELECT name, value FROM data
Výsledek
Array
(
[header] => 'hodnota pro header'
[slogan] => 'hodnota pro slogan'
...
)
Můžu to nějak přesvědčit, aby mi to nedělalo pole v poli, ale rovnou
pole, kde budou klíče hodnoty sloupečku name a hodnoty ze sloupečku values?
Omlouvám se, jsem dneska fakt nadmíru natvrdlej a vůbec mi to nemyslí
No, nic, vytahám to z toho pole, nebudu to kombinovat
Sice to jde, ale ne přímo. K PDO se dá přidat Messenger, který ti to pak servíruje dle potřeby.
Jeví se mi to však jako nešťastné řešení. Opravdu to v DB potřebuješ jako EAV?
U jednostránkového webu, kde potřebuji měnit obsah a kde se nebude měnit struktura mi to přijde jako ideální řešení, máš lepší nápad?
Jistě. Může to být jako jeden záznam v tabulce, která bude mít sloupečky "header" a "slogan". Když dáš fetch, tak se ti to rovnou objeví v požadovaném asociativním poli s klíči "header" a "slogan".
Nevím jestli si rozumíme, header a slogan byli jenom pro příklad, dál tam bude halda dalších částí - titulek, description, keywords, pak nadpisy, obsah asi 3 sekcí, patička, ...
Další možností by mohl být soubor INI, který se velmi dobře edituje a načítá se přímo do pole funkcí parse_ini_file(). To pole může být i dvourozměrné.
Velmi dobře se dá použít i XML, které načteš do objektu funkcí simplexml_load_file() a pak se odkazuješ už jen $config->header.
Stejným způsobem můžeš konfiguraci uložit i do JSON a načíst funkcí json_decode().
Také se to dá nacpat do výstupní šablony.
Radši bych to měl v databázi, protože do toho bude vyhazovat data i
herní server
Z tebe to najednou leze...
Tak si nech databázi jak máš a to načtení do pole si udělej v konstruktoru třídy, která ti bude držet konfiguraci a nadefinuješ magickou metodu __get().
Jen je mi divné, proč máš v tabulce to "ID", když primárním klíčem je "name".
Protože jste mi to poradili
// Jinak bych ho tam neměl
On je to takový zvyk, používat ID jako primární klíč. Většinou je to správné řešení, ale v daném případě jsem na pochybách. Už proto, že je použita relační databáze v místě, kde je potřebné KVS. Něco z toho by možná mělo být ve výstupní šabloně (titulek, header, patička). Nadpisy kapitol by měly být u těch kapitol v jiné tabulce, do nastavení to nepatří. Možná je ta tabulka úplně zbytečná.
Numerický primární klíč dávám všemu, IMHO je to dobrá praktika, už jen proto, kdyby se index objevil v cizím klíči. Varchary mají mnohem vyšší režii.
Numerické syntetické ID je dobrou praktikou u vazby relačních tabulek. Jenže klíčem do této tabulky není "ID", ale "name". Podívej se do zadání.
V cizím klíči bych určitě uvedl "header" nebo "slogan". Nevidím důvod, proč by v této tabulce mělo být víc headerů nebo sloganů.
Uvědom si, že pokud máš ID, name a value, porušuješ 3NF, protože sloupec value je závislý nejen na "ID", ale také na "name".
Já jsem to jeho zadání nějak nepochopil, ale kdybych to psal, určitě bych tam ten numerický klíč měl. Spíše mi přijde, že je někde chyba v návrhu, když tam není.
Ano, chyba je v návrhu. To jsem už také psal. Proto je řešení kostrbaté, ať se to udělá jakkoli.
Zobrazeno 21 zpráv z 21.