Diskuze: Data z DB

PHP PHP Data z DB American English version English version

Avatar
Jiří Gracík
Redaktor
Avatar
Jiří Gracík:

Zdravím,

Mám data v tabulce databáze, tabulka má sloupečky id, name a value. Každý řádek je hodnota k dosazení na určité místo na stránce. Zajímá mě, jestli musím poslat dotaz a pak data přetahat cyklem do pole, nebo je na to nějaký spešl fígl. Chci aby výsledné pole vypadalo (nečekaně) takto:

// Pole[name] = value
$data['header'] = 'Moje hlavička';
$data['slogan'] = 'Můj slogan';
...
Editováno 11.9.2013 19:20
Odpovědět 11.9.2013 19:20
Creating websites is awesome till you see the result in another browser ...
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Jiří Gracík
Petr Nymsa:

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 ;)

Nahoru Odpovědět  +4 11.9.2013 19:23
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jiří Gracík:

Jo, tu metodu jsem právě tady v tutoriálech hledal, ale nedohledal :)

Nahoru Odpovědět 11.9.2013 19:31
Creating websites is awesome till you see the result in another browser ...
Avatar
Petr Nymsa
Redaktor
Avatar
Nahoru Odpovědět 11.9.2013 19:32
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jiří Gracík:

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í :D

Nahoru Odpovědět 11.9.2013 19:45
Creating websites is awesome till you see the result in another browser ...
Avatar
Jiří Gracík
Redaktor
Avatar
Jiří Gracík:

No, nic, vytahám to z toho pole, nebudu to kombinovat :D

Nahoru Odpovědět 11.9.2013 20:01
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

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?

Nahoru Odpovědět 11.9.2013 20:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

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?

Nahoru Odpovědět 11.9.2013 20:34
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

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".

Nahoru Odpovědět 11.9.2013 20:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

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, ...

Nahoru Odpovědět 11.9.2013 20:42
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

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_fi­le() 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.

Nahoru Odpovědět 11.9.2013 20:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

Radši bych to měl v databázi, protože do toho bude vyhazovat data i herní server :)

Nahoru Odpovědět 11.9.2013 21:04
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

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().

Nahoru Odpovědět 11.9.2013 21:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

Jen je mi divné, proč máš v tabulce to "ID", když primárním klíčem je "name".

Nahoru Odpovědět 11.9.2013 21:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

Protože jste mi to poradili :D

// Jinak bych ho tam neměl :)

Editováno 11.9.2013 21:17
Nahoru Odpovědět  +1 11.9.2013 21:17
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jiří Gracík
Kit:

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á.

Nahoru Odpovědět 12.9.2013 11:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Kit
Jiří Gracík:

Ještě to promyslím, díky ;)

Nahoru Odpovědět 12.9.2013 11:50
Creating websites is awesome till you see the result in another browser ...
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

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.

Nahoru Odpovědět  +1 12.9.2013 11:58
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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".

Nahoru Odpovědět 12.9.2013 12:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

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í.

Nahoru Odpovědět 12.9.2013 12:34
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Ano, chyba je v návrhu. To jsem už také psal. Proto je řešení kostrbaté, ať se to udělá jakkoli.

Nahoru Odpovědět 12.9.2013 12:53
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 21 zpráv z 21.