AJAX

Školení, která pořádám

Článek vyšel na serveru Root.cz.

Článek rozebírá různé možnosti umísťování interaktivních komponent na webové stránky a soustřeďuje se na jeden v současné době poměrně populární. Díky technologii Asynchronous JavaScript and XML je možné z webového prohlížeče elegantně komunikovat s webovým serverem a vyměňovat si s ním data, která se mohou ihned uložit na serveru nebo naopak zobrazit u klienta.

Pokud je na stránce nějaká dynamická komponenta, např. anketa, hlasování nebo konec konců i diskuse, dá se k jejímu zpracování přistoupit mnoha různými způsoby:

Pro použití objektu XMLHttpRequest se ustálil pojem AJAX, přestože korektní použití tohoto objektu nemusí odpovídat ani jednomu slovu ve zkratce – komunikace nemusí být asynchronní, jako skriptovací jazyk nemusí být použit JavaScript a data se nemusí přenášet pouze pomocí XML. Naopak AJAX se dá výše naznačenými způsoby zajistit i bez objektu XMLHttpRequest.

Příklad – realizace ankety v PHP

Na jednoduchém příkladu si ukážeme, jak se AJAX dá použít pro zpracování ankety. Důležitá část skriptů je univerzální a použitelná i v dalších komponentách.

Hlavní stránka se od ostatních řešení příliš lišit nebude. V případě vypnutého JavaScriptu nebo obecně nefunkčnosti technologie AJAX u klienta se navštíví běžný odkaz, který aktualizuje databázi a stránku celou překreslí. Pro kontrolu toho, jestli uživatel ještě nehlasoval, se používá cookie s platností jeden měsíc, podle potřeb je možné tuto kontrolu samozřejmě změnit. Vazbu na AJAX v tomto souboru zajišťuje volání funkce anketa_hlasovat.

<?php
// uložení odpovědi v případě vypnutého JavaScriptu
if (isset($_GET["anketa"]) && !isset($_COOKIE["anketa"])) { // primitivní kontrola toho, jestli uživatel ještě nehlasoval
    setcookie("anketa", $_GET["anketa"], strtotime("+1 month"));
    $_COOKIE["anketa"] = $_GET["anketa"];
    mysql_query("UPDATE anketa SET pocet = pocet + 1 WHERE id = " . intval($_GET["anketa"]));
}

// zobrazení ankety
echo "<h3>Anketa</h3>\n";
$result = mysql_query("SELECT * FROM anketa");
echo "<table border='1' id='anketa'>\n";
while ($row = mysql_fetch_assoc($result)) {
    $odpoved = htmlspecialchars($row["odpoved"]);
    if (!isset($_COOKIE["anketa"])) {
        $odpoved = "<a href='?anketa=$row[id]' onclick='return !anketa_hlasovat($row[id]);'>$odpoved</a>";
    }
    echo "<tr><td class='odpoved'>$odpoved</td><td id='pocet$row[id]'>$row[pocet]</td></tr>\n";
}
echo "</table>\n";
echo "<span id='stav-anketa'></span>\n";
mysql_free_result($result);
?>

Největší část funkčnosti zajišťuje následující JavaScriptový kód. Funkce send_xmlhttprequest je obálka nad objektem XMLHttpRequest, která zajistí vytvoření správného objektu v závislosti na schopnostech prohlížeče, inicializuje požadavek a nastaví mu případné hlavičky a tělo, prováže ho s obsluhou události a odešle ho. Funkce anketa_hlasovat tuto funkci využívá a kromě toho znemožní opětovné hlasování vymazáním odkazů a překreslí anketu se započteným hlasem uživatele. V neposlední řadě informuje uživatele o tom, že se ukládají výsledky – vzhledem k tomu, že uživatelé na tento způsob modifikace stránek nemusí být zvyklí, je jejich informování poměrně důležité. Funkce anketa_obsluha přiřazená k obsluze události onreadystatechange se volá při každé změně stavu, a pokud je požadavek dokončen (readyState má hodnotu 4), aktualizuje data na základě momentálního počtu odpovědí a informuje uživatele o dokončení požadavku.

