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 |
#2 · Zasláno: 31. 8. 2010, 17:22:13
Duchaplny: čítal som to 2x ale stále som nepochopil čo chceš…
|
||
Duchaplny Profil |
#3 · Zasláno: 31. 8. 2010, 19:10:38
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 |
#4 · Zasláno: 31. 8. 2010, 19:15:10
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 |
#5 · Zasláno: 31. 8. 2010, 19:26:27
Duchaplny: problém je s tým "nedostať sa na predchádzajúcu stranu". To mu chceš ako zakázať?
|
||
Duchaplny Profil |
#6 · Zasláno: 31. 8. 2010, 22:37:18
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 |
#7 · Zasláno: 31. 8. 2010, 22:52:52
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 |
#8 · Zasláno: 31. 8. 2010, 23:05:34
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 |
#9 · Zasláno: 31. 8. 2010, 23:22:02
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 |
#10 · Zasláno: 1. 9. 2010, 09:19:05
_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 |
#11 · Zasláno: 1. 9. 2010, 09:38:33
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 |
#12 · Zasláno: 1. 9. 2010, 10:48:23
_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 |
#13 · Zasláno: 1. 9. 2010, 11:08:16
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 |
#14 · Zasláno: 1. 9. 2010, 15:13:34
_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 |
#15 · Zasláno: 1. 9. 2010, 15:27:55
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 |
#16 · Zasláno: 1. 9. 2010, 15:38:23
_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 |
#17 · Zasláno: 1. 9. 2010, 15:43:22
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 |
#18 · Zasláno: 1. 9. 2010, 16:17:17
_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 |
#19 · Zasláno: 2. 9. 2010, 15:58:17
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 |
#20 · Zasláno: 2. 9. 2010, 16:01:13
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 |
#21 · Zasláno: 2. 9. 2010, 16:29:42
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 |
#22 · Zasláno: 2. 9. 2010, 16:42:10 · Upravil/a: Keeehi
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 |
#23 · Zasláno: 2. 9. 2010, 17:55:42
Keeehi: pole se v řetězci zapisuje jinak
Mám miesto: $odkaz=$zaznam["link"]; $odkaz=$zaznam['link']; 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 |
#24 · Zasláno: 2. 9. 2010, 19:57:20 · Upravil/a: Keeehi
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"] "select link from users where id={$_SESSION['id']}" "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)" "update users where id=$_SESSION[id] set link = '$url'" |
||
Duchaplny Profil |
#25 · Zasláno: 2. 9. 2010, 20:19:02
Keeehi: ďakujem za opravy, budem si na to dávať pozor.
|
||
Časová prodleva: 4 dny
|
|||
Duchaplny Profil |
#26 · Zasláno: 6. 9. 2010, 20:12:34
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>'; ?> |
||
Keeehi Profil |
#27 · Zasláno: 6. 9. 2010, 20:46:20
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 |
#28 · Zasláno: 6. 9. 2010, 20:49:12
heh taká chyba.. díky moc, prečítam si ten článok.
|
||
Duchaplny Profil |
#29 · Zasláno: 9. 9. 2010, 00:43:53
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 |
#30 · Zasláno: 9. 9. 2010, 20:00:27
nikto nevie poradiť ?
|
||
Téma pokračuje na další straně.
|
0