Autor Zpráva
sysel
Profil
Prosím o radu: moje PHP stránka pro výběr dat z databáze se postupně rozrůstá a v současnosti obsahuje vlastně tři různé formuláře s dynamickou strukturou (lze přidávat, měnit a ubírat podmínky) a jednu výstupní tabulku. Výstup mě netrápí, je generován vždy čerstvý a pouze na požádání, ale tři různé formuláře bych rád oddělil - zatím jsou hodnoty z nich odesílány najednou - a také bych si rád hodnoty z formulářů na serveru uložil, protože zatím se po uzavření prohlížeče vše zapomene a po novém otevření stránky se vše musí vyklikat od začátku. Zkoušel jsem už i načítání dílčích dat pomocí ajaxu, ale některé věci i zatím stále nefungují.
Na straně serveru vidím jedinou možnost, ukládat data do (postgresql), ale nevím, jaký datatyp bude nejvhodnější. Na výběr mám nejspíš "blob" nebo "varchar" a nejspíš by bylo vhodné PHP array nějak upravit - sbalit. Psql údajně podporuje JSON, ale nemám zkušenosti. Velikost ukládaného formuláře se samozřejmě nedá předem stanovit.
Jest-li, prosím, máte nějaké zkušenosti a rady, rád si je přečtu. Děkuji
Joker
Profil
sysel:
Vhodný databázový typ závisí na tom, jaký typ hodnoty se tam ukládá.
Jestli to je HTML kód, tak asi VARCHAR nebo TEXT.

Ale jestli se formulář sestavuje na základě nějakého nastavení, bylo by asi šikovnější místo kódu formuláře mít v databázi uložené to nastavení a podle něj pak formulář sestavit.
Keeehi
Profil
sysel:
Tak technicky serializovat data do řetězce a ten uložit do jednoho sloupce v databázi jde. Ale správně by se to dělat nemělo. Například proto, že pak můžeš zapomenout na jakékoli filtrování řádků za pomocí hodnot v tom sloupci. Je ale pravda že je to triviální vytvořit.
Druhá možnost je vytvořit v databázi strukturu dostatečně flexibilní na to aby pokryla dynamiku formuláře. Tudíž by to chtělo tabulky forms, form_inputs, responses a response_data.
Řádky v tabulce forms reprezentují jednotlivé typy formulářů. Řádek v tabulce form_inputs reprezentuje jednu otázku z konkrétního formuláře. Samozřejmě má odkaz na ID formuláře kterému patří. Z těchto dvou tabulek jde dynamicky vygenerovat potřebný formulář.
Řádek v tabulce responses představuje jedno odeslání daného formuláře. Má odkaz na ID formuláře kterého se odeslání týkalo. Řádek v tabulce response_data reprezentuje jednu hodnotu políčka odeslaného formuláře. Má odkaz na ID odeslání (tabulka responses) i na ID otázky (tabulka form_inputs).
Ano, není to tak triviální jako nacpat vše do jedné tabulky. Ovšem je to řešení které je udržitelné a je možné ho v budoucnu rozvíjet.

Nicméně, celý ten předchozí text pracuje s variantou, že v době vytváření toho systému, nejsou veškeré položky v těch formulářích předem známé. Pokud je množina otázek předem daná a celá dynamika je jen v tom, že třeba některé otázky se uživateli normálně nezobrazují a zobrazí se jen v případě, že u jiné otázky vybere nějakou danou hodnotu, pak by to mělo jít udělat jako jeden formulář. Bohužel přesněji to popsané moc není, takže těžko usuzovat, co je nejlepší řešení.
sysel
Profil
Za projevenou soustrast děkuji všem, @Keeehi: myslím, že to je nejspíše to správné nakolejení.
Já jsem sem nepsal kód, protože je už dost rozsáhlý. Vpodstatě vytvářím v html pomocí < fieldset >ů čtyči taby, ve třech jsou formuláře s různou strukturou a ve čtvrtém je tabulka na zobrazení výsledků.

Jeden < fieldset > obsahuje tabulku s měnitelným počtem řádek, co řádek to podmínka do WHERE, a na řádku jsou políčka s výběrem sloupce z tabulky, pak možné relace (dle typu sloupce: = > <; je začíná končí obsahuje; před po ) a volně vkládaná srovnávací hodnota. Pak ještě nějaké klientem neovlivnitelné informace jako pořadí atp. Jo a samozřejmě také je-li to podmínka nutná či postačující.

Druhý < fieldset > obsahuje nabídku prefabrikovaných dotazů, které nelze vygenerovat na prvním < fieldsetu >u, jako jsou agregované dotazy a vylučovací podmínky.

Na třetím chystám manipulace s výběrem: výběr uložit, sloučit, odečíst od jiného atd.

Trošku mi to přerůstá přes hlavu, tak jsem rád, že si o tom mám s kým popovídat. Pracuje se nad jednou tabulkou, ale cílem je, aby nad ní mohlo pracovat více klientů. Tabulku nemohou měnit, jen si nad ní vytvářejí vlastní pohled a hledají data dle svých požadavků. Zatím to bylo jen interaktivní bez minulosti. Ale přišel požadavek na možnost přerušení práce, a aby šlo na včerejší práci navázat. Tak se nabízely cookies, ukládání do textových souborů anebo do již otevřené databáze. První dva jsem zavrhnul - halt databáze funguje mnohem pružněji.

Doufám, že se mi podaří oddělit ty formuláře, ale budu muset přidat nějaké tlačítko typu ULOŽ, aby se daná sada proměnných odeslala na server.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0