Session - ispravan način? (po PS-u?)

Bok,

Mučim se malo sa sessionima. Ako ste vidjeli već sam nekoliko puta pitao nešto u vezi sessiona. Nadao sam se da nisam glup, ali očito jesam :krele: Možda sam neke stvari krivo shvatio od početka. Tražim malo na forumu i guglam ali bolje je da iskreno pitam da mi netko pbjasni po PS-u.

Trenutno radim:

  • Formu od 250 pitanja na 10 stranica i 11. stranica sprema sve odgovore u bazu.
  • Koristio sam session varijable od element_1 do element_250
  • na svakoj stranici FOR petljom definiram ovaj kod za prethodnu stranicu.
    $SESSION['element’.$element.’’.$i] = $POST['element’.$element.’’.$i];

I to radi, ALI:

  • tipku BACK ne smijem nipošto koristiti jer mi izbaci “Resend” i nakon resenda mi se prethodna forma obriše i razjebe se sve.
  • Možda je najbolje reći da koristim session_start(); u 1. redu svakog filea - znači prije . To mi je malo čudno za skužiti jer ASP ima global.asa/.asax i sve te fore su tamo definirane i nema startanja sessiona posebno. Čitam da session_start(); treba ići na svaku stranicu, ali čini mi se kao da tom naredbom počne sve ispočetka???

Ako ne koristim session_start(); na svakoj stranici, forma mi se uredno čita sa previous i next tipkama, ali naravno, session varijable se ne prenose.

KAJ RADIM KRIVO?! :smiley:

Neka imaš stranice A, B i C. Stranice A i B imaju formu. Otvorio si stranicu A i popunio formu nekim podacima forme F(A), stisnuo Submit i podnio te podatke na stranicu B gdje su dobavljivi kroz POST varijablu.

Na stranici B također imaš formu, koja se prikaže u svom resetiranom stanju, ti je popuniš s podacima F(B), stisneš Submit i podneseš na stranicu C gdje su ti podaci vidljivi kroz POST.

Kada stisneš Back, tvoj preglednik otkrije da želiš učitati stranicu B. Međutim, tu je stranicu on bio “otvorio” tako što je na server podnio podatke s forme stranice A, F(A), pa te pita da li da to pošalje ponovo. Ti kažeš “da” i sada se otvara stranica B, koja dobiva podatke F(A) raspoložive kao POST. Međutim, podaci F(B) (oni koji su bili raspoloživi na C kroz POST) su sada izgubljeni. F(A) se pohranjuje ponovo iz POST varijable u spremnik sjednice, ali se forma prikazuje u svom resetiranom stanju i trebaš je ponovo popuniti.

Prilikom prikaza stranice X, nakon što si pohranio podnesene podatke prethodne F(X-1) raspoložive kroz POST, pregledaj varijablu SESSION kako bi vidio da li su već ranije bili pohranjivani podaci od forme stranice X, podaci F(X), pa formu stranice X inicijaliziraj na te pohranjene podatke.

session_start() moraš koristiti - to samo inicijalizira modul za sjednice na toj stranici (svaka stranica je program za sebe, zato i trebaš sjednice da pamte stanje).

Pazi samo da prilikom učitavanja stranice B, kod pohrane F(A) zbog logičke pogreške ne “pregaziš” pohranjene podatke i od stranice B, F(B) (a i “kasnijih” stranica) - zato što si zaboravio da je moguće stranicu B učitati i nakon što su njeni podaci već pohranjeni u C.

P.S.:

Kada riješiš taj problem (ali prvo riješi taj problem), baci oko na ovo:

Hvala ti na odličnom objašnjenju, samo te ipak molim ako ti nije problem da mi daš neki primjer koda da ne pogriješim u kodiranju za ovo što si napisao:

Tj. da mi ne dođe do ovoga što si zadnje napisao :slight_smile:

Pa, ako na stranici B prikazuješ formu s pitanjem broj 100, recimo, onda prilikom ispisa HTML-a za to pitanje provjeri da li u $SESSION već postoji pohranjena vrijednost za to polje.

I nemoj prije toga upisati nešto na to mjesto u $SESSION.

tserega za profesora!

Ispričavam se na spamu :smiley:

Zašto jednostavno ne koristiš javascriptu (jQuery) te kako korisnik klikne submit samo mijenja korake, znači spremiš u neku varijablu trenutan broj stranice i kad klikne na submit povećaš tu varijablu i promjeniš formu. Ukoliko znaš imalo jQuery trebao bi ovo skuzit

Slazem se s ovim gore, zasto jednostavno ne napraviti kompletnu formu u jednom dokumentu, a koristeci jednostavni javascript prikazati formu u onoliko koraka (“stranica”) koliko ti je potrebno?