<script type="text/javascript">
/** Odeslání XMLHttp požadavku
* @param Function funkce zajišťující obsluhu při změně stavu požadavku, dostane parametr s XMLHttp objektem
* @param string GET|POST|...
* @param string URL požadavku
* @param string tělo zprávy
* @param object předané hlavičky ve tvaru { 'hlavička': 'obsah' }
* @return boolean true v případě úspěchu, false jinak
* @copyright Jakub Vrána, https://php.vrana.cz/
*/
function send_xmlhttprequest(state_change, method, url, content, headers) {
	var xmlhttp = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false));
	if (!xmlhttp) {
		return false;
	}
	xmlhttp.open(method, url);
	xmlhttp.onreadystatechange = function () {
		state_change(xmlhttp);
	};
	headers = headers || {};
	headers['X-Requested-With'] = headers['X-Requested-With'] || 'XMLHttpRequest';
	for (var key in headers) {
		xmlhttp.setRequestHeader(key, headers[key]);
	}
	xmlhttp.send(content);
	return true;
}
</script>

Za zmínku stojí, že vytvořený objekt xmlhttp se obslužné funkci předává jako parametr. V tomto jednoduchém případě by to mohla být i globální proměnná, ale vzhledem k tomu, že na stránce může být dynamických komponent více, je nutné mezi nimi rozlišovat. Pokud by se použila globální proměnná a nějaká komponenta by vytvořila nový požadavek ještě před dokončením předešlého, vedlo by to k jeho nedokončení. Je potřeba pamatovat na to, že zpracování je asynchronní.

<script type="text/javascript">
function anketa_hlasovat(hlas) {
	// odeslání požadavku na aktualizaci dat
	if (!send_xmlhttprequest(anketa_obsluha, 'GET', 'anketa_rpc.php?anketa=' + hlas)) {
		return false;
	}
	document.getElementById('pocet' + hlas).innerHTML++; // zobrazení hlasu u klienta
	// znemožnění opětovného hlasování smazáním odkazů
	for (var key in document.getElementById('anketa').getElementsByTagName('td')) {
		var val = document.getElementById('anketa').getElementsByTagName('td')[key];
		if (val.className == 'odpoved') {
			val.innerHTML = val.firstChild.innerHTML;
		}
	}
	document.getElementById('stav-anketa').innerHTML = 'Ukládá se';
	return true;
}

function anketa_obsluha(xmlhttp) {
	if (xmlhttp.readyState == 4) {
		// aktualizace odpovědí na základě aktuálního stavu
		var odpovedi = xmlhttp.responseXML.getElementsByTagName('odpoved');
		for (var i=0; i < odpovedi.length; i++) {
			document.getElementById(odpovedi[i].getAttribute('id')).innerHTML = odpovedi[i].firstChild.data;
		}
		document.getElementById('stav-anketa').innerHTML = 'Uloženo';
	}
}
</script>

Skript anketa_rpc.php je velice jednoduchý – zkontroluje, jestli uživatel ještě nehlasoval, započte jeho hlas a zpět odešle jednoduché XML s aktuálním počtem odpovědí. Jak již bylo řečeno, nemusí spolu skripty komunikovat pomocí XML, u strukturovaných dat je to však poměrně praktické. Pokud by skript generoval nestrukturovaná data, lze k nim z JavaScriptu přistoupit přes vlastnost responseText.

<?php
if (!isset($_COOKIE["anketa"])) {
    setcookie("anketa", $_GET["anketa"], strtotime("+1 month"));
    mysql_query("UPDATE anketa SET pocet = pocet + 1 WHERE id = " . intval($_GET["anketa"]));
}

header("Content-Type: text/xml");
echo "<anketa>\n";
$result = mysql_query("SELECT * FROM anketa");
while ($row = mysql_fetch_assoc($result)) {
    echo "<odpoved id='pocet$row[id]'>$row[pocet]</odpoved>\n";
}
mysql_free_result($result);
echo "</anketa>\n";
?>

Objekt XMLHttpRequest umožňuje i odesílání dat metodou POST. Opět lze poslat XML dokument, je ale možné použít i hlavičku Content-Type: application/x-www-form-urlencoded a data poslat standardně URL-zakódovaná (jednotlivé části funkcí encodeURIComponent). Z takto poslaných dat PHP vytvoří standardní proměnné.

