Autor Zpráva
baldur
Profil *
Zdravím,
mám takový problém, a nevím jestli je to normální chování, nebo jestli někde nedělám chybu. Mám skript (dejme tomu skript "A") a v něm volám nějaký jiný skript ("B"). Skript B volám ze skriptu A na více místech a co potřebuju je, aby poprvé co je skript B zavolán, aby uložil cookie, nebo session, aby až bude znovu zavolán, provedl jinou akci. Dělám to následovně (úryvek ze skriptu B):
if($_SESSION["id".$id]!=1) {
$_SESSION["id".$id] = 1;
...
}

nebo případně pro cookies:
if($_COOKIE["id".$id]!=1) {
setcookie("id".$id, "1", time() + 60*60*24, "/");
...
}


No a problém je v tom, že cookie/session se sice v pořádku uloží hned při prvním volání skriptu B, jenže stejně se pořád provádí vnitřek výše zmíněné podmínky. Jakto?... Když stránku refreshnu, tak už je to v pořádku a neprovádí se, ale při prvním spuštění to takhle blbne. A já nevím jestli je potřeba aby se provedl refresh než se cookies/sessions detekují, nebo jestli je něco jiného špatně? - A jestli to je s tím refreshem takhle špatný, tak jestli někdo neví jak by to šlo vyřešit jinak?

Díky moc za rady!
DarkMeni
Profil
Zkus podmínku if(isset())
session_start();
if(!isset($_SESSION["id"]) || $_SESSION["id"]!=1){
  $_SESSION["id"] = 1;
  //A nějakej mooc zajímavej skript :)
}
baldur
Profil *
to už jsem bohužel taky zkusil, nedetekuje to ani jedno :/
YoSarin
Profil
Nemění se v průběhu mezi jednotlivými vkládáními skriptu to $id?

edit:
Další možnost je nespoléhat jen na nastavení $_SESSION, ale definovat třeba nějakou konstantu:
if(!isset($_SESSION["id".$id]) && !defined('SESSION_SET')) {
  $_SESSION["id".$id] = 1;
  define('SESSION_SET', true);
  // další kód
}

DarkMeni
Profil
Jako co máš proměnnou $id? Ta se vygeneruje nebo je z něčeho vytažená?
A ten soubor voláš includováním, requirem nebo jiným způsobem?
baldur
Profil *
[#4] YoSarin
$id se nemění, nechal jsem si ho vypsat a je vždycky stejný. A s tou konstantou nevím - je to totiž dynamicky generovaný iframe na stránce, ve kterém je tento skript. Takže když v jednom definuju konstantu tak k ní druhý nebude mít přístup, ne?

[#5] DarkMeni
$id beru z databáze. A volání viz odpověď YoSarinovi
YoSarin
Profil
baldur:
A ten iframe se vkládá vícekrát na jednu a tu samou stránku? Pak to nejspíš bude tím, že při dotazu na skript se neposílá žádné sessionid (protože odpovídající cookie ještě není nastavená) a tak se vytvoří několik nových session.
Komunikace serveru s prohlížečem probíhá cca takhle:

1) Prohlížeč pošle request na stránku, request obsahuje všechny get, post parametry a nějaké hlavičky (které obsahují i cookie pro danou (sub)doménu - pokud prohlížeč žádné cookies nemá, tak je nepošle)
2) Server odešle zpátky odpověď, kterou vygeneroval na základě requestu (poslaných get, post, cookies, ... a dalších parametrů)

Pokud otevřeš stránku s rámy, pošleš na server paralelně několik požadavků. Když otevíráš takovouto stránku poprvé, tak nemáš žádné cookie, které by prohlížeč serveru mohl poslat -> pošleš X requestů bez cookies -> dostaneš X odpovědí s X vygenerovanými cookies (resp. bude to jen jedna cookie, ale Xkrát přegenerovaná).

A ano, v tomhle případě tě definování konstanty nezachrání...
baldur
Profil *
[#7] YoSarin
Ano, vkládá se na tu stejnou stránku... Tak to je problém. A nenapadá tě nějaký způsob jak by tahle funkcionalita šla provést?
Asi jediný co mě napadlo je ukládat například ip adresu do databáze, se kterou by si každý ten iframe ověřil jestli už tam daná ip není, ale tenhle způsob se mi moc nezamlouvá, je to podle mě trochu neefektivní řešení.
DarkMeni
Profil
Ukázal by jsi malý úryvek iframu a popsal co má dělat?
baldur
Profil *
No na tom ani moc nesejde, to co jsem uvedl výše je ukázka, to je vlastně všechno co od toho potřebuju, jen aby ten další iframe věděl že už nemá provádět to co je v if, ale to co je v else :)
baldur
Profil *
Nikdo? Takže asi nějaký elegantnější způsob než zápis záznamu do databáze nenajdu, že?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0