Autor | Zpráva | ||
---|---|---|---|
glerak Profil * |
#1 · Zasláno: 25. 1. 2011, 23:10:34
Ahoj,
nevím, jestli to popíšu srozumitelně, ale řeším následující problémek. Mám DB s několika tabulkami, dle daných klíčů kombinací dvou z nich vypíšu seznam. (Principiální příklad - v jedné tabulce je 'skoda', 'opel', 'peugeout' a ve druhé '307', '306', 'fabia', 'favorit' ...). Výpis je pak něco ve smyslu: <a href="/auta/skoda-favorit.html">skoda - favorit</a> <a href="/auta/skoda-fabia.html">skoda - fabia</a> <a href="/auta/peugeot-307.html">peugeot - 307</a> <a href="/auta/peugeot-306.html">peugeot - 306</a> ... Ta odkazovaná stránka (/auta/skoda-fabia.html) se generuje z DB, na základě rozparsovaných údajů z textu odkazu. A já na téhle odkazované stránce potřebuji odkaz na předcházející a následující položku z hore uvedeného seznamu... Opět příklad - na stránce 'škoda-fabia' potřebuju odkaz na 'skoda-favorit' a 'peugeot-307'. Rozhodně to nechci předávat v adresním řádku, abych si prznil adresy a mátl vyhledávače (řazení výpisu se mění). Pak mě už ale napadá jenom řešení ze spoustou dotazů na DB (které jsem teda ještě nezkoušel sesmolit). Možná by to šlo nějakým javascriptem (což zatím vůbec neumím, a stránky se bez něj zatím obešly). Může te mi prosím poradit nějaké řešení? Jde mi hlavně o princip, nějaké to konkrétní řešení už bych snad někde našel... Ď. |
||
glerak Profil * |
#2 · Zasláno: 25. 1. 2011, 23:23:39
No, tak jsem ještě trochu googloval, a na dotaz 'php link as a form' jsem našel nějaká řešení právě tím JS. Každopádně zkušenosti / návrhy jsou vítány.
|
||
Chro Profil |
#3 · Zasláno: 26. 1. 2011, 04:09:27
Hledej PHP session. Ve zkratce: jedná se o proměnnou, jejiž hodnotu si server pamatuje při přechodech mezi stránkama a řeší se tak bezestavový HTTP protokol.
|
||
xmark Profil |
#4 · Zasláno: 26. 1. 2011, 10:51:18
Nemyslím si, že by šlo o session, i když jsem na první pohled měl stejný pocit.
Jestli správně koukám, tak glerak potřebuje prostě odkaz na předchozí auto a další auto. Prostě bych si na stránku přidal dva odkazy Předchozí a Další, jejichž adresy můžeš zjistit dvěma selecty. glerak: „Rozhodně to nechci předávat v adresním řádku,“ Proč nechceš předávat adresu v tomto tvaru? <a href="/auta/peugeot-307.html">peugeot - 307</a> |
||
glerak Profil * |
#5 · Zasláno: 26. 1. 2011, 15:22:22
xmark:
Sorry za mystifikaci - ten odkaz je v pohodě (<a href="/auta/peugeot-307.html">peugeot - 307</a>), jen nechci (což mě napadlo jako úplně první) k tomu odkazu přidat ještě informaci o nadcházejícím a předcházejícím (ID1=x, ID2=y). Jenže jsem to celé psal večer, takže můj myšlenkový pochod byl chybný - stejně by mi to bylo k prdu, fungovalo by to pouze pro jednu stránku. Celý ten můj dotaz byla slepá ulička, ale alespoň jsem se zase něco dozvěděl :-) Takže musím hledat pomocí SELECT. Jenže pokud bude výpis uživatelsky seřaditelný, tak bych musel pokaždé vyčíst všechny výsledky a v nich pak najít aktuální, a tím i NEXT/PREV záznam. Pokud bude moci uživatel řazení ovlivnit, tak si asi do session uložím pole s ID položek v seznamu a podle toho pak budu hledat předcházející a následující v DB - abych alespoň trochu omezil dotazy, a ptal se už na známá ID. (Těch položek jsou max. 200 a celkových záznamů do 10000), takže by se sessions nemusel být problém. Pokud to řadit uživatelsky nebudu muset, tak budu možná kešovat celé stránky (nebo jejich části). Jsem teda zatím zvyklý pracovat pouze na DB na free hostingu, u placeného snad nebude takový problém s rychlostí DB. Ale říkám si, že čím méně dotazů, tím lépe. Dík za rady. |
||
xmark Profil |
#6 · Zasláno: 26. 1. 2011, 16:12:07
glerak:
„Takže musím hledat pomocí SELECT. Jenže pokud bude výpis uživatelsky seřaditelný, tak bych musel pokaždé vyčíst všechny výsledky a v nich pak najít aktuální, a tím i NEXT/PREV záznam.“ To rozhodně ne. Řazení si ukládej třeba v cookie a při každém zobrazení auta vytáhni selectem jedno ID vlevo a duhým selectem jedno vpravo. Tři selecty na jedné stránce nejen že nejsou žádný problém, ale naopak jsou mnohem lepší, než kdybys to řešil nějak krkolomně a nepřehledně (stejně nevím jak). Mám pocit, že si to všechno dost komplikuješ. Pokud jde o rychlost databáze, tak přechod z free hostingu tě příjemně překvapí. Kešování stránek.. jestli tě zajímá můj skromný názor, to bych začal zvažovat, kdybych zjistil, že jsem řádově na tisících dotazů za hodinu. |
||
xmark Profil |
#7 · Zasláno: 26. 1. 2011, 16:26:52
SELECT MIN(ID) FROM tbl WHERE ID > 1234 LIMIT 1 |
||
glerak Profil * |
#8 · Zasláno: 26. 1. 2011, 19:12:20
xmark:
Jenom pro představu (příklad s auty byl skutečně jen pro snažší popsání a pochopení). Takhle vypadá můj select prodetail jednoho objektu (v příkladu auto, ve skutečnosti brouk, či jaká to potvora :-) $sql_dotaz = " SELECT hemisphere.text AS hemisphere, subfamily.text AS subfamily, tribus.text AS tribus, genus.text AS genus, species.text AS species, beatle.synonymum AS synonymum, objevitel.text AS objevitel, beatle.rok AS rok_objeveni, beatle.id as beatle_id, beatle.brouk_id as ID FROM hemisphere, subfamily, tribus, genus, species, beatle, objevitel WHERE hemisphere.id = beatle.id_hemisphere AND subfamily.id = beatle.id_subfamily AND tribus.id = beatle.id_tribus AND genus.id = beatle.id_genus AND species.id = beatle.id_species AND objevitel.id = beatle.id_objevitel AND beatle.brouk_id = ( SELECT beatle.brouk_id AS brouk_id FROM beatle, genus, species WHERE beatle.id_species = (SELECT species.id FROM species WHERE species.text = '$_GET[species]') AND beatle.id_genus = (SELECT genus.id FROM genus WHERE genus.text = '$_GET[genus]') AND beatle.id_tribus = (SELECT tribus.id FROM tribus WHERE tribus.text = '$_GET[tribus]') LIMIT 1) AND (beatle.synonymum = 1 OR beatle.synonymum = 0) ORDER BY beatle.synonymum, genus.text, species.text, rok_objeveni ASC "; Dělám to pro kamaráda, a už několikrát se mi vyplatilo řešit věci o kterých tvrdil, že jsou zbytečný. Časem vždycky přijde s "ještě tohleto a ještě támhleto.." :-) Takže chci vymyslet nějakej co nejjednodušší a nejuniverzálnější způsob na next/prev i v případě, že si někdo vyfiltruje a seřadí podle dejme tomu 'objevitel', zatímco jiný třeba podle velikosti vyfoceného exempláře... :-) Ten seznam si teď generuju pomocí, ale počítám s doplněním některých informací z horního dotazu. $sql_dotaz = " SELECT genus.text AS genus, genus.id AS id_genus, species.id AS id_species, species.text AS species, beatle.brouk_id AS id_brouk, (SELECT COUNT(fotky.brouk_id) FROM fotky WHERE fotky.brouk_id = beatle.brouk_id) AS fotky FROM genus, species, beatle WHERE beatle.synonymum = 0 AND beatle.id_tribus = (SELECT tribus.id FROM tribus WHERE tribus.text = '$_GET[tribus]' LIMIT 1) AND beatle.id_genus = genus.id AND beatle.id_species = species.id ORDER BY genus, species ASC "; Problém je, že ve výpisu nejsou ID řazené za sebou. Proto jsem si řekl, že bych si někam uložil výpis do pole, ale jenom ID. Pak bych snadno zjistil svoji pozici v poli (dle aktuálních ID) a získat předchozí a následující už není problém. Teď ale reším, kam si to uložit. Mělo by to být řádově do 10kB, tak mě napadly ty sessions. Dělám to v PHP a MySQL a v obojím jsem ve stádiu objevů :-) |
||
Časová prodleva: 15 let
|
0