« 1 2 »
Autor Zpráva
Duchaplny
Profil
Zdravím,

zaujímalo by ma, ako sa riešia unikátne (dočasné) url, save a load v php. Potrebujem niečo fakt spoľahlivé, čo by si pamätalo, kde užívateľ skončil aj keby len zatvoril prehliadač. Budem rád, ak sa vyjadríte (ako to riešiť - funkcie, premenné, cykly), potrebujem názor/nápad.

Príklad:
Na stránke je pre prihlásených užívateľov článok, ktorý má 14 strán - každá strana (okrem prvej) by mala mať unikátnu (dočasnú) url, aby nikto nemohol skákať medzi článkami. Prihlásený užívateľ prečíta 5 strán a odhlási sa/vypne prehliadač - v oboch prípadoch ho to pri ďalšej návšteve vráti do menu (url, ktoré navštívil naposledy prestalo existovať a script ho presmeroval do menu). Neskôr sa vráti a v menu má možnosti "pokračovať", "čítať odznova". U možnosti "čítať odznova" stačí zadať link, ktorý ho hodí na prvú stranu článku, ale ako sa prosím Vás rieši možnosť "pokračovať" ?
Moderátor Alphard: Smazáno [PHP] z názvu. V kategorii PHP není třeba dále zdůrazňovat, že jde o PHP.
tiso
Profil
Duchaplny: čítal som to 2x ale stále som nepochopil čo chceš…
Duchaplny
Profil
tiso: a to som to asi 15 minút upravoval, aby to bolo zrozumiteľné..

tak ešte raz a trochu podrobnejšie.. klasická stránka, kde sa registruje a následne logne užívateľ. Potom si v menu klikne na články, vyberie si článok a hodí mu to stranu 1. Pri kliku na stranu 2 by to nemalo hodiť url typu "main.php?page=strana2" ale proste nejaký hash, ktorý bude platiť len určitú dobu. Ide o to aby nepredvídal, že po "page=strana2" pôjde "page=strana3" a tým pádom sa nedostane na ďalšiu stranu skôr než klikne na odkaz "strana 3".

- bod 1: šifrované url, najlepšie dočasné, keby šlo. Po kliknutí na stranu 3, url zo strany 2 prestane existovať, resp. sa tam už nesmie dostať znovu na tú predchádzajúcu stranu. Jedine, ak by začal článok čítať odznovu
- Nemusí byť riešené priamo cez url, môže byť aj iné riešenie, podmienkou je, aby sa už nedostal na predchádzajúcu stranu a aby nevedel predvídať ďalšie, ktoré sú v poradí.

Prečíta 5 strán a vypne prehliadač alebo sa odloguje. Keď sa po nejakej dobe znovu prihlási, malo by si to pamätať, kde skončil, ale vždy ho hodiť do menu, kde bude mať na výber "pokračovať" alebo "čítať odznovu".

- bod 2: save a load, nejaký script by mal kontrolovať čo naposledy čítal a uložiť to, aby pri ďalšej návšteve klikol na odkaz "pokračovať" a hodilo ho na stránku, ktorú naposledy čítal.

- bod 3: presmerovanie, v prípade, že len tak vypol prehliadač uprostred rozčítaného článku, tak by si to malo pamätať, čo čítal naposledy a pri dohladaní url v pamäti prehliadača by ho to nemalo hodiť späť na stránku s článkom, ale do menu, kde následne musí kliknúť na "pokračovať".
- buď časovo sledovať neaktivitu a podľa toho odlogovať užívateľa alebo ho presmerovať do menu. Podmienkou je, aby sa v každom prípade objavil v menu, kde musí kliknúť na "pokračovať", žiadne vlastné zadávanie alebo dohladavanie url v pamäti prehliadača.

Pri kliknutí na pokračovať sa mu načíta stránka na ktorej skončil.
WertriK
Profil
Duchaplny:
Nevím, zda jsem to dobře pochopil.

Každému uživateli bych vygeneroval náhodný kód. Ten uložil do cookie a zároveň do DB s údajem jakou stránku právě navštívil - maximální stránku.
Tzn. navštíví str. 1 2 3 2 tak v DB bude 3.

