Avatar billede ralphkc Nybegynder
21. april 2004 - 21:29 Der 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.. ;-)
Avatar billede olebole Juniormester
21. april 2004 - 23:33 #1
<ole>

Punkt 1: I har en temmelig skidt kodekultur  :)

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  :)

/mvh
</bole>
Avatar billede ralphkc Nybegynder
22. april 2004 - 08:24 #2
Godmorgen :-)

Punkt 1, koden står står anderledes i vores dokumenter, det var mere for at hjælpe overskueligheden her på siden :-)

Det med "" i arrays og '' ved sql er noteret og bliver rettet ind, når vi kører vores kode igennem, sidst i projektet.

Du har forstået det korrekt.

Vi sad efter vi havde lavet undlægget og rodede videre med det igår.
Prøver at lægge noget mere af koden ind, efter rettelse...

__________________________________________________________________________________

<form action="/include/function.php" name="tekskift" id="tekskift" method="get" target="_self">
  <table class="sidemain">
    <tr>
      <?php include($_SERVER["DOCUMENT_ROOT"]."/include/html/maintd.html"); ?>
    </tr>
    <tr>
    <td class="sidemain" colspan="4"><p class="bold">Tekniker:</p></td>
    <td colspan="14"></td>
    <td class="right" colspan="2">
      <input class="button" type="button" value="Søg" name="teksoeg" id="teksoeg" alt="" />
    </td>
    <td></td>
    <td class="right" colspan="2">
      <input class="button" type="button" value="Opret sag" name="tekopretsag" id="tekopretsag" alt="" />
    </td>
      </tr>
      <tr>
    <td class="sidemain" colspan="4">
      <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[Ini]." "."-"." ".$row[F_Navn]." ".$row[E_Navn]."<br /></option>";
        }
       
        luk_db_forbindelse();
          ?>
      </select>
    </td>
    <td colspan="2">
      <input class="button" type="submit" value="Se" />
    </td>
      <td colspan="17"></td>
    </tr>
    <tr>
      <td class="sidemainlow" colspan="23"></td>
    </tr>
  </table>
</form>

_________________________________________________________________________________

FUNKTIONS.PHP

<?php
  session_start();
    $temp = explode(" ", $tekvalg);
    $init = $temp[0];
    echo $init;
   
    $_SESSION["compare"] = $init;
   
    header("location: /users/tekniker/teknikerstart.php");
?>

________________________________________________________________________________

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:

if (isset($_SESSION['compare'])
    {
        $init = $_SESSION['compare'];
    }
    else
    {
        $init = $_SESSION['brugernavn'];
    }

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...

Håber du har nogle noget ideer... ;-)
Avatar billede ralphkc Nybegynder
22. april 2004 - 08:25 #3
irriterende den flytter rundt på min pæne kode opstilling... :-)
Avatar billede ralphkc Nybegynder
22. april 2004 - 14:48 #4
Vil lige indskyde at problemet med if sætningen er fundet, der manglede en ")" til sidst... ;-) var vidst lidt træt til sidst...
Avatar billede olebole Juniormester
22. april 2004 - 18:09 #5
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(" ", $_GET["tekvalg"]);
    $init = $temp[0];
    echo $init;
   
    $_SESSION["compare"] = $init;
   
    header("location: /users/tekniker/teknikerstart.php");
?>
Avatar billede olebole Juniormester
22. april 2004 - 18:11 #6
Det andet kan I klare med:

<select ... onchange="this.form.submit()">
Avatar billede olebole Juniormester
22. april 2004 - 18:18 #7
Derfor får I heller ingen fejl, når I prøver  ;o)

<?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
Avatar billede ralphkc Nybegynder
22. april 2004 - 19:48 #8
Hej igen :-D

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"?
Avatar billede olebole Juniormester
22. april 2004 - 19:54 #9
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
Avatar billede ralphkc Nybegynder
22. april 2004 - 20:23 #10
Det er så smukt så smukt... stikker du mig et svar, så får du dine points.. ;-)
Avatar billede ralphkc Nybegynder
22. april 2004 - 22:10 #11
Et lille tillægs spørgsmål...

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?
Avatar billede olebole Juniormester
22. april 2004 - 22:32 #12
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:

<?php
  session_start();
    $temp = explode(" ", $_GET["tekvalg"]);
    $init = $temp[0];
   
    $_SESSION["compare"] = $init;
   
    print "<script type=\"text/JavaScript\">parent.location.href='/users/tekniker/teknikerstart.php'</script>";
?>

... og kald så denne, hvis du står i en iframe  ;o)
/mvh
Avatar billede olebole Juniormester
22. april 2004 - 22:38 #13
... du kan også printe dette i stedet for JavaScript'et:

print "<html><head><meta http-equiv="Refresh" content="2;URL=/users/tekniker/teknikerstart.php"></head><body></body></html>";
Avatar billede olebole Juniormester
22. april 2004 - 22:40 #14
Hehe ... sådan:

print "<html><head><meta http-equiv="Refresh" content="0;URL=/users/tekniker/teknikerstart.php"></head><body></body></html>";

Det skulle jo gerne ske øjeblikkeligt  ;o)
Avatar billede ralphkc Nybegynder
22. april 2004 - 22:49 #15
Mange tak for hjælpen...

;-)
Avatar billede olebole Juniormester
22. april 2004 - 23:10 #16
... anytime  ;o)
Avatar billede olebole Juniormester
22. april 2004 - 23:20 #17
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:

http://dk2.php.net/manual/en/security.globals.php
http://dk2.php.net/manual/en/language.variables.predefined.php
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