Avatar billede Ostie Novice
04. april 2020 - 21:21 Der er 9 kommentarer

Automatisk opdatering

Hejsa :-)
Jeg har en side med nogle kommentar, som jeg gerne vil ha opdater automatisk hvergang der kommer en ny kommentar.. Men den skal self kun opdatere når der kommer ny kommentar, kan man gøre det med php eller skal det være noget script? Har kigge rundt og kan ikke finde ud af det, håber at i kan hjælpe.
Mvh Rasmus
Avatar billede arne_v Ekspert
04. april 2020 - 22:00 #1
Du vil have at det der vises i browser hos en bruger automatisk opdateres når en anden bruger sender en kommentar?
Avatar billede cht22 Professor
04. april 2020 - 23:24 #2
Det kan gøres med noget kode i stil med dette, hvor siden refresh-read-from-database.php undersøger om der er kommet nye poster i databasen:

Jeg har dog ikke afprøvet denne kode, det var bare lige hvad jeg kunne sætte sammen:

<script>
$.ajax({
  function read() {
  url: 'http://dinurl-internetadresse.dk/refresh-read-from-database.php',
  success: function(data) {
    if (data == "refresh"){
      window.location.reload(); // This is not jQuery but simple plain ol' JS
    }
    else {
      setTimeout("read()",5000);
    }
};
});
</script>
Avatar billede cht22 Professor
05. april 2020 - 09:39 #3
Glemte lige denne kode skal også indsættes på siden:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
Avatar billede cht22 Professor
05. april 2020 - 09:42 #4
Det kan også være denne kode kan bruges:

<script>
var reload = 0;

function data() {

$(document).ready(function(){
//  $("button").click(function(){
    $("#div1").load("read_last.php", function(responseTxt, statusTxt, xhr){
      if(statusTxt == "success") {
        var last_message_on_page = "2020-04-05 09:05:44";

        if (responseTxt != last_message_on_page) {
          alert('Der er kommet nye beskeder... Siden genindlæses...');
          location.reload();
          reload = 1;
        }

        //alert("External content loaded successfully!");
        var_timer=20;
        }
      if(statusTxt == "error") {
        //alert("Error: " + xhr.status + ": " + xhr.statusText);
        }
    });
//  });
});

if (reload==0)
setTimeout("data()",5000);

}
setTimeout("data()",5000);
</script>

Eller du måske kan arbejde videre med det..
Avatar billede Slater Ekspert
05. april 2020 - 10:19 #5
Sådan lidt mere generelt, ja, du skal bruge både server-side og client-side for at opdatere live når andre brugere skriver kommentarer. Altså f.eks. PHP og Javascript.

PHP skal bruges til at gemme kommentarerne for alle brugere, og servere dem når klienten beder om det. Javascript skal bruges til at tjekke og opdatere klienterne, når der kommer en ny kommentar.

De tre primære måder at lave opdateringen på er short polling, long polling eller websockets.

Short polling er, som cht22's forslag, at køre en regelmæssig forespørgsel fra alle klienterne. F.eks. hvert femte sekund spørger alle klienter serveren "er der kommet en ny kommentar?", og henter den hvis der er.

Long polling er at lave en forbindelse til serveren og lade den hænge åben. Det er derefter serverens ansvar først at begynde at skrive data når der er en ny kommentar tilgængelig. Dette virker hurtigere og bedre for klienten, og svar kommer med det samme i stedet for efter x sekunder, men er meget tungere for serveren.

Websockets er relativt ny teknologi, der forsøger at erstatte long polling med noget bedre, men stadig har nogle problemer - f.eks. i max antal af forbindelser der kan være åbne.

Det nemmeste kodemæssigt er klart short polling.

Mht. at opdatere siden når der så er en ny kommentar, kan du tage den supernemme udvej og reloade siden - hvilket kan være røvirriterende for brugeren, især hvis de lige er i gang med at skrive noget selv. Eller du kan opdatere indholdet med Javascript. Der ville jeg vælge at bruge et reaktivt front-end framework som f.eks. VueJs (personligt foretrukne), som gør det superlet at lave.
Avatar billede Slater Ekspert
05. april 2020 - 10:56 #6
Her er et simpelt eksempel jeg har lavet, der bruger short polling og VueJs til at opdatere indholdet:

http://snip.kilolima.dk/#/XdcBPoW

Det bruger crudpi.io som backend der serverer dataene. Det er et udviklerværktøj til at lave midlertidige backends, så det bør naturligvis erstattes med noget andet.

Men der kan du skrive en kommentar og se den tilføjet med det samme, uden siden reloader. Og hvis du åbner den URL i to browsere og skriver en kommentar i den ene, vil du se det opdateret i den anden browser inden for fem sekunder.
Avatar billede Ostie Novice
05. april 2020 - 21:26 #7
Hej tak for svar! Desværre kan jeg desværre ikke rigtig finde ud af det, da jeg mest bruger PHP.. Slater, er det muligt jeg kan skrive en mail til dig hvor du evt kunne hjælpe mig med mere forklaring omkring din måde ?

Mvh Rasmus
Avatar billede Slater Ekspert
06. april 2020 - 07:01 #8
Faktisk mangler der kun en simpel backend i PHP for at det der vil virke, hvis det da er noget i stil med hvad dit spørgsmål går ud på.
Men joh, det må du da sådan set godt. Jeg vil ikke skrive min email åbent her hvor bots kan nå den, men du kan gå ind på https://kilolima.dk og trykke på email-knappen.
Avatar billede cht22 Professor
12. april 2020 - 15:06 #9
I stedet for at reloade siden.

Du kan skrive en besked på siden ved at bruge:

document.getElementById("div1").innerHTML = 'Tekst som opdateres på siden';

Det er også muligt at opdatere, det der bliver vist, i title ved brug af JavaScript.

Titlen mellem <title> og </title>
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

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