A z toho bys měl vytřískat to co chceš. Při návštěvě uživatele zkontroluješ existenci cookie - pokud ano načteš data z DB a pošleš ho na danou stránku. Pokud ne, smůla.
tiso
Profil
Duchaplny: problém je s tým "nedostať sa na predchádzajúcu stranu". To mu chceš ako zakázať?
Duchaplny
Profil
WertriK: hej pochopil si to správne, akurát by nemal mať možnosť vrátiť sa na stránku 2, keď už navštívil stránku 3. Moc som nepochopil ten systém ukladania, resp. ktorý záznam/parameter by sa ukladal do cookies a DB ? Tiež by ma zaujímalo, či by sa rovnaký spôsob dal použiť aj so session miesto cookies, príp. výhody/nevýhody.

tiso: no to práve neviem, teoreticky ak použije backspace alebo krok vzad, tak sa na tú stránku dostane tak či tak a preto ma napadla unikátna/dočasná url, ktorá by sa zmazala pri zmene stránky.

Každopádne hlavné je, aby si prehliadač vždy zapamätal, na ktorej strane návštevník skončil, uložil ho do odkazu "pokračovať" a aby sa vždy pri návrate ocitol v menu.
Keeehi
Profil
Duchaplny:
Prohlížeč si to nedokáže zapamatovat.
Když to hodně zjednoduším, tak když někdo klikne na odkaz, tak uložíš ten odkaz a nick do databáze a při příštím přihlášení mu ten poslední uložený nabídneš.
Duchaplny
Profil
Keeehi: no samotný prehliadač si to samozrejme nezapamätá. Mal som na mysli cookies, session, ukladanie do DB alebo iné riešenie. Zatiaľ to nechávam otvorené, zaujímajú ma možnosti, výhody a nevýhody. Hlavne to musí spĺňať tieto požiadavky. Ak sa niečo nebude dať, tak samozrejme nebudem mať inú možnosť, než prijať iné riešenie, ale aby to nebolo úplne niečo iné, než som pôvodne chcel.
_es
Profil
Duchaplny:
by nemal mať možnosť vrátiť sa na stránku 2, keď už navštívil stránku 3.
Veľa prehliadačov má niekoľko predchádzajúcich stránok uložených v pamäti a pri tlačítku späť ich len zobrazia úplne bez komunikácie so serverom, takže ak na serveri zrušíš tú url, tak ti to nepomôže.
Malo by to však fungovať pomocou JS metódy location.replace. Vtedy sa pomocou tlačítka späť návštevník dostane na alebo pred začiatok webu.
Duchaplny
Profil
_es: po refreshi by ho to zrejme redirectlo niekam do menu, tým pádom by ho to odradilo robiť kroky späť. To by mi úplne stačilo.

Pozeral som si ten location.replace a robí to dosť zaujímavú vec. Po kliku na tlačítko ťa pošle na ďalšiu stranu + nemáš možnosť vrátiť sa späť na predchádzajúcu stranu. Jediný problém je, že to IE automaticky blokuje.
_es
Profil
Duchaplny:
Jediný problém je, že to IE automaticky blokuje.
Nemáš stránku otvorenú priamo z disku, teda otváraš ju cez nejakú internetovú adresu?
Ak áno, tak to skús spraviť tak, aby sa tá metóda vyvolala priamo v dôsledku kliknutia, nie nejako automaticky.
Namiesto location.replace by mohla rovnako fungovať aj metóda window.open.
Len treba pomenovať hlavné okno, teda najprv zadať nejakú hodnotu do window.name, použiť tú hodnotu ako názov okna a zadať nepovinný štvrtý argument ako true.
Duchaplny
Profil
_es: ahá, keď je to na servery, tak to neblokuje nič. Ja som to skúšal predtým len na disku. Funguje to systémom:

<script type="text/javascript">
function replaceDoc()
  {window.location.replace("odkaz_na_stranku")}
</script>

<input type="button" value="názov_tlačítka" onclick="replaceDoc()" />

