Avatar billede tanis13 Nybegynder
18. oktober 2011 - 10:04 Der er 15 kommentarer og
1 løsning

Live submit form

Hej Eksperter,

Jeg står over for et problem hvor jeg gennem 3 forskellige submit-inputs skal opdatere en database samt en 4. input.

Min form er således:
<form action="?page=play" method="post">
  Goals:
  <input type="submit" class="grey" value="        <?=$p_g[goal]?>        " disabled />

  <input type="hidden" name="type" value="goals" />
  <input type="submit" name="score" class="green" value="+1" />
  <input type="submit" name="score" class="yellow" value="-1" />
  <input type="submit" name="score" class="red" value="0" />
</form>


Jeg ønsker ikke at reloade siden, men blot at <?=$p_g[goal]?> bliver opdateret live i databasen samt på siden.

Jeg tænker dette måtte være muligt gennem noget JS, men har selv ikke den store kendskab til dette.

Håber nogen kan hjælpe mig!

Mvh
Thomas
Avatar billede olsensweb.dk Ekspert
18. oktober 2011 - 10:13 #1
det kan ikke gøres rent i js du skal blande noget serverscript ind.
løsningen må være at kigge på AJAX
google "php ajax tutorial" http://www.google.dk/search?q=php+ajax+tutorial
Avatar billede tanis13 Nybegynder
18. oktober 2011 - 11:25 #2
Hej ronols,
Jeg kigger nærmere på nogle AJAX tuts og ser om jeg ikke kan hitte ud af det.

Hænger du ved på tråden hvis jeg har nogle spørgsmål eller brug for hjælp ?

Mvh
Avatar billede tanis13 Nybegynder
18. oktober 2011 - 23:09 #3
Hej igen,

Jeg har nu forsøgt de sidste par timer med forskellige forsøg på at sammestrikke noget brugbart uden held.

Ud fra forskellige tutorials har jeg kunne håndtere de pågældene sendte data, men ikke kunne "refreshe" formen uden at refreshe hele siden.
Avatar billede olsensweb.dk Ekspert
19. oktober 2011 - 13:00 #4
her er et lille eks hurtigt flækket sammen

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title></title>
    <style type="text/css">
    .button-standard{
        width:100px;
        text-align: center;
    }
    </style>
    <script type="text/javascript">
    function UpdateGoal(elm){       
        var elmgoals = document.getElementById("goals");       
       
        var url = "request.php";
        var params = "id="+elm.value+"&goals="+elmgoals.value+"&rand="+Math.random();
        var http = new XMLHttpRequest(); // gider ikke teste om browseren understøtter XMLHttpRequest()
               
        http.open("POST",url ,true);
        //Send the proper header information along with the request
        http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        http.setRequestHeader("Content-length", params.length);
        http.setRequestHeader("Connection", "close");
        http.send(params);
       
        http.onreadystatechange = function () {
            if(http.readyState == 4 && http.status == 200 ){               
                elmgoals.value = http.responseText;               
            }
        }           
    }

    </script>
</head>
<body>
<?php
    $p_g[goal] = 0;
?>
<form action="?page=play" method="post">
  Goals:
    <input type="submit" class="grey button-standard" id="goals" value="<?php echo $p_g[goal]; ?>" disabled />
    <input type="hidden" name="type" value="goals" /> 
    <input type="button" name="score[]" class="green" value="+1" onclick = "UpdateGoal(this)" />
    <input type="button" name="score[]" class="yellow" value="-1" onclick = "UpdateGoal(this)" />
    <input type="button" name="score[]" class="red" value="0" onclick = "UpdateGoal(this)" />
</form>
</body>
</html>



request.php
<?php    
    $id = $_POST['id'];   
    $goals = $_POST['goals'];       
    // her skal db bare opdateres, og ny værdi echo'es ud
    switch($id){
        case 0: $goals = 0;        break;
        case -1: $goals -= 1;    break;
        case 1: $goals += 1;    break;
    }   
    echo $goals;
?>


jeg bruger ikke <form...>, så den ville kunne slettes, men bruges sikkert i anden sammenhæng
Avatar billede tanis13 Nybegynder
19. oktober 2011 - 14:26 #5
Hej ronols,

Det ser rigtig fint ud og ser det ud til at virke med live opdatering.

Hvis man skulle sende en SQL-query afsted bør den ligge i request.php filen før echo $goals - korrekt ?

Under alle omstændigheder kan du sende et svar, så accepterer jeg :)

