ugrás a tartalomhoz

a kétszer küldött űrlap esete

a.d.a.m · 2006. Május. 15. (H), 07.39
Sziasztok.
Adott egy űrlap aminek az adatait le szeretném menteni. Ezzel nincs is probléma, a gond ott kezdődik, hogy ez a mentés kétszer történik meg. Szeretném a segítségeteket kérni, annak megoldásában, hogy miért lehet ez és mi lehet rá a megoldás.

Az elküldés gombra kattintva (a form így néz ki
form name="adat" method="post" enctype="application/x-www-form-urlencoded" onsubmit="return formCheck(this);"
) végrehajtódik ez a script:
function formCheck(formobj){
	var fieldRequired = Array("megr_nev", "megr_cim", "penz", "megnev", "elerhet");
	var fieldDescription = Array("Megrendelő neve", "Megrendelő címe", "Pénzfeladás módja", "Megnevezés", "Elérhetőség");
	var alertMsg = "Kérem töltse ki az alábbi mező(ke)t:\n";
	
	var l_Msg = alertMsg.length;
	
	for (var i = 0; i < fieldRequired.length; i++){
		var obj = formobj.elements[fieldRequired[i]];
		if (obj){
			switch(obj.type){
			case "select-one":
				if (obj.selectedIndex == -1 || obj.options[obj.selectedIndex].text == ""){
					alertMsg += " - " + fieldDescription[i] + "\n";
				}
				break;
			case "select-multiple":
				if (obj.selectedIndex == -1){
					alertMsg += " - " + fieldDescription[i] + "\n";
				}
				break;
			case "text":
			case "textarea":
				if (obj.value == "" || obj.value == null){
					alertMsg += " - " + fieldDescription[i] + "\n";
				}
				break;
			default:
			}
			if (obj.type == undefined){
				var blnchecked = false;
				for (var j = 0; j < obj.length; j++){
					if (obj[j].checked){
						blnchecked = true;
					}
				}
				if (!blnchecked){
					alertMsg += " - " + fieldDescription[i] + "\n";
				}
			}
		}
	}

	if (alertMsg.length == l_Msg){
		formobj.action = "hirdetes.php";
		formobj.submit();
		return true;
	}else{
		alert(alertMsg);
		return false;
	}
}
. A feladata az lenne, hogy leellenőrizze, minden szükséges mező ki lett-e töltve, ha igen átdobja a látogatót a hirdetes.php oldalra, ahol a következő script fut le:
<?php
$id = strftime("%c", time());

$tovabb = "hird-felt.html";	

$keys = array_keys($_POST);
$count = count($_POST);

for ( $array_index=0; $array_index<=($count-1); $array_index++ )
	{
	if ($array_index==0)
		{$szovege = "A(z) ".$keys[$array_index]." mező értéke: ".$_POST[$keys[$array_index]]."\n";}
	else
		{$szovege .= "A(z) ".$keys[$array_index]." mező értéke: ".$_POST[$keys[$array_index]]."\n";}
	}

$fname = "hirdetesek/szoveges".$id.".txt";
$szoveges = fopen($fname, "a");
fwrite($szoveges, $szovege);
fclose($szoveges);

unset($_POST);
unset($_SESSION['upload']);
unset($_SESSION['return']);
unset($_SESSION);

echo "<script>window.location.replace('".$tovabb."');</script>";
?>
. A végeredmény egy txt file lenne. Csakhogy mind az űrlap elküldése, mind a txt file létrehozása kétszer történik meg.
Kérlek segítsetek. Előre is köszönöm!
 
1

tipp

Anonymous · 2006. Május. 15. (H), 07.57
a formCheck függvény végén ha igaz ágra futsz, akkor egyrészt meghívod a submit függvényt, másrészt return true-val elintézed, hogy az űrlapod is leokézd. a html form tagben nincs action? ha nincs, akkor elvileg ugyanaz az oldal kapja meg a post kérést.
szerintem kikapcsolt javascripttel is próbáld ki, ha úgy is kétszer kapsz meg mindent, akkor máshol van a hiba, de ha úgy jó, akkor a js-ben van a gond. és a gond szerintem a submit és a return true. a submitot kihagyhatod, ha igazzal térsz vissza akkor is megtörténik a submit esemény /végülis egy submit gombra kattintasz/.

gex
2

köszönöm!

a.d.a.m · 2006. Május. 15. (H), 09.19
A probléma megoldódott valóban a submit-return kettősség okozta a gondot. Nekem fel sem tűnt. Köszönöm a segítségedet.
3

server oldalon kötelező ellenőrizni

