10. oktober 2010 - 09:33 Der er 9 kommentarer og
1 løsning

Betinget redirect til en side afhaengigt af valg i en anden side.

Jeg har en application hvor brugeren kan vaelge byer per land og distrikt. I den simple udgave starter brugeren i dokument lande.php hvor der er der en form med action='districter.php' og en rulleliste med de bestaaende lande samt en input type submit.  I dokument districter.php er der en form med action='byer' med en rulleliste med distrikter i det valgte land og en input type submit.  Og i dokument byer.php kan brugeren saa vaelge by.

Men nogle lande er ikke inddelt i distrikter, og jeg vil gerne have det saaledes at hvis et land uden distrikter vaelges saa springes document distrikter.php over og brugeren gaar direkte til dokument byer.php.

Jeg kan teste om et land har distrikter ved at placere landets navn i en variabel $land og bruge denne query:

$harDistrikter = mysql_query("SELECT * FROM lande JOIN distrikter ON lande.id=distrikter.land WHERE lande.navn = $land");

if(mysql_num_rows($harDistrikter) > 0) [gaa til distrikter.php]
else [gaa til byer.php]

men naar systemet ved hvilket land der er valgt (ved valg i rulleliste og tryk paa submit) er det allerede for sent.

Saa forsoegte jeg, ved hjaelp af en onClick event, at skabe en sessionvariabel med det valgte land.  Ideen var at naar dokument distrikter.php aabnes testes der om der er distrikter i landet i sessionvariabelen, og hvis der ingen er sendes brugeren videre til byer.php.  onClick henviser til en javascript kode, men jeg synes ude af stand til at faa javascript til at saette en session variabel.  Jeg viser noget kode nedenfor.

Spoergsmaal:  er det korrekt at man ikke i javascript kan saette en session variabel?  (Noget med at javascript er browserscript og php er serverscript?)

Spoergsmaal:  Hvordan kan jeg springe distrikt.php over naar der vaelges et land uden distrikter?

Her er min kode:

<script type='text/javascript'>
function setVariabel()
{
  var selObj = document.getElementById('selLand');
  var selIndex = selObj.selectedIndex;
  var selLand = selObj.options[selIndex].value;
  $_SESSION['land'] = selLand;
}
</script>
<html>
<body>
<form action='districts.php method='POST'>
<select id='selLand'>
<option...
<input type='submit' onClick='setVariabel()' />
</select>
</form>
</body>
</html>
Avatar billede w13 Novice
10. oktober 2010 - 12:33 #1
Du kan ikke sætte Session-variabler vha. JavaScript. Du kan dog bruge AJAX-metoden i JavaScript til at kalde et PHP-dokument, der sætter variablen. Helt uden at brugeren kan se det eller at siden skal genindlæses. Det er dog nok lidt voldsomt at sætte sig ind i.

Hvorfor submitter du ikke bare først til en ny side, der handler din SESSION og så redirecter videre til den korrekte side?
Avatar billede w13 Novice
10. oktober 2010 - 13:00 #2
Her er dog noget om AJAX: http://www.eksperten.dk/guide/1301 :)
11. oktober 2010 - 06:16 #3
w13, for at vise at jeg stadig er i live (men jeg har haft travlt og det faar jeg ogsaa i dag) saa takker jeg for indlaeggene.  Jeg kommer tilbage saa snart som muligt.
Avatar billede cronaldo Nybegynder
11. oktober 2010 - 23:08 #4
Du kan vel bare lave det noget ala:

<form method="post" action="districter.php">
<select name="lande">

</select>

<input type="submit" name="submit" value="Send" />
</form>




Districter.php:
--------------
<?php

$harDistrikter = mysql_query("SELECT * FROM lande JOIN distrikter ON lande.id=distrikter.land WHERE lande.navn = $land");

if(mysql_num_rows($harDistrikter) > 0) [gaa til distrikter.php]
else [gaa til byer.php]

if( mysql_num_rows( $harDistrikter) > 0 )
{
  header("Location: distrikter.php");
} else {
  header("Location: byer.php");
}

?>
12. oktober 2010 - 10:20 #5
Saa lykkedes det vist.  cronaldo, jeg var allerede i gang med noget i retning af det du foreslaar, men du konkretiserede det lidt mere.  Jeg kom i gang med at taenke paa det efter W13's #1.  Et problem var at jeg i byer.php for at komme videre skulle bruge det valgte land.  Det valgte land overfoeres med POST til php.district og land og district overfoeres normalt til byer.php med POST.  I byer.php samler jeg de to variable op ved $land = $_POST['land'] og $district = $_POST['district'].  Det har jeg nu aendret saa jeg bruger $_REQUEST i stedet, og i starten af district.php siger jeg, efter min query for distrikter: 

if(mysql_num_rows($harDistrikter)>0) header("Location:byer.php?land=$land&distrikt=$distrikt").

Saa hvis der er distrikter gaar programmet sin normale gang.  $land vaelges i land.php og overfoeres til distrikt.php.  Der faar $distrikt sin vaerdi og begge ankommer i byer.php hvor de samles op af $_REQUEST..

Hvis der ikke der distrikter saa springes den del af distrikt.php over hvor $distrikt skulle faa vaerdi, og naar byer.php aabnes samles $land op med sin vaerdi og $distrikt op med NULL ved hjaelp af $_REQUEST.

Det er foroevrigt foerste gang jeg goer brug af GET og ? metoderne.  Det tog lidt filosofering og lidt googling.

Saa i gav mig hjaelp til selvhjaelp.  Opret venlgst svar begge to for points.
Avatar billede w13 Novice
12. oktober 2010 - 10:34 #6
:)
Avatar billede cronaldo Nybegynder
12. oktober 2010 - 11:18 #7
Jeg ville nok gøre noget ala dette:

if ( mysql_num_rows( $harDistrikter ) > 0 )
{
  header("Location: byer.php?land=" . $land . "&distrikt=" . $distrikt);
}

Det er kun udseendemæssigt, at det ændrer noget, men det gør det bare meget mere overskueligt hvis du skal have en til at arbejde videre med din kode senere hen.

Dernæst vil jeg nok bruge $_GET['land'] og $_GET['distrikt'] og HUSK nu at bruge mysql_real_escape_string og øvrige sikkerhedsforanstaltninger når du skal bruge information fra URL'en i din mysql-kode; ellers kan din database ret hurtigt fuckes op vha. et par linjer, som man indsætter manuelt! :)

Husk på, at det ikke er alle, der er så reelle som du og jeg!
12. oktober 2010 - 11:22 #8
cronaldo, det var reelt sagt og jeg skal kikke videre paa det. 

Jeg mener nu at tiden er inde til at lukke traaden.  Skulle jeg faa yderligere spoergsmaal bliver det et emne for en ny traad.  Opretter du et svar for points?  Hvis du afslaar (som nogen goer, jeg kan ikke huske om det indbefatter dig) saa fortael saa jeg kan lukke med hensyn til w13.
Avatar billede cronaldo Nybegynder
12. oktober 2010 - 11:30 #9
Du kan bare give w13 point - jeg kom bare lige ind med lidt tips i slutningen af tråden!

Hav en god dag :)
Avatar billede w13 Novice
12. oktober 2010 - 13:07 #10
Tak for point! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Netcompany A/S

Test Consultant

KMD A/S

SAP-arkitekt

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Er du vores nye IT-supporter til Cyberdivisionens supportteam i Hvidovre?

Dalmatic TNV A/S

Dygtig svagstrømsingeniør

Capgemini Danmark A/S

SAP Engagement Manager