AJAX se samozřejmě dá použít i na spoustu dalších věcí. Zmíněny byly další dynamické komponenty stránky, dobře viditelné je použití u tzv. našeptávačů nebo u mapových aplikací, použít se dá např. i pro předběžnou kontrolu unikátnosti uživatelského jména u klienta. Fantazii se meze nekladou, důležité je ale vždy zajistit, aby aplikace byla použitelná i bez této funkce. Nevhodné je také AJAXem nahradit např. běžný přechod mezi stránkami, protože uživatelé potom nemohou používat historii a mohou být zmateni, že se stránky chovají jinak, než jsou zvyklí.

Související odkazy

Přijďte si o tomto tématu popovídat na školení JavaScript a AJAX.

Jakub Vrána, Seznámení s oblastí, 3.10.2005, diskuse: 55 (nové: 0)

Diskuse

takasija:

Chtel bych se zeptat kde vznika problem, kdyz se pri pokusu o odeslani objevi hlaska "Odepření přístupu při volání metody XMLHttpRequest.open" ?

Vlkcy:

Podařilo se získat nějaké informace?

ikona Jakub Vrána OpenID:

Jedná se nejspíš o cross-domain request. Požadavek je možno pokládat jen na adresu ze stejné domény, na které je stránka.

Jirka K:

Možná budu působit jako diletant, ale já měl podobný problém na localhostu. IE prudil, Firefox nereagoval. Stačilo přidat http:// do volané adresy.

opera:

ako je to soperou?

Vilém Málek:

2 opera: Opera se přizpůsobila diktátu doby, viz http://interval.cz/clanky/google-suggest-…-xmlhttprequest/ ;-)

Malcik:

Když se provede načtení toho kódu, tak se mi ztratí diakritika (místo písmen s háčkem nebo čárkou se ukážou je otazníky). Jak to vyřeším?

Díky

FantomX1:

V dokumente vratenej spravy zmenis header("Content-Type: text/xml") na header("Content-Type: text/xml; charset=windows-1250") alebo na take ake mas na stranke, mozno iso-8859-2.

peta:

Se mi velice libi opakovani konstrukce
document.getElementById
Proc si nezalozis fukci treba
function xObject(x) {return document.getElementById(x)}

Proc? Se ti z nejakeho duvodu stane, ze budes mit potrebu resit objekty pres document.all nebo pres layers, a pak to budes cely pracne prepisovat.

Prikladam funkci pracujici s FRAME nebo aktualnim framem, cili WINDOW, kde vlastne presny zapis by mel spravne byt:
window.document.get...()
zapis pres frame
nazevframu.document.get...()
<FRAME name="nazevframu">

function objGet2(d,x)    {d=d==0?document:d; return (d.getElementById?d.getElementById(x):d.all?d.all[x]:d.layers?d.layers[x]:null);}

ikona Jakub Vrána OpenID:

document.getElementById() je v současných prohlížečích, které podporují AJAX, zcela standardní funkce, přístup přes all nebo layers je zbytečný. A vytvářet funkci jenom jako kratší zápis jiné funkce považuji za samoúčelnou obfuskaci.

Ferda Mravenec:

toto nemusi nutne platit, pri ajaxovani sveho webu jsem se ted dostal do situaci, kdy to v IE 6.0.x funguje, v FF 1.5.x ne, a jako reseni se nabizi kratoucky javascript

if((!document.getElementById) && document.all){
document.getElementById = function(id){return document.all[id];};
}

ktery v pripade, ze stranka neumi getElementById ale umi document.all proste nadefinuje funkci getElementById pouzivajic prave document.all ... to nikomu neublizi a naopak programator se dal muze "odstinit" od ruznych anomalii ve volani gEBI v ruznych prohlizecich ...

longin:

Asi zijes v dobe kde neni mozny nahrazovani textu regulernim vyrazem, coz ;)

ikona venca:

regulárním proboha, regulÁrním!

Flamer:

myslím, že ve slovníku češtiny je i regulerní. :)

ikona Jakub Vrána OpenID:

Je to tak, ale „regulární výraz“ je ustálený pojem.

SmallM:

Regulerní používal soudruh Husák páč se nikdy nenaučil dobře česky a po něm všichni ti soudruzi co pospávali na těch stranických schůzích- Mají to v podvědomí.

Tomas:

Ahoj, zaprve diky za pekny clanek. Zadruhe bych se rad zeptal jak je to s 'licenci' uvedenych kousku kodu. Konkretne jsem funkci 'send_xmlhttprequest' pouzil v jedne firemni webove aplikaci, ale nez to zpristupnime tak bych rad vedel ze to je OK - aby mne pak nekdo nenarkl ze jsem loupeznik. Uvedena tam samozrejme bude vcetne copyrightu atd.