V prípade odkazu <a>odkaz</a> musím mať všade rovnakú url, inak to nefunguje. Asi nejak takto:

<a onclick="replaceDoc().href='odkaz_na_stranku';" href="odkaz_na_stranku">Odkaz</a>

Toto riešenie som našiel na nete a funguje, snáď tam nemám zbytočnosti. Moc sa v JavaScripte nevyznám a pôvodne som ho vôbec na stránke mať nechcel, ale dokonale to rieši bod 1, takže díky moc.

Ešte tu však ostáva:
bod 2: ukladanie poslednej navštívenej stránky do odkazu "pokračovať" v menu - neviem či na tom záleží, ale url budem šifrovať
bod 3: presmerovanie pri vypnutí prehliadača do menu - bez toho, aby ho to odhlásilo zo stránky
_es
Profil
Duchaplny:
<a onclick="replaceDoc().href='odkaz_na_stranku';" href="odkaz_na_stranku">Odkaz</a>
Až na to, že v tomto prípade si stačí vypnúť JS a je po obmedzení, takže aby to pre bežného návštevníka bolo menej prekonateľné, nemal by to byť odkaz funkčný bez JS. No potom to zase bez JS nebude fungovať vôbec, takže si musíš vybrať "menšie zlo".
Duchaplny
Profil
_es: JavaScript je pôvodne zapnutý, obyčajný užívateľ ho väčšinou ani nevie vypnúť. Ak niekto silou mocou bude chcieť oklamať systém, tak ho oklame a ja mu v tom nezabránim, akurát by som len škodil obyčajným užívateľom. To je ako ten článok, čo som tu nedávno čítal o vykrádaní webov.
_es
Profil
Duchaplny:
Ak niekto silou mocou bude chcieť oklamať systém, tak ho oklame a ja mu v tom nezabránim, akurát by som len škodil obyčajným užívateľom.
Záleži však na tom či sa dá ten systém oklamať na jedno kliknutie alebo výrazne zložitejšie.
A možno ani niekto systém oklamať nemieni, len mu JS z nejakého dôvodu nefunguje.
Duchaplny
Profil
_es: pokiaľ niekomu nefunguje JS, tak odkazy fungovať budú. Akurát, že návrat na predchádzajúcu stránku už bude možný.
_es
Profil
Duchaplny:
pokiaľ niekomu nefunguje JS, tak odkazy fungovať budú. Akurát, že návrat na predchádzajúcu stránku už bude možný.
To je možnosť, z hľadiska návštevníka, ľahko zapnuteľná a nie len cielene. JS sa dá vypnúť ľahko.
Záleží na tom, či ti to vadí alebo nevadí.
Duchaplny
Profil
_es: v podstate vadí, pretože by som bol najradšej, keby to šlo presne tak, ako si prajem. Bohužiaľ nič nie je dokonalé, takže sa musím uspokojiť s tým, že to ide iba za určitých podmienok, ktoré zase nie sú také zlé - málo ľudí JS vypína. Keby pri vypnutí JS odkazy vôbec nefungovali, to by mi vadilo až príliš. Keďže ale idú je to "menšie zlo" = prijateľné riešenie.
Duchaplny
Profil
Rozmýšľal som nad - bod 2: ukladanie poslednej navštívenej stránky do odkazu "Pokračovať" v menu - neviem či na tom záleží, ale url budem šifrovať - a tak ma napadlo toto:

V MySQL je tabuľka users a stĺpec link - varchar(50) - NULL. Samozrejme, že len prihlásený užívateľ sa dostane na stránku s týmto kódom:
<?
$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']=mysql_real_escape_string($url);

  if (isset($url))
     {
      // pripojenie k DB
      mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
      mysql_select_db(SQL_DBNAME);
      mysql_query("update users where id=$_SESSION["id"] set link = mysql_real_escape_string($url)");
     }
else {die(ukladanie zlyhalo);}
?>

Update linku by sa mal spraviť vždy pri prechode na ďalšiu stránku (zrejme to bude robiť aj pri refreshe, ale škodiť by to nemalo) - ak si tam url užívateľ vymyslí, tak sa zrejme tiež uloží, neviem ako to zabezpečiť. V else by som chcel trochu šťastnejšie riešenie, aby script oznámil zlyhanie zápisu, ale všetko pokračovalo.