Ja sam davno imao sličan problem i radio sam u PHP frameworku koji je kopija od ASP i riješio sam problem preko view state. Session ti uopće ne treba.
View state je, koliko sam shvatio u korištenom frameworku, 2 way encodirane varijable i nijhove vrijednosti koje se spremaju unutar HTML.
E sad ja sam radio sa komponentom no u tvojem slučaju to bi izgledalo ovako.
Napraviš jedanu stranicu sa više view, ovisno o koraku.
I cijelo vrijeme spremaš podatke u view state te stranice.
I na zadnjem koraku uzemš sve podatke iz view stata.

Famozni “session” je običan, najobičniji cookie koji sadrži identifikator preko kojega se određuje “datoteka” u kojoj su pohranjeni podaci sjednice. (“Datoteka” je u navodnicima, jer ne znam kako PHP rješava pohranu sjednice - svaku u svoju datoteku, u nekakvu bazu podataka, štogod - u konačnici, to je nebitno).

Viewstate je na koncu ista stvar, samo što je taj “identifikator” spremljen u INPUT type=“hidden” polju. Ponovo, u ASP-ovoj realizaciji “viewstate” sadrži više podataka od toga, ali se u principu stvar svodi na isto - preglednik čuva neko “stanje” i šalje ga sa svakim zahtjevom serveru, kako bi server mogao “restaurirati” sjednicu, jer je HTTP tzv. “stateless” protokol.

Samostalno mu baš nitko ne brani da u query-stringu drži nekakav “identifikator” sjednice i seli ga od stranice do stranice, pa preko tog identifikatora dohvaća ostale podatke “sjednice” spremljene bilo gdje i bilo kako. Ili da ga drži u nekakvom INPUT hidden polju ili da ga sprema u cookie.

Sve se u svojoj osnovi reducira na isto. Sve ostalo su samo specifične varijacije na istu temu.

Javascript hoće ili neće korisiti ovisno o tome želi li računati da isti postoji na klijentu ili ne.

Kužim vas sve u teoriji, ali moram priznati da mi praksa još malo šteka. Recimo da sam na nivou 5 u web programiranju (i općenito u programiranju), a vi majstori ste cca 8-10 :wink:
Još nisam krenuo u ovo jer sam zapeo na jednoj drugoj stvari pa to sada rješavam, no vjerojatno ću se s time pozabaviti za vikend. Tsereg je to odlično objasnio u teoriji i kužim ga. Javascript još malo zaobilazim. Vidim da sam tek počeo kužiti gdje nešto trebam promjeniti u gotovim skriptama. Mislim svo programiranje se svodi na isto, da li je Java, C ili Visual Basic, ali ipak sam najbliži Visual Basicu, pa onda C-u dok sam Javu izbjegavao.

Iako mi se također sessioni ne sviđaju, ali mislio sam da su oni nužnost, a ne nužno zlo. No ući ću malo dublje i u ostale metode, pa ću shvatiti kako stvari funkcioniraju. Vrijeme je za neku knjigicu.

Ukoliko se zelis izricito drzati podalje od koristenja javascripta (ako ga klijent ne koristi :zbunj: ), mozes koristiti PHP-ove integrirane funkcije za rad sa cookie-ima, te sav sadrzaj formi umjesto u $_SESSION varijabli drzati u cookijima. Naravno, opet bi ti svaka stranica trebala imati jedinstveni identifikator pomocu kojeg bi vadio odredjeni cookie, ali na taj nacin izbjegavas “resendanje” forme.
E sad, sto ako korisnik blokira koristenje cooki-ja? :krele:

[quote=“0kultis”]Ukoliko se zelis izricito drzati podalje od koristenja javascripta (ako ga klijent ne koristi :zbunj: ), mozes koristiti PHP-ove integrirane funkcije za rad sa cookie-ima, te sav sadrzaj formi umjesto u $_SESSION varijabli drzati u cookijima. Naravno, opet bi ti svaka stranica trebala imati jedinstveni identifikator pomocu kojeg bi vadio odredjeni cookie, ali na taj nacin izbjegavas “resendanje” forme.
E sad, sto ako korisnik blokira koristenje cooki-ja? :krele:[/quote]Jebeš cookie, što ćeš ako je korisnik blokirao cookie?

Cookieji ne služe tome da zamjene bazu podataka. Oni su i ograničeni veličinom, ne možeš filati u njih stvari.

Stičem dojam da se među nekima od vas razvila pogrešna i neutemeljena ideja da je korištenje PHP-ovog mehanizma “sjednica” loša praksa. Bilo bi dobro da se to ipak malo elaborira.

[quote=“tsereg”]
Stičem dojam da se među nekima od vas razvila pogrešna i neutemeljena ideja da je korištenje PHP-ovog mehanizma “sjednica” loša praksa. Bilo bi dobro da se to ipak malo elaborira.[/quote]

