php-respons?

Tags:    php

Hej Nørder

Jeg har en php-kode som virker efter hensigten. Den er bygget op af 3 funktioner og en switch, hvor en request-variabel giver input til hvilke funktioner der skal aktiveres. Men, det virker ikke altid.
Det er et tvitter-like setup, hvor man kan kommunikere med hinanden. Efter registrerings-request (alle 3 funktioner aktiveres, og det virker) starter en 'pinger' på klientens side, hvor der genereres en request hver 30 sekunder. Det virker ikke? .. der kommer simpelthen ingen ting tilbage på pingeren.
Jeg er ny med php og noget beskæmmet over, hvor dårligt compare/equals fungerer. Jeg fandt et timestamp i millisek, som efter at have været rundt i forskelligt kode havde skiftet ét ciffer (det 5. char .. sikkert der hvor de to komponenter i et php-float 'mødes')

Hilsen Carsten



10 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
Først et XMLHttpRequest kald omtales også som et XHR kald, bedre kendt under den fælles betegnelse Ajax (asynchronous javascript and xml).

Du kan ved hjælp af Firebug (et plugin til Firefox) og Chrome Developer Tools (en funktionalitet i Google Chrome Browseren) se det response du får tilbage fra dit XMLHttpRequest-/XHR-/Ajaxkald ved, at kigge i netværk, her kan du se om du evt. får en php fejl eller om det svar du får tilbage matcher det forventede.

Husk, at hvergang du laver et asynkront kald, så er det en ny request, så det du gør ved, at gemme informationer (i f.eks. tekst filer eller en database af en art) er helt rigtigt. Du kan nemlig slet ikke gemme en PHP variabel imellem 2 kald. Da kaldet er en hel ny request og dermed spawner en helt ny "PHP-tråd".

Et lille tip ville dog være, at bruge et framework ala jQuery til, at foretage dine Ajax kald, da funktionaliteten på tværs af browsere er lidt forskellig.





..XHR ? .. mener du xml?

Jeg ved ikke hvad du mener med at 'kalde den direkte fra adresselinjen'. Jeg har tænkt på, om der er andre requests end xmlHttp .. for der er ikke xml involveret i den kode jeg skriver.
Min host tilbyder masser af værktøj som jeg ikke bruger. Jeg vil vide .. 'hands on' .. hvad der sker.

'OneLine.php' har kun kode til at processere mine kald. Der er funktioner der går ind på nogle små tekst.txt-filer ... åbner,læser,ændre,lukker... De indeholder status-oplysninger om aktiveBrugere og meddelelser som jeg ikke kan lade 'leve' i arrays mellem hvert kald.

Når jeg laver et "m"-kald der bruger den ret omfattende
function processMessage($something){process somethig}
så går det ok.

... når jegtænker over hvad du skriver, så:
Hvis jeg kan tilgå php-scriptet direkte fra browseren er der måske rigtig god grund til at 'rense' $q for tekst der kan 'oversættes' til eksekverbar kode?



Indlæg senest redigeret d. 25.02.2012 11:59 af Bruger #17086
at kalde fra adresselinjen: http://dinside.dk/script.php?q=etellerandet



Hej Carsten. Hvad er dit spørgsmål egentlig? ;)



Jeg sender et 'manuelt' xmlhttprequest med et muse-klik og får svar .. det starter en automatisk afsendelse af xmlhttprequests hver 30 sekunder; men dem kommer der ikke noget respons på. Hvorfor gør der ikke det?
Jeg har reduceret responset i php-koden til blot at være en lille streng "ping".
Altså mine requsts indeholder en variabel som bliver aflæst af php-koden som sådan får input til, hvad for et respons der skal returneres. Der kommer igenting retur. ... er 30 sec mellem hvert request for lidt til at serveren kan 'regenerere'? Det lyder usansynligt.

Under udviklingen af den pågældende php-kode (al komposition foregår gennem en 'file-manager' på serveren, aktiveret fra min pc.) oplevede jeg iøvrigt det skrækkelige at min side 'tabte al funktionalitet' .. den stivnede 100% og måtte erstattes.