Link v menu "Pokračovať" by mohol vyzerať nejako takto:
<?
     // pripojenie k DB
     mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD);
     mysql_select_db(SQL_DBNAME);
     $result=mysql_query("select link from users where id=$_SESSION["id"]");
     $zaznam=mysql_fetch_array($result);
     $odkaz=$zaznam["link"];

echo '<a href="$odkaz">Pokračovať</a>';
?>

Má to ešte veľa múch, ale snáď to nie je úplne zle.
Keeehi
Profil
zlé to není až na toto:
$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']=mysql_real_escape_string($url);

Takto to bude fungovatlépe ;-)
$url=mysql_real_escape_string($_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']);
Duchaplny
Profil
Keeehi: ahá ďakujem. Zvyšok je dobre ? neverím :)

ten else ma teraz napadol, že by to mohlo byť len obyčajné echo.
Keeehi
Profil
Duchaplny:
Chyby tam jsou ale v syntaxi, což se dá snadno opravit (string má být v řetězci, pole se v řetězci zapisuje jinak, nebo "takto" ale musí se zřetězit)
Tamta chyba byla v logice.

byť len obyčajné echo
Může být, to záleží jen na tobě. Až na to, že to else záleží na isset($url) a ne na ukládání (v tvém případě isset($url) je vždy true, takže else stejně nikdy neproběhne)
Duchaplny
Profil
Keeehi: pole se v řetězci zapisuje jinak
Mám miesto:
$odkaz=$zaznam["link"];
písať ?
$odkaz=$zaznam['link'];
alebo niečo iné myslíš ?

isset($url) je vždy true, takže else stejně nikdy neproběhne
Hej to je pravda. Budem tam musieť dať ešte jednu podmienku, ale nenapadá ma, čo tam dať k tej kontrole zápisu. Moc php funkcii nepoznám.
Keeehi
Profil
Mám na mysli toto.
Místo
"select link from users where id=$_SESSION["id"]"

psát buď
"select link from users where id=".$_SESSION["id"]
nebo
"select link from users where id={$_SESSION['id']}"
nebo
"select link from users where id=$_SESSION[id]"

Ještě jsem si všiml jedné logické chyby:
"update users where id=$_SESSION["id"] set link = mysql_real_escape_string($url)"
má být
"update users where id=$_SESSION[id] set link = '$url'"
Duchaplny
Profil
Keeehi: ďakujem za opravy, budem si na to dávať pozor.
Duchaplny
Profil
Mám taký menší problém. V tabuľke mám stĺpec s názvom link a mám tam uložené url v http tvare. Chcel som z toho spraviť odkaz na stránke a použil som následovný kód:
<?
  if (isset($_SESSION["id"]))
  $vysledok=mysql_query("select link from users where id=".$_SESSION["id"].";", $GLOBALS["result"]);
  $zaznam=mysql_fetch_array($vysledok);
  $odkaz=$zaznam["link"];

echo '<a href="$odkaz">Pokračovať</a>';
?>
Problém je, že mi to do toho odkazu nedá url čo mám v databáze, ale len to čo je za "href=", čiže "$odkaz". Neviete mi povedať, kde som spravil chybu ?
Keeehi
Profil
Přečti si něco o uvozovkách.

Proměnné se v apostrofech neinterpretují, kdežto v uvozovkách ano.
echo "<a href=\"$odkaz\">Pokračovať</a>";
Duchaplny
Profil
heh taká chyba.. díky moc, prečítam si ten článok.
Duchaplny
Profil
chcem sa len spýtať, či sa nejakým spôsobom dá prepísať tento kód:
if (isset($_SESSION["id"])) return true; else return false;

aby som tam mohol pridať echo, bo takto mi to vráti prázdnu stránku pre tých, čo nie sú prihlásený a rád by som ich aspoň informoval, že sa treba prihlásiť.
Duchaplny
Profil
nikto nevie poradiť ?
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0