Baš sam isti dojam i ja dobio.

Ne znam, GLUP SAM! :grrrr: Za*ebavam se s tim cijeli dan. Evo kompletnog koda kojeg koristim sa izmišljenim vrijednostima. 3 strane i 4. je submit za bazu.
Što točno trebam napraviti da izbjegnem resend i da i zapamti podatke? Molim za pomoć, vjerojatno je 2-3 linije koda “negdje”. Izbjegnite Javascript molim vas, iako ga imam u Submitu.

Svi elementi su ovaj čas izmišljeni (tj. prepravljeni), jer mislim da će stranka željeti tajnost podataka. Stoga zanemarite vrijednosti. Formu sam prvotno stvorio nekim generatorom pa ima polja/vrijednosti za koja mislim da mi uopće nisu potrebni: ID i For za elemente forme te kod submit gumba. Taj hidden input može poslužiti ako upotrijebim metodu koja njega koristi, ali odlučio sam se za Sessione pa mislim da mi ne treba. Jesam u pravu?

  1. stranica:

    <?php session_start();?> <?php include 'inc_head.html'; //css i meta tagovi, nije bitno?>

    OPĆI PODACI

    1. Fotografija

    • 2. Odaberite životinju

    • pas mačka ptica
     	<p>3. Opis</p>
     	<li>
     	    <div>
     	    <textarea id="element_3" name="element_3" class="element textarea small"></textarea>
     	    </div>
     	</li>				
    
     	<li class="buttons">
     		<input type="hidden" name="form_id" value="449490" />
     		<input id="saveForm" class="button_centar" type="submit" name="submit" value="Slijedeća stranica" />
     	</li>
     	</ul>
     </form>	
    

Stranica 2.

<?php session_start();
//Prva stranica podataka je malo specifična pa su Session varijable dodane ručno bez petlje.

$_SESSION['foto1_name'] = $_FILES['element_1']['name'];
$_SESSION['foto1_size'] = $_FILES['element_1']['size'];
$_SESSION['foto1_type'] = $_FILES['element_1']['type'];
$_SESSION['foto1_tmp'] = $_FILES['element_1']['tmp_name'];
move_uploaded_file($_SESSION['foto1_tmp'], "http://www.webmajstori.net/forum/images/".$_SESSION['username']."/".$_SESSION['foto1_name']);
if (isset($_POST['element_2'])) {
	$checkboxes = $_POST['element_2'];
	$_SESSION['element_2'] = implode($checkboxes,","); 
	unset($checkboxes);
}
$_SESSION['element_3'] = $_POST['element_3'];

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php include 'inc_head.html'; ?>
</head>
<body id="main_body" >

	<div id="form_container">

		<form id="forma" class="form_block"  method="post" action="forma_str3.php" accept-charset="utf-8" enctype="multipart/form-data">		
			<ul >	
				<li>
					<label class="description" for="element_4">Naziv: </label>
					<div>
						<input id="element_4" name="element_4" class="element text medium" type="text" maxlength="255"/> 
					</div> 
				</li>
				<li>
					<label class="description" for="element_5">Županija: </label>
						<select class="element select medium" id="element_5" name="element_5"> 
							<option value="" selected="selected">odaberite županiju</option>
							<option value="1">Bjelovarsko-bilogorska</option>
							<option value="2">Brodsko-posavska</option>
							<option value="3">Dubrovačko-neretvanska</option>
							<option value="4">Istarska</option>
							<option value="5">Karlovačka</option>
							<option value="6">Koprivničko-križevačka</option>
							<option value="7">Krapinsko-zagorska</option>
							<option value="8">Ličko-senjska</option>
							<option value="9">Međimurska</option>
							<option value="10">Osječko-baranjska</option>
							<option value="11">Požeško-slavonska</option>
							<option value="12">Primorsko-goranska</option>
							<option value="13">Sisačko-moslavačka</option>
							<option value="14">Splitsko-dalmatinska</option>
							<option value="15">Šibensko-kninska</option>
							<option value="16">Varaždinska</option>
							<option value="17">Virovitičko-podravska</option>
							<option value="18">Vukovarsko-srijemska</option>
							<option value="19">Zadarska</option>
							<option value="20">Grad Zagreb</option>
							<option value="21">Zagrebačka</option>
						</select>
				</li>	
				<li>
					<label class="description_full" for="element_6">Da/Ne pitanje?  </label>
					<span class="middle">
						<input id="element_6_1" name="element_6" class="styled" type="radio" value="Da" />
						<label class="choice" for="element_6_1">Da</label>
						<input id="element_6_2" name="element_6" class="styled" type="radio" value="Ne" />
						<label class="choice" for="element_6_2">Ne</label>
					</span> 
				</li>	
				<li class="buttons">
					<input type="hidden" name="form_id" value="449490" />
					<input id="saveForm" class="button_text" type="submit" name="submit" value="Slijedeća stranica" />
					<INPUT TYPE="button" VALUE="Prethodna stranica" onClick="history.go(-1);return true;" class="button_back">					
				</li>
			</ul>
		</form>	
	</div>
	</body>