Tusind tak for hjælpen!
Avatar billede tanis13 Nybegynder
19. oktober 2011 - 14:34 #6
Ah først set nu at du allerede har svaret på ovennævnte spørgsmål
Avatar billede tanis13 Nybegynder
19. oktober 2011 - 16:08 #7
Har lige et yderligere spørgsmål - hvordan kan jeg få håndteret en hidden input som har en værdi i request.php?
Avatar billede tanis13 Nybegynder
19. oktober 2011 - 16:12 #8
omformuleret hvordan sender jeg en pre-defineret værdi fra min "form" til request.php?
Avatar billede olsensweb.dk Ekspert
19. oktober 2011 - 16:37 #9
>hvordan kan jeg få håndteret en hidden input som har en værdi i request.php?
lige som et normalt felt, eller du kan hardcode det direkte i parameter stringen

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title></title>
    <style type="text/css">
    .button-standard{
        width:100px;
        text-align: center;
    }
    </style>
    <script type="text/javascript">
    function UpdateGoal(elm){       
        var elmgoals = document.getElementById("goals");       
        var elmgtype = document.getElementById("type");       
       
        var url = "request.php";
        var params = "id="+elm.value+"&goals="+elmgoals.value+"&type="+elmgtype.value+"&rand="+Math.random();       
        // eller hvis du hellerer vil hardcode værdien
        // var params = "id="+elm.value+"&goals="+elmgoals.value+"&type=goals"+"&rand="+Math.random();       
        var http = new XMLHttpRequest(); // gider ikke teste om browseren understøtter XMLHttpRequest()
               
        http.open("POST",url ,true);
        //Send the proper header information along with the request
        http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        http.setRequestHeader("Content-length", params.length);
        http.setRequestHeader("Connection", "close");
        http.send(params);
       
        http.onreadystatechange = function () {
            if(http.readyState == 4 && http.status == 200 ){               
                elmgoals.value = http.responseText;               
            }
        }           
    }
    </script>
</head>
<body>
<?php
    $p_g[goal] = 0;
?>

  Goals:
    <input type="button" class="grey button-standard" id="goals" value="<?php echo $p_g[goal]; ?>" disabled />
    <input type="hidden" id="type" name="type" value="goals" /> 
    <input type="button" name="score[]" class="green" value="+1" onclick = "UpdateGoal(this)" />
    <input type="button" name="score[]" class="yellow" value="-1" onclick = "UpdateGoal(this)" />
    <input type="button" name="score[]" class="red" value="0" onclick = "UpdateGoal(this)" />

</body>
</html>


<?php    
    $id = $_POST['id'];   
    $goals = $_POST['goals'];       
    $type = $_POST['type'];
   
    // her skal db bare opdateres, og ny værdi echo'es ud
    switch($id){
        case -1: $goals -= 1;    break;
        case 0:  $goals = 0;    break;
        case 1:  $goals += 1;    break;
    }   
    echo $goals;
?>
Avatar billede tanis13 Nybegynder
19. oktober 2011 - 20:15 #10
Det gir god mening.

Ved ikke om det muligvis er uden for denne tråd, men bruger php til at sende ovenstående tabel ud X antal gange afhængigt af spillere i forskellige tabs (kan vise et eksempel hvis behøver mere forklaring).

Men når man under #tab2(spiller2) trykker +1 er det den button i #tab1(spiller1) som får værdien tilsendt pga den samme "id" som er li' 1.

Kunne man finde en løsning på dette?
Avatar billede olsensweb.dk Ekspert
19. oktober 2011 - 21:16 #11
tfp
>(kan vise et eksempel hvis behøver mere forklaring).
nok lidt uden for denne tråd, men jeg kunne da godt tænke mig at se det.
Avatar billede tanis13 Nybegynder
19. oktober 2011 - 21:43 #12
Kan vise dig over post-systemet, kan bare ikke hitte ud af hvordan man sender en mail herinde.
Avatar billede olsensweb.dk Ekspert
19. oktober 2011 - 21:52 #13
gå ind på min profil, tryk på Send en intern besked til brugeren
nb det kan godt være E lige skal opdatere, jeg har lige enablet muligheden for at modtage interne beskeder
Avatar billede olsensweb.dk Ekspert
20. oktober 2011 - 11:38 #14
jeg kan se på din hjemmeside du anvender jquery, jeg har så omskrevet functionen UpdateGoal til at anvende jquery, det fylder lidt mindre og måske nemmere at læse.
<script type="text/javascript">    
    function UpdateGoal(elm){       
        var elmgoals = document.getElementById("goals");       
        var elmgtype = document.getElementById("type");               
        var url = "request.php";
        var params = "id="+elm.value+"&goals="+elmgoals.value+"&type="+elmgtype.value+"&rand="+Math.random();   
        $.ajax({           
            type: "POST",
            url: url,           
            data: params,
            success: function(msg){               
                elmgoals.value = msg;                    
            }
        });

    }
</script>


du bør måske kigge på
http://api.jquery.com/category/ajax/
http://api.jquery.com/jQuery.ajax/    <-- specielt denne
http://api.jquery.com/jQuery.post/

jeg kan se du forsætte spørgsmålet http://www.eksperten.dk/spm/949601 med det du skrev i den interne besked.
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 12:16 #15
Det ser faktisk ud til at fungere rigtig fint med $.ajax.

Kender ikke så meget til jquery, men bør nok kigge lidt mere på det.

Kan man nemtsætte en form for "fade"/timer ind på det $echo man sender afsted gennem jquery?
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