ikona Jakub Vrána OpenID:

Je to uvedeno v patičce každé stránky: "Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení."

Tomas:

OK, diky. Hledat to v patičce mne nenapadlo.

CyberLuke:

hezke...ale proc znovu vynalezat kolo? Ajax knihoven je spousta - jen na PHP je jich tusim pres 15 - ma nejoblibenejsi je TinyAjax...ale kdo ma cas a nervy na reseni bugu, tak asi vynaleza kolo porad dokola. No...ale aspon na root.cz vyjde i nejaky ten clanek o ajaxu.

Jeste by se hodilo dodat, ze ten kod je jen ukazkovy...v aplikacich se pouzit neda - resp. da, ale ne dlouho, protoze jak se v tom za chvili nebude dat vyznat, takze doufam, ze ty lamy jen tak nekopiruji do sveho editoru.

Honza Hučín:

Díky tomuto článku jsem úspěšně implementoval techologii AJAXu do jedné aplikace, a to na první pokus. Děkuju moc.

Milan:

Domnívám se, že by ve skriptu pro výpis ankety mělo být <?php if (!isset($_COOKIE["anketa"])) { ... ?> místo <?php if (isset($_COOKIE["anketa"])) { ... ?>. Jinak by se nikdy nedalo hlasovat. Promiňte, jestli se pletu.

ikona Jakub Vrána OpenID:

Fakt že jo. Zvláštní, že si toho dosud nikdo nevšiml. Opravil jsem to.

Adolf Fritz:

Chcem len podotknúť, že ak vám prehliadač pri vypisovaní pomocou ezophp nbrazuje znaky, ako: ľščťžýáíé... tak stačí do daného skriptu pridať takúto hlavičku... potom to pôjde...

<?header('Content-Type: text/html; charset=Windows-1250');?>

Orly?:

diky moc, toto som dlho hladal, toto mi osobne pomohlo

Rasto:

zdravim. skusal som tento kod a nejako mi to nefunguje. zobrazi sa sice o 1 hlas viac, aj sa odstrani odkaz, ale nezapise sa novy stav do DB.

Yučikala:

Super článek, všechno se mi podařilo rozchodit. Až na diakritiku. Ať sem zkoušel, co sem zkoušel, na místo háčků a čárek mám paznaky "novÄ›  čřžýáíé"

zkoušel sem přidat charset do hlavišky funkce send_xmlhttprequest , ale nepomohlo to...

používám metodu POST

Nevíte, co s tím? Děkuju moc

hugoman:

Skus zmenit kodovanie suboru ;)

Katamaru:

Zdravím, AJAX mi v FF funguje spravne, ale v IE se nedeje nic. Jak ho upravit pro IE?

ikona Marty:

Použil jsem jednoduchou ajaxovou techniku do svého redakčního systému a narazil jsem na problem se zabezpecenim:

makePOSTRequest('../admin/admin_articles_save_now.php?PHPSESSID='+session_id, poststr);

Tato funkce posle data metodou POST souboru admin_articles_save_now.php, jako zabezpeceni jsem pouzil SESSIONS, ve kterych mam ulozene promenne s pravy. Zajimalo by me, jestli je toto reseni dostatecne nebo byste doporucovali nejake jine.

choswe:

Tak sem si vyzkousel tu anketu a bohuzel mi to nefunguje:(
prohlizec mi hlasi u radku:
  var xmlhttp = (window.XMLHttpRequest ? new XMLHttpRequest : (window.ActiveXObject ? ...  syntax error a pritom sem to zkopiroval cele odsud

firgas:

ja používam ajaxovú triedu z tejto adresy

http://xkr.us/code/javascript/XHConn/

je to jednoduché, rýchle, účinné, funguje to a setri to miesto

Pepa:

Dávám přednost použití Hidden Iframe před Ajax řešením
všude, kde je to únosné. Nicméně jsem už narazil na situace,
kdy Ajax byl jediným možným řešením. Ajax je dle mého názoru
rovněž elegantnější řešeni pro dynamické změny ve formuláří
i jinde.

ikona Jakub Vrána OpenID:

Mohl bys popsat situaci, kdy by Ajax byl jediným možným řešením?

kozotoč:

Mě napadá případ, kdy má uživatel ve formuláři vložit firmu / skupinu / družstvo / ... které ještě neexistuje a které je záhodno, aby ji zadal. Klikne na odkaz "vytvořit novou", který mu v novém okně zobrazí druhý formulář pro vytvoření této firmy/skupiny/... , a po odeslání napíše, že byla vytvořena. No, avšak, pak je třeba, aby se v původním formuláři seznam firem/skupin/... aktualizoval. Obdobně v případech, kdy se něco často mění (rezervace knih v knihovně, např. aneb - mezi otevřením formuláře a jeho odesláním mu knihu, co si chce půjčit, může "vyfouknout" jiný čtenář). Atd.

Pepa:

Pokusil jsem se vytvořit Web Online textový editor MVS a Unix (Aix) souborů pomoci Textarea. Samozřejmě v PHP pro
Unix, ale v Gwapirexx pro MVS. Ale to není podstatné. Do kompletně přijatého Formuláře editoru na straně prohlížeče
jsem v onLoad() sekci ajax scriptem dodatečně musel vložit vlastní tělo souboru do pole textarea. Soubor múže mít i tisíce záznamů a všechny možné speciální znaky. Pokud byl soubor součástí html dokument posláného na prohlížeč, tento nedokázal tyto data zpracovat (zblbnul). Nenašel jsem jiné řešení, než poslat obsah souboru asynchronně Ajax metodou do kompletně přijatého dokumentu dodatečně. Na pohled to vypadá docela elegantně a Ajax si získal mé velké sympatie.

ikona Jakub Vrána OpenID:

Se správně zakódovanými daty by si měl prohlížeč poradit. Kdyby ne (třeba proto, že by to byly bajty s kódem menším než 32), tak by to jistě šlo JavaScriptem. Pro AJAX zde nevidím uplatnění.

Alojz:

Dalo by sa nejakou funkciou kontrolovat trebars po 3 minutach, kolko je prihlasenych uzivatelov na stranke?
Ako by sa dal ajax vyuzit v tomto?
Ak dobre rozumiem odoslal by sa ajaxom dotaz na vykonanie skriptu a ako by sa zaistilo vypisanie?
Je vobec nutne posielat dotaz na vykonanie skriptu, ked mam zaujem iba o vypis?

Gifi:

mam dotaz.
mam hlavni dokument a v nem reaguje na urcite udalosti ajax v jinem dynamickem php dokumentu. a potrebuji z toho druheho vytahnout data do do prvniho abych mohl data odeslat pres formular. zatim me napadlo reseni pres cookie? existuje neco jineho?

ikona Lukáš Zdechovan:

Ja som mal tiez problemy s diakritikou a chcel som sem len doplnit, ze castokrat ked zapisujete/citate udaje do/z databaze (napriklad cez ajax) a dostavate divne znaky skuste pred vyknonanim databazoveho prikazu SELECT, INSERT, atd zadat  DB prikaz SET NAMES 'UTF8'

štíhloprd:

k řádku "if (xmlhttp.readyState == 4) {" v anketa_obsluha().
Co se tak koukám na ostatní ajaxové příklady, v této podmínce pro zpracování bývá přidáván i xmlhttp.status == 200 (HTTP kód 200 - OK). Jinak se bude zpracovávat, i když server bude hlásit chybu.

papajuk:

jemný úvod je též zde (anglicky)
http://developer.mozilla.org/en/AJAX/Getting_Started

Tonda:

Ahoj,bylo by možné dát celý příklad ke stažení ?

ikona Jakub Vrána OpenID:

Stačí zkopírovat ukázky zdrojového kódu ze článku.

ikona deny:

Může mi někdo prosím vysvětlit, jak je možné, že mi někdo hlasuje v mé anketě bez toho, aniž by se mi uložila jeho ip, i když v jiných případech to funguje? Scriptem by to být nemělo a ochranu před roboty mám snad vyřešenou... Nějaké nápady? Děkuji...

ikona deny:

Již vyřešeno...

Petr:

Bude hlasování fungovat i když bude vypnutý JS?

ikona Jakub Vrána OpenID:

Ano, v tom případě se odešle klasicky.

Magnus:

Pěkný den.

Je nějaký zásadní rozdíl mezi tím, když to budu dělat přes xmlhttprequest nebo přes $.post() - jQuery ?

ikona Jakub Vrána OpenID:

jQuery interně používá XMLHttpRequest, takže zásadní rozdíl v tom není.

Petr Šebela:

Dobrý den,
mám problém z dynamickým přidáním prvku formuláře
muj kód vypadá takhle:
    </table>

    <h2>Ingredience</h2>
    <a href="#" id="addbutton">Přidat</a>
    <div id="myform"></div>
    <?php
   
if (isset($_POST['odeslat']) and count($_POST['surovina']) > 1) {

       
$i = 1;
        foreach (
$_POST['surovina'] as $key => $value) {
            echo
'<table><tr><td>Surovina</td><td><input type="text" name="surovina[]" id="surovina' . $i . '"></td></tr>
                  <tr><td>Množství</td><td><input type="text" name="mnozstvi[]" value="'
. checkInput($_POST['mnozstvi'][$key]) . '"></td></tr>
                  <tr><td>Jednotka</td><td><input type="text" name="jednotka[]" value="'
. checkInput($_POST['jednotka'][$key]) . '"></td></tr></table>';
           
$i++;
        }
    }
    else
        echo
'<table>
          <tr>
          <td>Surovina</td><td><input type="text" name="surovina[]" id="surovina1" ></td>
          <td>Množství</td><td><input size= "30" type="text" name="mnozstvi[]"></td>
          <td>Jednotka</td><td><input size= "30" type="text" name="jednotka[]" ></td>
          </tr>
          </table>'
;
   
?>
    <tr><td></td><td><input type="submit" name="odeslat" value="Uložit"></td></tr>
</table>

<script type="text/javascript">
    $(document).ready(function() {
        var counter = 1;
<?php
if (isset($_POST['odeslat']) and count($_POST['surovina']) > 1) {
   
$i = 1;
    foreach (
$_POST['surovina'] as $key => $value) {
        echo
'
      $("#surovina'
. $i . '").tokenInput("ajax/suroviny.php", {
        theme: "facebook",
        tokenLimit: 1,
        hintText: "Zadejte prosím ingredienci (Brambory, Hranolky, Sůl, apod.)",
        noResultsText: "Nenalezeno",
        searchingText: "Hledám...",
    });
    $("#surovina'
. $i . '").tokenInput("add", {id: "' . $_POST['surovina'][$key] . '", name: "' . getNameIngred($_POST['surovina'][$key]) . '"});';
       
$i++;
    }
}
else
    echo
'
          $("#surovina" + counter).tokenInput("ajax/suroviny.php", {
            theme: "facebook",
            tokenLimit: 1,
            hintText: "Zadejte prosím ingredienci (Brambory, Hranolky, Sůl, apod.)",
            noResultsText: "Nenalezeno",
            searchingText: "Hledám...",
        });'
;
?>

        $('addbutton').click(function() {
            event.preventDefault();
            counter++;
            var htmlcode = '<table id="myform"><tr>\n\
<td>Surovina</td><td><input type="text" name="surovina[]" id="surovina' + counter + '"></td>\n\
<td>Množství</td><td><input type="text" name="mnozstvi[]"></td>\n\
<td>Jednotka</td><td><input type="text" name="jednotka[]"></td>\n\
                            </tr></table>';

            $('#myform').after(htmlcode),
                    $("#surovina" + counter).tokenInput("ajax/suroviny.php", {
                theme: "facebook",
                tokenLimit: 1,
                hintText: "Zadejte prosím ingredienci (Brambory, Hranolky, Sůl, apod.)",
                noResultsText: "Nenalezeno",
                searchingText: "Hledám..."
            });
        });
    });

</script>
</form>
děkuji za případnou reakci :) 

PeTaX:

Nepovedlo se mi nikde najít, zda už umí PHP pracovat s LocalStorage a SessionStorage. Víte někdo?

ikona Jakub Vrána OpenID:

LocalStorage a SessionStorage jsou technologie prohlížeče. PHP běží na serveru, nemá s tím tedy nic společného.

PeTaX:

To jistě ano. Jen jsem očekával, že by bylo účelné k úložišti na straně klienta přistupovat podobně jako ke COOKIE.

ikona Jakub Vrána OpenID:

Na straně klienta je pro práci s těmito úložišti k dispozici normální API, lepší než pro cookie. Na server se tato data vůbec neposílají.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.