</html>
  1. stranica

    <?php session_start();

    //rigister session variables
    for ($element = 4; $element < 7; $element ++) {
    $SESSION['element’.$element] = $POST['element’.$element];
    }

    ?>

    <?php include 'inc_head.html'; ?>
    • Neki naziv?
    • Da/Ne? Da Ne
    • I još jedan checkbox? Crno Bijelo Plavo Zeleno Sivo
    • Slažemo se sa Uvjetima i potrđujemo prijavu!
     		</ul>
     	</form>	
     </div>
     </body>
    

    Processing page:

    <?php session_start();?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <?php include 'inc_head.html'; ?>
    </head>
    <body id="main_body" >
    	<div id="form_container">
    <?php
    if(empty($_POST['agree']) || $_POST['agree'] != 'agree')
    {
    ?>
    		<form id="forma" class="form_block"  method="post" action="forma_final.php" accept-charset="utf-8">
    			<p>Niste potvrdili prijavu pritiskom na odgovarajuće polje. Ako želite predati prijavu, molimo da se vratite na prethodnu stranicu i da kvačicom potvrdite da se slažete sa Uvjetima i da zaista potvrđujete prijavu. 
     Hvala!</p>
    					
    				
    				<li class="buttons">
    					<input type="hidden" name="form_id" value="forma" />
    					<INPUT TYPE="button" VALUE="Prethodna stranica" onClick="history.go(-1);return true;" class="button_centar">
    				</li>		
    				
    			</ul>
    		</form>	
    
    <?php
    }
    else {
    include 'config.php';
    
    
    mysql_query("insert into table (
    				element_1, element_2, element_3.................................
    					) values (
    '" . $_SESSION['element_1'] . "','" . $_SESSION['element_2'] . "','" . $_SESSION['element_3'] . "','" ................ "'
    						)")
    or die(mysql_error());  
    
    mysql_close($connection); 
    ?>
    		<form id="forma" class="form_block"  method="post" action="forma_plaze_final.php" accept-charset="utf-8">
    			<p>Prijava je uspješno predana. Hvala!</p>
    		</form>	
    <?php
    }
    ?> 
    	</div>
    	<img id="bottom" src="bottom.png" alt="">
    	</body>
    </html>
    

Ako netko ima dobru namjeru pomoći, mogu mu poslati i link na PM. Sorry, ne mogu javno.

Resend može izbjeći samo ako koristiš AJAX (To je dio javaskripte) nikako drugačije, jer s PHPom ti refreshas stranicu i procesiraš te podatke dok kod ajax ne refreshas i sve je popularniji na stranicama…

Još sam zaboravio neke stvari napomenuti. Ovi neki komentari u kodu su za vas, a vidim da sam na zadnjoj stranici (4) zaboravio dodati kod za stvaranje Session varijabli iz 3. stranice.

@System32 - Gledao sam ja ovo i sviđa mi se, ali mislim da bi mi uzelo nekih 4-5 dana da to ispočetka nakucam i da uredim. Neda mi se. Iako ću nastojati slijedeći ovakav projekt napraviti javascriptom, ali pitaj Boga kad ću ikad više raditi ovakvu ogromnu formu. Možda će biti mini anketa sa 20-30 pitanja i gotovo.

[quote=“ex_profa”]Još sam zaboravio neke stvari napomenuti. Ovi neki komentari u kodu su za vas, a vidim da sam na zadnjoj stranici (4) zaboravio dodati kod za stvaranje Session varijabli iz 3. stranice.

@System32 - Gledao sam ja ovo i sviđa mi se, ali mislim da bi mi uzelo nekih 4-5 dana da to ispočetka nakucam i da uredim. Neda mi se. Iako ću nastojati slijedeći ovakav projekt napraviti javascriptom, ali pitaj Boga kad ću ikad više raditi ovakvu ogromnu formu. Možda će biti mini anketa sa 20-30 pitanja i gotovo.[/quote]
Zašto bi ti trebalo 4-5 dana, ja sam to skuzio u jedan dan s tim da sam gledao tutorijal na engleskom, a ja ti dajem tut na hrvatskom: PHP & jQuery Tutorial | AJAX Login Obrazac [HD] - YouTube
imaš na mom kanalu još tutorijala pa ako te zanima i oćeš još naučit pogledaj neke tutorijale :slight_smile:


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja