webForumDet fria alternativet

Valideringsproblem i OPTION-tag

34 svar · 799 visningar · startad av lillebror

lillebrorMedlem sedan apr. 20041 687 inlägg
#1

Hej!

Jag håller på och designar ett eget forum just nu och har kommit till ett litet problem. I forumet så finns det en snabbvalsfunktion där man kan välja vilket forum man vill besöka. Eftersom de olika forumen är indelade i olika kategorier så har jag i OPTION-taggen i formuläret loopat ut kategorin och sen de forumen som finns där under. Denna lösning fungerar bra så när som på ett undantag. När en användare väljer något annat än de rödmarkerade alternativen i den bifogade bilden blir det av förklarliga skäl fel i koden eftersom den mottagande funktionen förväntar sig ett forumID som den då aldrig får.

Hur kan man lösa valideringen på något smart sätt? Skulle vilja ha kategorierna kvar om det är möjligt för tydlighetens skull :)

forum.jpg
Peter SMedlem sedan dec. 20025 484 inlägg
#2

Exempel: Sätt -1 som värde i de <option>-element som inte skall gå att välja:

<option value="-1">===========</option>

Om "OK"-knappen är till för att skicka iväg besökaren kan du sedan göra så här:

<form onsubmit="return this.elements['namn_på_select'].options[this.elements['namn_på_select'].selectedIndex].value != -1">

Alternativt lägga ovanstående i en funktion. Typ.

lillebrorMedlem sedan apr. 20041 687 inlägg
#3

På det hela taget så fungerar det väldigt bra Peter! :) Tack för hjälpen! Nu får jag inte problemen med felaktiga värden i SQL-frågorna och det är bra.

Dock skulle jag vilja att det inte gick att välja dessa rader med "-1" samtidigt som man klickar på OK-knappen. För användaren kommer bara till ett forum som inte finns i databasen och det känns inte riktigt bra. Kan man lösa det på något sätt?

Peter SMedlem sedan dec. 20025 484 inlägg
#4

Vad menar du med att användaren kommer till ett forum som inte finns? I koden ovan händer ju ingenting om ett ogiltigt val är valt och "OK" trycks ned.

lillebrorMedlem sedan apr. 20041 687 inlägg
#5

Vad jag menar är att det finns inget som stoppar användaren från att klicka på OK-knappen när ett alternativ med value="-1" är valt! :)

Peter SMedlem sedan dec. 20025 484 inlägg
#6
function f(obj){
    var elms = obj.form.elements,
	opts = obj.options;

    elms['namn_på_OK'].disabled = (opts[elms['namn_på_select'].selectedIndex].value == -1);
}

<select onchange="f(this)"...

Om defaultvalet är ogiltigt kan du sätta "OK"-knappen till disabled i HTML-koden.

lillebrorMedlem sedan apr. 20041 687 inlägg
#7

Peter S skrev:

<select onchange="f(this)"...

this - ska det stå så ordagrant eller är det en variabel jag ska sätta dit?

Peter SMedlem sedan dec. 20025 484 inlägg
#8

Det skall stå så. this refererar till <select>-elementet.

lillebrorMedlem sedan apr. 20041 687 inlägg
#9

Ok.

lillebrorMedlem sedan apr. 20041 687 inlägg
#10

Fungerar klockrent nu. Vilket klippa du är! ;)

lillebrorMedlem sedan apr. 20041 687 inlägg
#11

Denna funktion slutade helt plötsligt att redirecta som den gjorde precis när jag var klar med den. Vet inte riktigt vad jag ställt till med som fått den att ge upp?!:OO Istället för att redirecta till ett annat forum som jag väljer med SELECT-taggen skickar den ut mig till index.php i root-katalogen när det borde vara forumdisplay?forumID=1 exempelvis.

Den mottagande kod jag använder för att hantera formuläret är:

if(trim($_POST['chooseshortcut']) == 'OK') {
	$forumdata['forumID'] = trim($_POST['forumshortcutID']);
	#echo "FORUM: ".$forumdata['forumID'];
	#echo "<script Language='JavaScript'>location.href=('"../forum/forumdisplay.php?forumID=".$forumdata['forumID']."');</script>";
	header("Location: ../forumdisplay.php?forumID=".$forumdata['forumID']);
}

Så här ser koden ut i formuläret:

<script language="JavaScript" src="../inc/function.js"></script>

