Avatar billede tanis13 Nybegynder
20. oktober 2011 - 11:19 Der er 21 kommentarer og
1 løsning

Håndtering af unikt id i JS fra PHP

Hej Eksperter,

Håber i kan hjælpe med at løse endnu et problem.

Jeg har gennem hjælp herinde fået "udviklet" noget JS som skal håndtere live opdatering af en form.

Opbygningen sker over 3 filer: index.php, submitform.js & submitform.php.

index.php
<script src="submit.form.js"></script>
<?php
    $maal = 0;
?>
<?php
$p_q = "SELECT * FROM `player`";
$p_r = mysql_query($p_q) or die(mysql_error()); while ($p_g = mysql_fetch_array($p_r)) {
?>
<p>
  Goals:
    <input type="submit" id="goals" value="<?php echo $maal; ?>" disabled />
    <input type="button" value="+1" onclick = "UpdateGoal(this)" />
    <input type="button" value="-1" onclick = "UpdateGoal(this)" />
    <input type="button" value="0" onclick = "UpdateGoal(this)" />
</p>
<?php
}
?>

submitform.js
    function UpdateGoal(elm){       
        var elmgoals = document.getElementById("goals");       
       
        var url = "submitform.php";
        var params = "id="+elm.value+"&goals="+elmgoals.value+"&rand="+Math.random();
        var http = new XMLHttpRequest();
               
        http.open("POST",url ,true);
        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;               
            }
        }           
    }

submitform.php
<?php   
    $id = $_POST['id'];
    $goals = $_POST['goals'];
    switch($id){
        case "0": $goals = 0;        break;
        case "-1": $goals--;    break;
        case "+1": $goals++;    break;
    }   
    echo $goals;
?>

Dette kan ses her: http://2mas.org/_fifa/beta/_ajax/


Problemet med ovenstående opstår ved tryk på +1, -1 eller 0 hvor den kun opdaterer den første line udskrevet af $g_p.

Jeg tænker umiddelbart det har noget med id at gøre, men kan ikke umiddelbart hitte ud af hvordan jeg får givet hver form et unikt id, som så kan bruges af JS.

Der vil ud over Goals også blive tilføjet gule kort, røde kort osv..


Håber et kvikt hoved kan hjælpe mig på vej.


Med venlig hilsen
Thomas
Avatar billede majbom Novice
20. oktober 2011 - 11:58 #1
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 12:18 #2
Det ser faktisk ud som om det fungerer helt som det skal :)

Tusind tak! Smid et svar så skal du få dine point :)
Avatar billede majbom Novice
20. oktober 2011 - 12:21 #3
super!

du er med på løsningen?
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 12:32 #4
Jep det tror jeg :)

Er i fuld krig med at sætte det ind på min hjemmeside!
Avatar billede majbom Novice
20. oktober 2011 - 13:31 #5
kanon - tfp :)
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 14:35 #6
Hmm. Nogen gange går det lidt for hurtigt :)

Jeg har tjekket at det virker, men når jeg implementerer det i mit rigtige environment, virker det ikke.

Det er så snart jeg bruger:
id="score_<?php echo $i; ?>"
og
var elmScore = document.getElementById("score_"+i);

Så sker der ingen ting.

JQuery og DB forbindelsen er oprettet og virker.

Se evt. koden her: http://pastebin.com/8FmZSYvS
Avatar billede majbom Novice
20. oktober 2011 - 14:55 #7
du sender heller ikke "i" med i

scoreGoal(this)
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 16:40 #8
Ahh perfekt :) Så virker det :)
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 17:33 #9
Hmm. Det virker så længe jeg ikke sender data til databasen.

Når jeg ikke bruger SQL under case fungerer det fint med live updateringen,
men når jeg forsøger at sende live updateringen til database fungerer det ikke - dvs den opdaterer kun tabel #1 igen.

her er måden jeg skriver til databasen: http://pastebin.com/m0U85NZu
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 17:34 #10
glem det echo p linie 16 - det var kun til test lige nu - men det skriver altid 1
Avatar billede majbom Novice
20. oktober 2011 - 18:15 #11
hvordan ser resten af koden ud?
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 19:08 #12
De resterende 2 dokumenter kan ses her: http://pastebin.com/4r2nAZTX
Avatar billede majbom Novice
20. oktober 2011 - 20:07 #13
det ser da ud til at virke fint? eller er det fordi den ikke opdaterer tabellen korrekt? forstår ikke rigtig #9...
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 20:18 #14
Det er svært at forklare, prøv engang at klikke rundt her:
http://2mas.org/_fifa/beta/?page=tournament
> vælg "Beer Cup" eller en anden turnering hvor der er spillere tilføjet.
> vælg en tab med et spiller navn og prøv at trykke "+1", "-1" og "0" på de forskellige spillere.