Mine sider er håndskrevne og med nogle få visuelle elementer, men med en længere javascript kode som styrer funktionaliteten. Én af javascript-funktionerne er en xmlhttprequest. Denne request tager oplysninger om det php-script det skal sendes til, og den sting-variabler der skal sendes. Al kommunikation med php-scriptet foregår gennem denne funktion. Javascriptet kan starte en timer der generere en event efter et stykke tid. Det er denne timer-drevet event som afsender et request som ikke får et respons.



Indlæg senest redigeret d. 25.02.2012 10:35 af Bruger #17086
Kan vi få noget kode at kigge på? :)



Hej Valdemar
... det kan blive omfattende, men, her er requestet
Og det virker når jeg eksekverer det med et museklik gennem en 'send(text)'- funktion (den har et switch-setup og er lang .. ligesom 'decifer(responstxt)' der behandler svaret. Men det er lidt irrelevant, fordi jeg 'error-tracker' min kode og har styr på, hvad der sker. Alt fungerer indtil der ikke kommer noget tilbage fra det event-drevne request (heller ikke onreadystatechange status info).

.. ok, jeg kan godt se, at jeg startede med php og er nu i javascript ;o/

Javascript-kode:

function htmlRequest(tekst)
{
var kk;
//if(clearToSend=="true"){
try{var xmlReq=new XMLHttpRequest();}
catch(error){err+=" xmlReq.error";}

xmlReq.onreadystatechange=function()
{
if(xmlReq.status==200){
if(xmlReq.readyState==4){
patt=/[:=!&]/g;
kk=xmlReq.responseText;
//alert("txt straignt: "+kk);
mm=kk.replace(patt," ");// clears the inkomming text
//alert("txt modified: "+mm);
decifer(mm);
}// end if xmlReq.readyState
}// end if(xmlReq.status
else{err+=" status not ok. Status is: "+xmlReq.status;}
}// end onreadystatechange=function

try{xmlReq.open("GET","OneLine.php?q="+tekst,true);}
catch(error){err+=" xmlReq.open i udu: "+error.message;}

try{xmlReq.send();}
catch(error){err+=" xmlReq.send i udu : "+error.message;}
}//end function htmlRequest




Mere kode:

Jeg har reduceret responset for code="p" for at isolere problemet. Variablen q indeholder selvfølgelig et indledende char der bliver brugt i switch.

php-pseudo-kode:

<?php

$q=$_GET["q"];
$txt=$q;
str_split($txt,1); // splits txt into chars
$code=$txt[0]; // takes the first char

switch ($code){
case "m":
processMessage($q);
break;
.....
case "e":

break;
case "p":
echo "p_Ping";
break;
}// end switch code

function processMessage($something){
//processes $something
echo 'some respons tekst';}
function doSomethingElse(){}

<php



Indlæg senest redigeret d. 25.02.2012 11:49 af Bruger #17086
Det kald du normalt laver med XHR, hvad sker der hvis du kalder den direkte fra browserens addresselinje - får du den forventede data?

Hvad fortæller firebug eller chrome at du får som respons fra OneLine.php ?

Måske ikke så relevant - men får du nogen syntaksfejl?



Valdemar

.. ;o) .. jeg er begyndt at læse om regular expressions for at imødegå de 'problemer' der kan komme ud af dét.

holy moses .. jeg får et 'p_ping' som respons direkte på browseren.

Men, stadigvæk ... hvorfor virker det ikke når kaldet er genereret af en intern event (timer tick) i javascript'en.

Prøv at logge via på www.troelsgaard.net og check

Carsten



Indlæg senest redigeret d. 25.02.2012 12:51 af Bruger #17086
Hej Dan

Tak for responset. Ja, jeg gennemskuede lidt senere XHR.
Jeg har fundet fejlen i min kode. Det er ind imellem svært at tro, at man kan overse det åbenbare ... men sådan er det.
Lige nu er jeg bare fornøjelig over, at 3 ugers arbejde er blevet færdigt nok til at være brugbart.

Carsten





t