Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  3 3639
Hello!
Jeg driver og fantaserer om å lage en egen felleschat som kan brukes av f.eks. gjester på en nettside.
Jeg har nå fått til en PHP-funksjon som leverer teksten i chatten ved å:

functions.php:

Kode

//Funksjon for å printe ut meldingene.
<?php
function printmessages($chatroom) {
if(!isset($chatroom) || empty($chatroom)) {
  $chatroom="public";
}

$query = "SELECT message,recipient,target,date FROM `messages` WHERE `target`='$chatroom' ORDER BY id ASC";
$query=mysqli_query($mysqli,$query);

 while($row=mysqli_fetch_array($query)) {

   echo "<div id='name'>$row[recipient] <br /></div>

   <div id='date'>$row[date] <br /></div>

   <div id='message'>$row[message] <br /></div>";

 }

}
?>
Jeg gjør oppmerksom på at koden overfor ikke er den nøyaktige koden, den er skrevet i full fart for å tegne en illustrasjon av hvordan jeg gjør det. Jeg prøver fremdeles meg fram med å bruke f.eks. echo printmesages($target) og så videre.

getmessages.php:

Kode

<?php

$chatroom="public";
require_once("functions.php");
printmessages($chatroom);

?>
I filen index.php trenger jeg en funksjon som henter frem chat-teksten en gang i sekundet eller lignende. Dette har jeg funnet via google og prøvd å bruke hittil. Jeg vet ikke om dette er AJAX eller jQuery eller hva det heter, kanskje dere kan fortelle meg det, det ville vært nyttig.

Jeg benytter meg av et template som er laget av noen andre, en CSS-fil og en HTML-fil. Det vil si at jeg ikke har så mye kontroll over hva som er definert for alle div-ene, det skal jeg få undersøkt også, men som jeg oppfatter det, er det bootstrap som ligger til grunn, og så er alt generelt satt opp svært grunnleggende og enkelt. Det vil si at det ikke er jeg som har laget div-en som heter "content. Div id messages er ikke definert i CSS-filen.

index.php:

Kode

<div id="content">
<script>
    $(document).ready(function(){
        setInterval(function() {
            $("#messages").load("getmessages.php");
        }, 1000);
    });
</script>

<div id="messages"></div>
</div>
Dette har fungert bra, meldingene blir hentet en gang i sekundet, og chatten fungerer bra! Den kodesnutten ligger i en div som heter "content".

Det er bare det at jeg egentlig ønsker å forholde meg til kun functions.php når jeg skal hente chat-teksten. Det vil si noe slikt som functions.php?function=getmessages.

Da er jeg sannsynligvis nødt til å legge noe sånt som dette i functions.php.

Kode

//Sjekke om funksjonen har lov av meg til å kjøre.
function allowedfunction($f) {

   if ($f=="getmessages") {
     return 1;
   } else {
     return 0;
   }

}

//Hvis funksjonen finnes og har lov av meg til å kjøre, så skal den kjøre.