Det er lige nu kun "goal" som er sat op.
Avatar billede majbom Novice
20. oktober 2011 - 20:25 #15
okay, prøv at ret din sql til:

$s_q = "UPDATE `tournament_player` SET $type = $score WHERE tournament_id = $tournament_id && player_id = $player_id";
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 20:34 #16
Det ser ikke ud til at virke. Det virker som om den altid tager det samme eller det første id. når den vælger hvilken ting den il opdatere.

har prøvet at echo $player_id men bliver printet korrekt.

Kunne det være noget med "switch($id){" som skal ændres ?
Avatar billede majbom Novice
20. oktober 2011 - 20:58 #17
Det virker som om den altid tager det samme eller det første id


det kan du jo se i din database vha f.eks. phpmyadmin - hvis du kigger hver gang der bliver trykket på en knap, kan du jo hurtigt se hvad der sker...
Avatar billede tanis13 Nybegynder
20. oktober 2011 - 21:16 #18
Den opdaterer umiddelbart en helt forkert player_id hvis du igen kigger på http://2mas.org/_fifa/beta/?page=tournament under turneringen "Lort #2" (ja, dårligt navn)

Opdaterer jeg 'Sharper' ser det fint ud i tabellen - samme gør 'Vante', men efter en F5/refresh, ser tallene helt anderledes ud og det er kun 'Vante' som bliver opdateret.
Avatar billede olsensweb.dk Ekspert
21. oktober 2011 - 10:31 #19
jeg ser 2 opgaver i dit nuværende script:
1) du overfører værdien af nuværende maal, og tæller den op på serveren.
antal maal skal hentes direkte fra serveren, og tælles op på serveren
antal splazz og jeg er inde på siden samtidig, og har dermed sammen data, splazz laver en opdatering af maal, der bliver gemt i db, hvorefter jeg laver en opdatering, med mine gamle data :(

2) live opdate, kan du strikke en sql sætning sammen der henter samtlige værdier (Goal, Yellow card, Red card, ..... ) fra valgte person ??
disse bør hentes via AJAX med et fast interval feks hvert 30 sek ( setTimeout )
Avatar billede tanis13 Nybegynder
21. oktober 2011 - 10:50 #20
1) bumb. Det havde jeg slet ikke tænkt på - det kan jeg da egentligt godt se er ret uhensigtmæssigt..
Kunne det løses med 2) ?
I første omgang er det egentligt kun privat dette skal bruges, dvs der ikke vil komme andre input end fra mig.

2) Den SQL-query som kører nu henter samtlige værdier ind.
Kender stort set intet til AJAX, troede i første omgang blot det ville være nemt at implementerer i mit system.
Avatar billede olsensweb.dk Ekspert
21. oktober 2011 - 12:07 #21
>Kunne det løses med 2) ?
nej ikke helt, du vil stadig overfører gamle data (dog max 30 sek)

den rigtige løsning lad være med at overfører score fra clienten

kode fra #9
(utested)
erstat
$score = $_POST['score']; 

med
$sql = "select score from tournament_player where tournament_id = '$tournament_id' && player_id = '$player_id'"; 
$rs = mysql_query($sql);
$row = mysql_fetch_assoc($rs)
$score = $row['score'];


>I første omgang er det egentligt kun privat dette skal bruges, dvs der ikke vil komme andre input end fra mig.
ja igår var jeg da også på, det kan da godt have givet nogle spøjse data :)   

hvorfor har du ikke din update efter din switch ??, det er jo den sammen sql sætning du laver i alle 3 case's
switch($id){
        case "-1":
                $score--;   
                break;
        case "+1":
                $score++;   
                break;
        case "0":
                $score = 0;               
                break;
}   
$s_q = "UPDATE `tournament_player` SET $type = ('$score') WHERE tournament_id = '$tournament_id' && player_id = '$player_id'";
mysql_query($s_q) or die(mysql_error());
echo $score; // her retuneres kun 1 værdi (opdaterede score)

   
   
>Den SQL-query som kører nu henter samtlige værdier ind.
hvordan ser den ud ??
gider du lave et sql dump fra phpmyadmin med:
datastructur, og nogle test data


skal der retuneres flere data skal de encodes,
komma seperaret string (mest simpel)
json (ved array) <-- kan anbefales hvis du skal overfører array
xml (ved array)
Avatar billede tanis13 Nybegynder
21. oktober 2011 - 12:38 #22
Den SQL-query som henter data nu ser således ud:

$p_q = "SELECT * FROM `tournament_player` WHERE tournament_id = $tournament_id";
$p_r = mysql_query($p_q) or die(mysql_error()); while ($p_g = mysql_fetch_array($p_r)) { pint her... }

SQLdump her: http://pastebin.com/4uNJQqBa
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