Autor Zpráva
glerak
Profil *
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 *
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
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
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 *
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
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
SELECT MIN(ID) FROM tbl WHERE ID > 1234 LIMIT 1
glerak
Profil *
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ů :-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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