<form action="../inc/include.form.forum.php" method="post">
	<?php $RSobj_forum_category = getCategory(); ?>
	<table width="100%" cellspacing="0px" cellpadding="0px">
		<tr>
			<td style="font-size: 10px; font-weight: bold; width: 38%;">Snabbval:</td>
		</tr>
		<tr>
			<td style="width: 38%;">
			<SELECT name="forumshortcutID" size="1" onchange="f(this)">
			<?php while($forumcategory = mysql_fetch_array($RSobj_forum_category)) {
				$RSobj_shortcut = showShortcutForumList($forumcategory['categoryID']); ?>
				<OPTION value="-1"><?php echo $forumcategory['title']; ?>
				<OPTION value="-1">===============================
					<?php while($shortcut = mysql_fetch_array($RSobj_shortcut)) { ?>
						<?php if($shortcut['forumID'] == $RSobj_forum['forumID']) { ?>
						<OPTION value="<?php echo $shortcut['forumID']; ?>" SELECTED>- <?php echo $shortcut['title'];
						} else { ?>
						<OPTION value="<?php echo $shortcut['forumID']; ?>">- <?php echo $shortcut['title'];
						}	
					} ?>
			<OPTION value="-1">&nbsp;
			<?php }
			?>
			</SELECT>
			</td>
			<td align="left"><input name="chooseshortcut" type="submit" value="OK" /></td>
		</tr>
	</table>
</form>

Javascriptet:

function f(obj) {
    var elms = obj.form.elements,
	opts = obj.options;

    elms['chooseshortcut'].disabled = (opts[elms['forumshortcutID'].selectedIndex].value == -1);
}

Någon med skarpa ögon som kan komma på vad det är för fel?!

Peter SMedlem sedan dec. 20025 484 inlägg
#12

Hur ser formulärkoden ut då den skickats till webbläsaren?

lillebrorMedlem sedan apr. 20041 687 inlägg
#13

Jag vill minnas när jag kollade att variabeln och värdet var mottaget korrekt i formulärhanteringsfunktionen. Var det det du syftade på?

Finns det någon funktion som man kan göra en paus med i programkoden för att kunna se vad en echo-sats innehåller för värde? Annars flimrar det bara förbi och man hinner inte se :)

Här är länken till aktuell sida:
http://www.flygfyren.nu/forum/forumdisplay.php?forumID=1

Peter SMedlem sedan dec. 20025 484 inlägg
#14

Vad händer om du kommenterar bort

header("Location: ../forumdisplay.php?forumID=".$forumdata['forumID']);

och skriver ut

$forumdata['forumID']
lillebrorMedlem sedan apr. 20041 687 inlägg
#15

Jag har försökt att remma dem med det går ju så fort så man hinner aldrig se vad variabeln innehåller för värde...

Peter SMedlem sedan dec. 20025 484 inlägg
#16

Jo, men om du kommenterar bort header-raden navigeras du ju inte vidare. Då bör du kunna se vad variabeln innehåller.

lillebrorMedlem sedan apr. 20041 687 inlägg
#17

Jag har ju remmat bort den men jag åker vidare till till index.php ändå x(

Dock upptäckte jag en annan kodsnutt jag har ibörjan av sidorna för att kontrollera att querystringarna är korrekta. De remmade jag tills vidare eftersom om forumID visar sig vara noll kan det vara här processen stannar. Koden är som följer:

<?php 
	if($_GET['forumID'] == '') {
	echo "<script Language='JavaScript'>location.href=('forum.php');</script>";
	} else {
	$RSobj_thread = getForumThreads($_GET['forumID']);
	$RSobj_forum = showActiveForum($_GET['forumID']);
	}
	?>
lillebrorMedlem sedan apr. 20041 687 inlägg
#18

I den bifogade filen ser man hur som helst att forumID är rätt för respektive forum i select-satsen.

select.jpg
Peter SMedlem sedan dec. 20025 484 inlägg
#19

Värdet i ditt action-attribut i <form>-taggen är ../inc/include.form.forum.php. Skall det vara så?

lillebrorMedlem sedan apr. 20041 687 inlägg
#20

Peter S skrev:

Värdet i ditt action-attribut i <form>-taggen är ../inc/include.form.forum.php. Skall det vara så?

Ja det ska stämma.

Blir så arg för att jag uppenbarligen lyckats förstöra det hela :e Även när jag remmat det mesta åker jag ju raka vägen till index.php...

Genererad på 371 ms · cache AV · v20260730165559-full.f96bc7eb