21. april 2004 - 21:29Der er
16 kommentarer og 1 løsning
<select> sætninger og få den rigtige variabel
Koden Først:
<select name="tekvalg" id="tekvalg"> <option selected="selected"><p> <?php echo $tekniker; ?> </p></option> <optgroup label="__________________"></optgroup> <?php lav_db_forbindelse(); $result = mysql_query("SELECT Ini, F_Navn, E_Navn FROM bruger WHERE Id_Adgang=2 ORDER BY F_Navn");
while ($row = mysql_fetch_array($result)) { echo "<option>".$row[F_Navn]." ".$row[E_Navn]."<br /></option>"; }
$_SESSION["compare"]=$row[Ini];
luk_db_forbindelse();
?> </select>
Problemstilling: I vores select kører vi en SQL streng og lister de brugere som har en Id_Adgang=2, fra vores bruger tabel. While løkken laver selecten med fornavn og efternavn. Det vi ønsker er at få den "Ini" (Ini er initialer, og er en unik ID) som hører til den "bruger" som vi vælger, smidt op i $_SESSION["compare"]
Nogen som har et godt forslag? Såvidt vi kan se, vil $row[Ini], bestå af et array med alle de ini som passer til brugerne. Så det at få den rigtige valgt OG smidt ind i $_SESSION["compare"], er vores problem.
Vi kan desværre ikke henvise til site med hele side koden, da vi sidder på interne udviklings servere og laver vores projekt.
Håber der er nogle med et godt forslag... Vi er ved at være træte af det.. ;-)
I stort set alle sprog fylder man en buffer (i PHP, som regel en streng-variabel), når man bygger lange strenge - og skriver den ud til sidst. Det er ekstremt ineffektivet at skrive ud til skærmen i løkker - og man ser oftest en performance-forbedring på en faktor 'flere hundrede' ved brug af en buffer (scriptet kører flere hundrede gange hurtigere og belaster derfor kun serveren med et par % af, hvad det ville gøre ved udskrivning i løkker).
Selvom PHP tildels retter op den fejl, det er at undlade gåseøjne i array-notation, kan det dog bl.a. være en slem sikkerhedsbrist at undlade dem .. skriv i stedet: $row["Ini"];
Derudove er det en rigtig god idé at escape navne i SQL-sætninger med accent grave (backticks): mysql_query("SELECT `Ini`, `F_Navn`, `E_Navn` FROM `bruger` ... osv ...). Det giver endvidere mulighed for at vælge felt-navne, som ellers er 'ulovlige' ... man kan f.eks. bruge navnet `by` :)
Nå, så til jeres egentlige spørgsmål: Forstår jeg det rigtigt, når jeg antager, I ønsker, at når brugeren vælger et navn i select'en, skal dette navns tilsvarende 'Ini' lægges over i en session-variabel? I så fald, må man jo en tur omkring serveren. Enten ved side-reload, eller ved at sende en request mod en skjult iframe. I IE og Moz kan man dog også sende en XMLhttp-request, som er usynlig for brugeren - men det funker ikke i f.eks. Opera.
Giv lige et 'pip' retur, så vi kan finde den bedste løsning :)
Vi er kommet så langt at vi med submit knappen, sender værdien "tekvalg", som nu består af 'Ini','F_Navn', 'E_Navn' skrevet i en streng videre til function.php. Her laver vi strengen om til et array og trækker [ini] værdien ud som vi skal bruge. Vores problem kommer så nu. Vi lægger den nye [ini] værdi op i session, de vi under reload af siden kalder iframes, som kører nogle tabeller for os, som skal bruge [ini] værdien for at vise den rigtige. MEN Når vi via headeren bliver sendt retur til teknikerstart.php, hvor det første kodeudsnit er fra, så laver vi følgende:
Dette gør vi får at tjekke om vi valgt noget nyt som skal vise via $init, ['compare'], eller om den skal køre med login værdien fra ['brugernavn']? Men dette tjek virker ikke :-( Siden reloades blank...
Det bedste ville også være hvis vi i vores form, kunne lave den sådan, at vi ikke havde en submit knap, men kunne bruge "onchange", og stadig blev sendt til function.php og få den valgte tekniker værdi, $tekvalg, sendt med...
Jeg er ikke helt med. Siden I bruger $_SESSION, går jeg udfra, PHP er sat til 'register_globals=Off'. Hvis det er tilfældet, skal 'funktions.php' se sådan ud:
<?php session_start(); $temp = explode(" ", $tekvalg); $init = $temp[0]; echo $init; // Her ville du skrive noget ud, hvis $init indeholdt noget
$_SESSION["compare"] = $init;
header("location: /users/tekniker/teknikerstart.php"); // Her ville du få en fejl, hvis $init havde indholdt noget ?>
Man kan ikke sætte en Header i PHP, efter man har skrevet noget ud til skærmen. Så får man en PHP-fejl, der standser afviklingen af scriptet. Da I ikke har haft fat i værdien af 'tekvalg', har I ikke skrevet noget ud - og derfor godt kunne sætte Header'en uden fejl ;o) /mvh
Vores fejl, echo $init; skulle ikke være der, det var en ren test, og vi har så ikke kørt begge samtidig, altså echo $init; og header...
Men det kører ihvertald nu...
Lige en lille ting... <select ... onchange="this.form.submit()"> Denne gør vores submit knap overflødig? Så hvis vi forstår det korrekt, så når man klikker på et flet i select boksen, bliver man sendt til den side, <form action="xxx"... peger på, med den værdi som står i selecten på vores side, som "$tekvalg"?
Yups, den submitter simpelthen formen med JavaScript - fuldstændig, som hvis du trykkede på en submitknap. Dog med den undtagelse, at hvis du har en onsubmit-handler på din form, så vil den ikke blive afviklet. Onsubmit-event'en på en form fyres ikke af, når formen submittes med JS :) /mvh
Hvis vi bruger onclick, og står i en Iframe... så skrifter siden inde i Iframen, hvordan får vi onclick til at redirecte i den side som indeholder Iframen?
Se, nu kører PHP jo på serveren - og frames, iframes og andre window-objekter befinder sig på klienten. Derfor har vi ingen mulighed for at redirect'e med en Header. Skriv i stedet en 'funktion_frame.php', der ser sådan ud:
Hallo ... nu ser jeg pludselig, jeg har vrøvlet =8-O
Hvis I bruger meta-refresh, får I præcis samme problem, som med Header'en. Det er kun iframe'en, der bliver redirected ... brug JavaScript'et og glem det andet ;o)
Check i øvrigt disse sider vedr. 'register_globals' og superglobals her:
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.