Hodicska Gergely · 2006. Május. 15. (H), 09.39
Azt sose felejtsd el, hogy kliens oldalon ki lehet kapcsolva JS, meg amúgy bárki olyan adatot küld neked, amit csak szeretne, ezért alapvető dolog, hogy mindig végzel szerver oldali ellenőrzést is.


Felhő
4

js nélkül

Anonymous · 2006. Május. 15. (H), 09.48
a kikapcsolt javascript a hird-felt.html-re való továbbításban is zavaró lehet, erre vannak sokkal jobb függvények is.

php oldalon még figyelmedbe ajánlanám a foreach vezérlési szerkezetet, nagyon hasznos tud lenni.

gex
5

megfogadom

a.d.a.m · 2006. Május. 15. (H), 14.36
Beszúrtam egy htmlspecialchars-t az egyes mezők értékeinek rögzítésénél. A foreach-t ismerem, de itt jó megoldásnak tűnt a for szerkezet, mert a kezdet kezdetén még úgy tűnt szükség lesz az adatok szűkítésére. Ami a header függvényt illeti, még sosem használtam így bizonytalan vagyok a használatát illetően, de úgy rémlik (lehet hogy rosszul tudom) mintha csak a file elején - minden más elem előtt - lehetne használni. De meggondolom a javaslatot, mindenesetre kiteszek egy figyelmeztetést az oldalra, hogy csak bekapcsolt JS-sel használható (tökéletesen) az oldal.
Köszi a figyelmeztetést
6

tévhit

Hodicska Gergely · 2006. Május. 15. (H), 15.03
a header függvényt illeti, még sosem használtam így bizonytalan vagyok a használatát illetően, de úgy rémlik (lehet hogy rosszul tudom) mintha csak a file elején - minden más elem előtt - lehetne használni

Nincs ilyen megkötés. Arra kell csak figyelni, hogy a parancs kiadása előtt még ne legyen a scriptnek kimenete, de még ez sem gond, ha esetleg az output buffering be van kapcsolva.

Szóval használd bátran. Persze ez igényelheti akár kódjaid átszervezését is, de megéri. Pl. egy tisztességes PHP oldal csak egyszer ír a kimnetre.


Felhő
7

Kivéve...

janoszen · 2006. Május. 15. (H), 15.57
Kivéve akkor, ha a processelés közben fellép egy unhandled exception és van rá definiálva globális kezelő, ami kidob egy 500-as hibát. Akkor a kimenet megkezdése után is szükség lehet a headerek fölülírására.
8

biztos?

Őry Máté · 2006. Május. 15. (H), 16.06
és biztos, hogy amikor ez föllép, már kellett legyen kimenet?
9

Nem...

Anonymous · 2006. Május. 15. (H), 16.43
Nem kellett, de lehetséges. Nem tudhatod. Főleg, ha nem Te fejleszted a rendszert, előfordulhat, hogy valamelyik programozó úgy érzi, hogy feltétlenülkell dobnia egy exceptiont. És még mindig jobb az, hogy ha egy kultúrált 500-as hibaüzenetet kap a user, mint ha egy angol technikai szöveget. Vagy éppen semmit... Nem? :D
10

Login..

janoszen · 2006. Május. 15. (H), 16.44
Bocsi, elfelejtettem bejelentkezni. Szal én voltam.
11

nem túl valószínű

Hodicska Gergely · 2006. Május. 16. (K), 00.00
Kivéve akkor, ha a processelés közben fellép egy unhandled exception és van rá definiálva globális kezelő, ami kidob egy 500-as hibát.

Ha megnézel pár szélesebb körben használt keretrendszert, akkor azt fogod látni, hogy a kimenet kiírása kb. az utolsó sor, ott már nem nagyon fordulhat elő kivétel.

Akkor a kimenet megkezdése után is szükség lehet a headerek fölülírására.

Ilyet nem lehet csinálni.


Felhő
12

Jogos...

janoszen · 2006. Május. 16. (K), 11.10
Majd megnézem a nagyobb keretrendszereket, csupán annyi volt az érv, hogy házilag gyorsan összedobott CMS vagy hasonlónál szükség lehet rá. Ha valaki így szeretne fejleszteni, akkor hajrá. Adtam egy módszert. Ha meg nem, akkor nem. :) Ennyi a történet.
13

Kivétel

attlad · 2006. Május. 16. (K), 16.37
Inkább az lehet a kivétel ha valamiért folyamatosan kell megjeleníteni a kimenetet (PHP-ban ob_start, flush, ilyesmi segítségével), szerencsére ilyenre nem gyakran van szükség.