Jump to content
php.lv forumi

onunload=<?php?>


future_funk

Recommended Posts

shis straadaa, kad lapa tiek paarlaadeeta tajaa pashaa logaa vai arii logs tiek aizveerts ar CLOSE pogu:

 

<body onunload="alert('aa')">

 

shis straadaa tikai, tad, kad lapa tiek paarlaadeeta, bet uz CLOSE pogas nestraadaa:

 

<body onunload="<?session_destroy()?>"

 

kaapeec? un kaa var dabuut, lai php kods stradatu tad, kad tiek nospiesta CLOSE poga?

Link to comment
Share on other sites

sk: ignore_user_abort() - php turpina izpildīt kaut ko arī tad, kad liētotājs aizver brauzeri

register_shutdown_funcion() - tiek izsaukts, kad tiek beigts serversavienojums (pievērts logs)

 

bet būtībā session_destroy() notiek pats par sevīm, ja vien neesi kaut ko nofiņķelējies pa php.ini. parasti cilvēkiem problēmas - kā saglabāt sessiju pat aizeverot logu, a te še tev!

Link to comment
Share on other sites

shis straadaa, kad lapa tiek paarlaadeeta tajaa pashaa logaa vai arii logs tiek aizveerts ar CLOSE pogu:

 

<body onunload="alert('aa')">

 

shis straadaa tikai, tad, kad lapa tiek paarlaadeeta, bet uz CLOSE pogas nestraadaa:

 

<body onunload="<?session_destroy()?>"

 

kaapeec? un kaa var dabuut, lai php kods stradatu tad, kad tiek nospiesta CLOSE poga?

Tāpēc, ka pirmais ir JavaScript, kas izpildās uz klienta datora, bet otrais ir PHP, kas izpildās vēl pirms klients ir ticis pie teikšanas. Reāli klientam izskatisies pēc tā, kā PHP bus noparsējis skriptu šādi:

<body onunload="">

Link to comment
Share on other sites

nu ok, man sesijas aizverot browseri neizdzeeshas, kaa izdzeest sesiju, izmantojot php, kad browseris tiek aizveerts ?

 

pameeginaaju register_shutdown_function(), bet vina neizpildiijaas tad, kad browseris tiek aizveerts... izpildiijaas pashaas beigaas, kad tika apstraadaats viss paareejais php kods.

 

ignore_user_abort() - sho ar pameeginaaju, bet kaa vinju var pielietot, lai izdzeestu sesiju, kad logs tiek aizveerts?

Link to comment
Share on other sites

Nav normālu līdzekļu, ar kuru palīdzību uz servera uzzināt brīdi, kad lietotājs aizver pārlūkprogrammu. HTTP protokols ir vienkāršs - lapa tiek pieprasīta, saņemta un savienojums izbeidzas. Lietotājs var tavā lapā sēdēt, neko neklikšķināt un brīnīties piecus gadus. Piecu gadu laikā tava lapa jau sen ir izdzēst un atslēga - nolauzta, bet lietotājs nezina! Jo pēc lapas ielādes nav sakaru starp tevi un viņu.

 

Kad uzstāda sīkdatnes un nenorāda to darbības laiku, tad tām vajadzētu izdzēsties pēc pārlūkprogrammas aizvēršanas.

 

Ja tev vajag izdzēst sesiju uzreiz pēc lapas ielādes, tad tev, acīmredzot, sesiju nevajag vispār vai arī tu nesaproti to būtību. Sesija ir līdzeklis pašreizējā stāvokļa uzglabāšanai vairāku lapu garumā.

 

Ja tā ir tā lapa, kur lietotājs beidz darbu tavā sistēmā, tad tev kādā PHP skriptā jāievieto rindiņa session_destroy(). Un nevis HTML daļā, bet vēl pirms HTML ģenerēšanas.

 

Ieliec visu savu skriptu sākumā rindiņu ob_start() un tad tu varēsi laikam session_destroy() izsaukt arī skripta beigās. Tikai neliec to nekādā onload notikumā iekš Javascript. onload notikumā var rakstīt tikai Javascript, bet tu ko ierakstīji?

Link to comment
Share on other sites

jb4 rakstiija: "Nav normālu līdzekļu, ar kuru palīdzību uz servera uzzināt brīdi, kad lietotājs aizver pārlūkprogrammu."

 

"Kad uzstāda sīkdatnes un nenorāda to darbības laiku, tad tām vajadzētu izdzēsties pēc pārlūkprogrammas aizvēršanas."

 

Abos teikumos sanaak pretrunas.. Izlasot otro teikumu, var secinaat, ka tomeer ir liidzeklis kaa uzzinaat, kad lietotaajs aizveeris paarluukprogrammu, ja jau peec shiis darbiibas tiek izdzeesta sesija..

 

jb4 rakstiija: "Ja tev vajag izdzēst sesiju uzreiz pēc lapas ielādes, tad tev, acīmredzot, sesiju nevajag vispār vai arī tu nesaproti to būtību."

 

Nu taa man iisti nevajag:) Man sesiju vajag izdzeest peec taa, kad lietotaajs ir izlogojies (izmantojot linku LOGOUT) vai arii peec tam, kad vinsh vienkaarshi aizveeris paarluukprogrammu! Ar LOGOUT nav probleemu, bet ar browsera aizvershanu gan ir!

 

Pienemsim, ka php.ini nokonfigureets taa, lai sesijas izdzeeshas aizverot browseri, tad viss ok! Bet, ja es veelos katram lietotaajam piedaavaat iespeejas: 1. saglabaat sesiju, kad aizver browseri; 2. nesaglabaat sesiju, kad aizver browseri??

Link to comment
Share on other sites

Abos teikumos sanaak pretrunas.. Izlasot otro teikumu, var secinaat, ka tomeer ir liidzeklis kaa uzzinaat, kad lietotaajs aizveeris paarluukprogrammu, ja jau peec shiis darbiibas tiek izdzeesta sesija..

Pretrunas nav, jo "vajadzētu izdzēsties" nenozīmē "vienmēr izdzēšas".

Link to comment
Share on other sites

Tu vēljoprojām neesi sapratis, kas ir PHP. PHP ir programmēšanas vide uz servera. Javascript - programmēšanas vide lietotāja pārlūkprogramma. Starp šīm divām vidēm pa vidu ir saziņas protokols (saziņas noteikumu kaudze), ko sauc par HTTP (hypertext transfer protocol).

 

Šis te protokols paredz ļoti stingras klienta-servera attiecības. Klients ir tas, kas var tikai dabūt un var pieprasīt. Serveris ir tas, kas var uztvert pieprasīto, nosūtīt atbildi. Abi nav vienādās lomās! Ievēro.

 

Serveris nevar no zila gaisa pieslēgties pie kaut kāda klienta un teikt viņam: vecīt, aizmirsti šito sīkdatni (cookie), atver te mums logu un apēd šito kūciņu. Tā tas nenotiek.

 

Serveris klientam, rupji runājot, var nosūtīt tikai HTML kodu (es teicu - rupji runājot, tāpēc nepiekasieties). Tas HTML kods var saturēt Javascript, kurš, ja lietotājs ļaus, izpildīsies klientā, tas ir, lietotāja pārlūkprogrammā. Tava vienīgā iespēja kaut ko darīt uz lietotāja datora ir rakstīt Javascript.

 

Tavu problēmu iespējams risināt, uzrakstot Javascriptā sīkdatņu izdzēsēju, ko iedarbina pie tā unonload notikuma. Pameklē tīmeklī Javascript (googlē rakstī kaut kādu "delete cookie javascript"), kas to dara - pats no galvas nezinu.

 

Ne par tavu tēmu, bet lai tu zinātu: klients var pieslēgties serverim! Klients var nosūtīt kaut kādu pieprasījumu, bet tā ir servera darīšana, kā viņš to uztvers. Tāds čats HTTP protokolā reāli nav nemaz čats. Nav tā, ka tava pārlūkprogramma klausās, ko saka serveris un tad visus jaunos čata tekstus iedrukā tavā logā (runa nav par IRC, par IRC es nekā nezinu). Ir tā, ka tava pārlūkprogramma katru mīļu brīdi prasa serverim, vai ir kas jauns. Vai ir kas jauns? Vai ir kas jauns? Un tā visu laiku. Ja ir kas jauns, tad kaut kādā Javascript vai citā pārlūkprogrammas programmēšanas vidē tiek nodrošināts, ka tev tas parādās lapā ar rokām nemaz nespiežot nekādus refresh.

 

Pameklē internetā Javascript+HTTPRequest (tieši vienā vārdā HTTPRequest) un tur izlēks labas lietas droši vien. Var rakstīt Javascript, kas pieslēdzas serverim un nolasa atbildes, bet lietotājs pa to laiku lapā nav spiedis nekādas podziņas!!

 

Serveris, var noskaidrot, vai lietotājs ir atslēdzies, spriežot tā - ahā - lietotājs nav man neko prasījis jau veselu mūžību, tātad viņš ir miris, tātad viņa sesija ir dzēšama - tas ir tad, ja sesijas tiek glabātas kaut kur uz servera, piemēram, MySQL datubāzē.

 

Šitais ir ļoti nesakārtoti uzrakstīts, bet doma bija lāpīt kaut kādus tavu zināšanu caurumus, ceru, ka uz dažiem trāpīju.

Link to comment
Share on other sites

jb4 nu nevajag jau uzskatiit, ka es nejeedzu, kas ir kas...:)

 

kaa tad straadaa smartirc? arii tiek veidots pastaaviigs sakars starp uuseri un serveri!

 

peec gariem mekleejumiem guuglee, beidzot kautkas sanaaca, izmantojot ignore_user_abort, connection_status, set_time_limit, sleep, un flush, to visu sakombineejot un ieliekot nosleeptaa ifreimaa var panaakt pastaviigu sakaru starp klientu un serveri!!!

 

par HTTPRequest pagaidam neko neskatijos jo vis sanaca ar php, tomer buus jaapameegjina, varbuut efektiivaak!

Link to comment
Share on other sites

jb4 nu nevajag jau uzskatiit, ka es nejeedzu, kas ir kas...:)

 

kaa tad straadaa smartirc? arii tiek veidots pastaaviigs sakars starp uuseri un serveri!

 

peec gariem mekleejumiem guuglee, beidzot kautkas sanaaca, izmantojot ignore_user_abort, connection_status, set_time_limit, sleep, un flush, to visu sakombineejot un ieliekot nosleeptaa ifreimaa var panaakt pastaviigu sakaru starp klientu un serveri!!!

 

par HTTPRequest pagaidam neko neskatijos jo vis sanaca ar php, tomer buus jaapameegjina, varbuut efektiivaak!

12258[/snapback]

 

Redzi, te jau tu mazliet aizbrauc auzās. PHP stāv uz servera, SmartIRC klasi ( ja nemaldos tu domāji PEAR komplektācijā iekļauto Net_SmartIRC) tu izmanto uz servera. Kur pie velna ir klienta dators un kādā veidā notiek datu apmaiņa ar klientu? Protams, tieši tā, kā Jāzeps teica - klients pieslēdzas serverim un savāc datus no PHP skripta, kurš tos XHTML veidā padod klientam.

 

Tas, kā Net_SmartIRC sazinās ar IRC serveri, ir jau pavisam cits pastāsts - tur apakšā ir IRC protokols, sazināšanās notiek ar Socket funkcijām. (http://www.irchelp.org/irchelp/rfc/rfc.html)

 

Slēptais iframe ar pliku PHP jebkurā gadījumā nav drošs pasākums starp klientu un serveri. Tikko kaut kādu mirkli pazūd tīkla pieslēgums, tā savienojums pārtrūkst un klients vairs nu nekādi necenšas savienoties ar serveri, attiecīgi tu nevari zināt, vai klients vēl joprojām ir lapā. Tāpat varētu būt arī problēmas ar to, ka pārlūkprogramma ilgāku laiku nesaņemot nekādus datus no servera izdomā, ka savienojums ir jāpārtrauc (Connection Timeout)

 

Ja tev ir vajadzība perfekti zināt, ko lietotājs attiecīgajā brīdī dara sistēmā, tad būvēt sistēmu uz HTTP protokola varētu arī nebūt pati labākā ideja.

 

Patiesībā, lai tev varētu labāk palīdzēt tu varētu paskaidrot, kas ir tas, ko tu mēģini uzbūvēt? Vai tā ir vienkārši mājas lapa, kaut kāda uzskaites sistēma, vai kas cits.

Link to comment
Share on other sites

Vecozēn, ja mans ūdens tev nav noderīgs, nedomā, ka tas citiem arī uzreiz nav noderīgs. forums - tas nav vienai dienai. Ja tu man tagad saki, ka tu ar iframe nodrošini pastāvīgi sakaru starp klientu un serveri, tad ej tu ar savām zināšanām bekot vai zini. slēp savus iframe un tik dragā. augstie kalni gaida, kad tu viņus gāzīsi.

 

peace on earth vai kā tur tagad mēdz teikt.

Link to comment
Share on other sites

Vecozēn, ja mans ūdens tev nav noderīgs, nedomā, ka tas citiem arī uzreiz nav noderīgs.

12260[/snapback]

 

es taa neteicu un arii taa nedomaaju, tieshi otraadi, RESPECT, ka kaut ko uzrakstiiji!

 

Kaklz rakstiija

Tikko kaut kādu mirkli pazūd tīkla pieslēgums, tā savienojums pārtrūkst un klients vairs nu nekādi necenšas savienoties ar serveri, attiecīgi tu nevari zināt, vai klients vēl joprojām ir lapā.

 

Nu, bet var gan, vismaz man sanaaca!

Un taatad, pamats bez jebkaadiem rotaajumiem:

 

index.php

<a href=lapa1.php target=frame1>news</a>
<a href=lapa2.php target=frame1>news</a>
<iframe src=lapa1.php name=frame1></iframe>
<iframe src=checkstatus.php name=frame2></iframe>
/[code]

[b][u]checkstatus.php[/b][u/]
[code]
<?
include ('connect.php');
$sql="UPDATE `users` SET `online` = 'y' WHERE `id` = '1' AND `name` = 'user1'";
mysql_query($sql);
echo str_repeat(" ",300);
ignore_user_abort(true);
while (true)
{
   echo "test<br>\n";
   flush();
   sleep(2);
   if (connection_status()!=0)
       {
       $sql="UPDATE `users` SET `online` = 'n' WHERE `id` = '1' AND `name` = 'user1'";
       mysql_query($sql);
       die();
       }
}
?>

 

kameer logs nav aizveerts, datubaazee ieraksts online staav uz 'y', kaa aizver logu, ieraksts izmainaas uz 'n'.

Link to comment
Share on other sites

Vecozēn, ja mans ūdens tev nav noderīgs, nedomā, ka tas citiem arī uzreiz nav noderīgs.

12260[/snapback]

 

es taa neteicu un arii taa nedomaaju, tieshi otraadi, RESPECT, ka kaut ko uzrakstiiji!

 

Kaklz rakstiija

Tikko kaut kādu mirkli pazūd tīkla pieslēgums, tā savienojums pārtrūkst un klients vairs nu nekādi necenšas savienoties ar serveri, attiecīgi tu nevari zināt, vai klients vēl joprojām ir lapā.

 

Nu, bet var gan, vismaz man sanaaca!

Un taatad, pamats bez jebkaadiem rotaajumiem:

 

index.php

<a href=lapa1.php target=frame1>news</a>
<a href=lapa2.php target=frame1>news</a>
<iframe src=lapa1.php name=frame1></iframe>
<iframe src=checkstatus.php name=frame2></iframe>

 

checkstatus.php[u/]

<?
include ('connect.php');
$sql="UPDATE `users` SET `online` = 'y' WHERE `id` = '1' AND `name` = 'user1'";
mysql_query($sql);
echo str_repeat(" ",300);
ignore_user_abort(true);
while (true)
{
   echo "test<br>\n";
   flush();
   sleep(2);
   if (connection_status()!=0)
       {
       $sql="UPDATE `users` SET `online` = 'n' WHERE `id` = '1' AND `name` = 'user1'";
       mysql_query($sql);
       die();
       }
}
?>

 

kameer logs nav aizveerts, datubaazee ieraksts online staav uz 'y', kaa aizver logu, ieraksts izmainaas uz 'n'.

Link to comment
Share on other sites

×
×
  • Create New...