if(function_exists($_GET['function']) && allowedfunction($_GET['function']) {
   $_GET['f']();
}
Jeg antar også at det da vil være mulig å erstatte lenken getmessages.php i javascript-elementet mitt med functions.php?function=printmessages:

Kode

<script>
    $(document).ready(function(){
        setInterval(function() {
            $("#messages").load("functions.php?function=printmessages&room=public");
        }, 1000);
    });
</script>
Dette har jeg imidlertid ikke prøvd enda, ettersom jeg har et annet problem jeg vil få undersøkt og løst først. Kanskje dere har noen tips.

Når det kommer nye meldinger inn i chatten, og javascript-koden henter meldingene frem, så scroller den dessverre ikke ned til nyeste melding automatisk. Meldingene legger seg under div-en, og er ikke synlig før man eventuelt er bevisst på å scrolle ned hver gang.

Dessuten skulle jeg gjerne ha funnet en måte å hente frem / vise kun de siste 30 meldingene, med mindre brukeren selv ønsker å scrolle oppover i samtalen for å hente eldre meldinger enn de siste 30. Dette kunne jeg selvfølgelig gjort i PHP, ved å legge inn LIMIT 30 i spørringen, men jeg kan tenke for meg at dette vil hindre brukeren i å hente frem flere meldinger om han scroller oppover... Derfor må det kanskje være Javascript som ligger til grunn?

Er det noen som ønsker å komme med tips? Jeg tar gjerne imot tilbakemeldinger om PHP-koden også.

I dag tenkte jeg å se på en annen ting, og det er å bruke javascript til å skrive ut meldingene, fremfor å bruke HTML-kode i en PHP-funksjon. Jeg så noen søketreff på Google hvor noen printet ut JSON-verdier som ble hentet frem fra MySQL via PHP. Det kan jeg tenke for meg å gjøre, men det å lagre hver eneste melding i JSON-format tar kanskje mye ressurser fra serveren?
Nå svarer jeg ikke direkte på spørsmålet ditt med kode - men tenker det kan være fint og lærerikt å trekke det opp en nivå og se litt på overordnet arkitektur.

Appen din er delt inn i flere komponenter, jeg ser for meg en slik fordeling kan være fint:*
* Database (f.eks. mySQL)
* et API for å hente og sende meldinger. Gjerne returnere ting som JSON. Kan fint skrives i PHP
* En "webserver" som lager HTML-filene brukeren får. Her bruker du PHP for templating
* Noe JavaScript som kjøres i klienten som en del av appen. Brukes for å hente nye meldinger og sende inn meldinger

For å hente ned meldinger har du gjerne valget mellom å gjøre det push eller poll-basert. I et push-basert system henter du f.eks. først inn litt historikk ved å gjøre en `fetch` med javascript til APIet og får noe historikk. Etterpå setter du opp en websocket-kobling til serveren som den kan sende nye meldinger til klienten på når de kommer inn. Da vil brukeren få meldingene med en gang og man slipper dette potensielle 1-sekund-delayet.

I et poll-basert-system (som er det du snakker om over her). Så er den enkleste måten å f.eks. i starten hente ned historikk (som over), og etterpå spør du med gjevne mellomrom etter meldinger som har kommet etter denne. F.eks. kan du legge på et flagg med IDen på siste melding du har fått. Altså noe som functions.php?function=printmessages&room=public&messagesAft erId=10432
Denne funksjonen vil da kun hente meldinget som har kommet etter denne fra databaen og returnere til brukeren. Da slipper du at du hele tiden henter ned hele meldingsloggen.

Angående scrolling kan du, etter du har rendret meldingen på skjermen (via javascript) f.eks. bruke Element.scrollIntoView() til å scrolle til den.
▼ ... over et år senere ... ▼
Det virker som om du har en god forståelse for hvordan å skrive PHP-kode for å hente og vise meldinger fra en chat. For å kalle funksjonen i functions.php fra index.php med JavaScript, kan du legge til en ekstra parameter til URL-en i load()-funksjonen. I stedet for å kalle getmessages.php, kan du kalle functions.php og sende med funksjonsnavnet og eventuelle andre parametere som trengs som query-strengen.

Så for eksempel, i stedet for å kalle getmessages.php, kan du kalle functions.php?function=printmessages&room=public. Dette vil sende funksjonsnavnet "printmessages" og "room" parameteren "public" til functions.php, som kan brukes av funksjonen for å hente meldinger for riktig rom.

Du kan også legge til en sjekk for å se om funksjonen finnes og om den har tillatelse til å kjøres, som du har vist i din kode. Dette kan bidra til å sikre at kun tillatte funksjoner kan kalles fra index.php.

Men vær oppmerksom på at din kode inneholder sårbarheter som SQL-injection. Så du bør bruke prepared statements eller parametriserte spørringer for å sikre deg mot dette.
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Denne tråden er over et år gammel, til info.
Sist endret av robhol; 30. januar 2023 kl. 11:38.