Gå til innhold

AJAX og PHP objekter - best måte å 'kommunisere' på?


Anbefalte innlegg

Videoannonse
Annonse

Ett lite spørsmål:

$obj = & new Object($param);

Hva er egentlig poenget med referanse der? Skjønner viss det er "$obj = & $someObject" for da er det en direkte referanse, men referanse til "new" skjønner jeg ikke helt

 

Den plassen det gir mening å bruke &, eller referanse, er når du skal manipulere en variabel du sender inn i en funksjon/metode.

 

PHP bruker dette f.eks. for preg_match(), hvor resultatet lagres i tredje parameter "$matches":

http://no2.php.net/manual/en/function.preg-match.php

 

Generelt gir det ikke mening å bruke referanse, utenom slik som i eksempelet. PHP er ikke C. :)

Endret av dahuff
  • Liker 1
Lenke til kommentar

Det er mest sannsynlig gammel kode, det ble brukt i PHP4 fordi der ble objekter kopiert som standard.

 

Edit:

Hvis du bruker php5.3 skal du få en advarsel om at den syntaxen ($obj = & new Object()) snart vil bli fjernet.

Endret av FraXinuS
  • Liker 1
Lenke til kommentar
  • 2 uker senere...

Det fungerte glimrende med objektene i session!! :thumbup: Fikk først _PHP_incomplete_object, men bare omstrukturerte includesa mine så fungerte det.

 

Men! Nå støtte jeg på et problem. En administratorbruker kan assigne en bruker til et kurs. Men dette vil jo ikke brukeren som er logget inn se, siden brukeren får sin informasjon cacha i SESSION. Brukeren vil altså ikke se dette før han/hun logger inn på nytt (og objektene er ferskt oppdatert fra databasen). Hadde det vært selve brukeren selv som assigna seg selv, hadde det jo vært noe problem. Men når det er annen bruker som gjør oppdateringene, blir det verre..

 

Finnes det noen måte å "tvinge" brukeren til å oppdatere SESSION hvis en admin har gjort en endring?

Lenke til kommentar

Den kanskje enkleste måten jeg kommer på er å oppdatere et timestamp i et felt i brukertabellen når det gjøres endringer. Om du så setter siste tidspunkt for oppdatering i session også, vil du kunne sammenligne tidene. Om tiden i databasen er nyere enn i session, bygger du objektet igjen med nye data, legger det i session og oppdatere tidspunkt i session.

 

Psuedokode:

(objektet lages og tid settes)
$_SESSION['courses'] = new Course();
$_SESSION['updated'] = new DateTime("now")

(admin legger til kurs)
query = "INSERT bla bla; UPDATE user set time=now() WHERE user_id=x limit 1";

(bruker laster siden på nytt)
$query = "SELECT time FROM user WHERE id=x";
$result = // $mysqli_fetch_array();
if ( $_SESSION['updated'] < $result['time'] ) 
{
  unserialize($obj);
  // bygg objekt på nytt, serialiser igjen
}

 

Noen tanker bare. Sikkert ingen spesielt god løsning, men første som slo meg.

  • Liker 1
Lenke til kommentar

Ja det vil jo fungere det! :) Men vil ikke dette være et vanlig problem for de som bruker f.eks memcache? Noen som kjenner til hvordan det løses der? Så at noen setter objekt cachinga på ett minutt. Men det virker jo litt unødvendig å måtte opprette objektene på nytt i TILFELLE noe var oppdatert på databasen. Så da syntes jeg heller din løsning med timestamp ville fungert bedre da

Lenke til kommentar

En måte jeg gjør det er å "version'e" nøkkelen. F.eks et event-system på ene siden har en "last event id" som f.eks er på 153771, og alle cache keys har da det event nummeret (f.eks "active_users_153771"). Når event id oppdateres så invalideres alle gamle keys. Det er ikke alltid helt optimalt (event for A invaliderer også cache for B), men fungerer stort sett ganske bra.

 

I andre tilfeller så er det å slette (eller regenerere cache innhold) når endring blir gjort.

 

f.eks "latest_news" - når en ny news entry blir lagt inn blir enten nøkkelen slettet, eller man genererer ny liste ved POST.

 

Du ser kanskje en forskjell mellom memcache og sessions, tho. Alle tråder har tilgang til memcache, og kan endre der. Litt vanskeligere med sessions.

Lenke til kommentar

Nå har jeg studert problemstillingen med å lagre objektet i sesjon, og jeg fant ikke __sleep() og __wakeup() som gode alternativer for å løse dette.

 

Jeg legger serialiseringen av objektet til sesjonen i __destruct(), da lagres alle endringer automatisk i sesjon.

 

Også bruker jeg unserialize() fra sesjon når jeg skal bruke objektet.

 

 

Når det gjelder oppdatering av data er ett versjonsnummer veldig vanlig, f.eks. ett timestamp.

Endret av xibriz
Lenke til kommentar

Er det virkelig nødvendig å drive med serialize/unserialize? Skjønte det sånn at siden PHP 5 så tar SESSION seg av det.

Men anyhow, hvorfor syntes du sleep og wakeup fungerte dårlig? Har ikke prøvd noen av disse selv da..

Lenke til kommentar

Tja.. ja og nei.

 

Hvis jeg ikke bruker serialize/unserialize får jeg problemer med at PHP ikke har loadet riktig klasse på forhånd pga. at jeg bruker en autoload-klasse om automatisk inkluderer riktig klasse når den blir brukt.

 

Jeg inkluderer aldri noen filer direkte i koden min.

 

The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "test" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in

 

Mulig det er en løsning på dette jeg ikke vet om enda.

 

 

Hvis du leser dokumentasjonen på sleep og wakeup så ser du at slik det er foreslått her ikke er riktig bruk av funksjonene.

 

 

EDIT:

 

Nå ble jeg motivert til å finne ut av dette, og det hadde noe å si i hvilken rekkefølge jeg inkluderte autoloader-klassen og kjørte session_start().

 

Hvis jeg inkluderete autoloader-klassen før session_start() slipper jeg å manuelt drive med serialize/unserialize, men hvis jeg inkluderete autoloader-klassen etter session_start() fikk jeg feilmeldingen som vist over her at den ikke finner riktig klasse, men det ordnet seg hvis jeg manuelt kjøre serialize/unserialize :)

Endret av xibriz
Lenke til kommentar

Jeg hadde også problemet med incomplete object. Jeg bare sørga for å include alle klasse-filene før jeg henta ut objektet av session.

Jeg har egentlig bare én ini fil med alle sammen:

 

    //Includes:
   require_once(INCLUDES_DIR."config.php");
   require_once(INCLUDES_DIR."course.class.php");
   require_once(INCLUDES_DIR."session.class.php");
   require_once(INCLUDES_DIR."part.class.php");
   require_once(INCLUDES_DIR."skill.class.php");
   require_once(INCLUDES_DIR."database.class.php");
   require_once(INCLUDES_DIR."functions.php");
   require_once(INCLUDES_DIR."user.class.php");
   require_once(INCLUDES_DIR."comment.class.php");
   require_once(INCLUDES_DIR."mobile.class.php");
   require_once(INCLUDES_DIR."user_session.class.php");

Den siste der user_session.class.php tar seg av å hente objektene, så den må være sist. Funker fett det :) ikke noe serializing eller noe sånt..

Lenke til kommentar

Kommer litt ann på hvor stort prosjekt du har, men å drive å huske på å inkludere filer er noe jeg aldri vil gå tilbake til.

 

Derfor har jeg en autoloader-klasse som henter en ferdig-parset filstruktur, eller parser filstrukturen for å lete etter nye klasser.

 

Og da inkluderer den kun klassene ved behov. Vet ikke hvordan det blir med ytelse dersom du inkluderer 200 filer men bare har bruk for 3?

Lenke til kommentar

Kommer litt ann på hvor stort prosjekt du har, men å drive å huske på å inkludere filer er noe jeg aldri vil gå tilbake til.

Derfor jeg bare inkluderer "../init.php" i hver fil :p

 

Men det er nok neppe ideelt i et stort prosjekt. Hadde nok aldri begynt med det hadde det ikke vært for at han duden i PHP Lynda.com kurset sa det hadde veldig lite å si ytelsesmessig. Så jeg var bare lat og har latt det være sånn for nå.

Lenke til kommentar

Kommer litt ann på hvor stort prosjekt du har, men å drive å huske på å inkludere filer er noe jeg aldri vil gå tilbake til.

Derfor jeg bare inkluderer "../init.php" i hver fil :p

 

Men det er nok neppe ideelt i et stort prosjekt. Hadde nok aldri begynt med det hadde det ikke vært for at han duden i PHP Lynda.com kurset sa det hadde veldig lite å si ytelsesmessig. Så jeg var bare lat og har latt det være sånn for nå.

 

Men du må fortsatt huske å legge nye filer i "../init.php".

 

Der er jeg lat siden jeg lagde ett rammeverk slik at jeg slipper det og heller parser filstrukturen :p

Endret av xibriz
Lenke til kommentar
  • 3 måneder senere...

Så, nå har jeg holdt på med PHP og AJAX en stund. Synes det er veldig lett å bruke i jQuery med JSON (til å begynne med sendte jeg alt tilbake som html! :glare: ).

 

Men jeg er litt nysgjerrig på hvordan dere strukturer det i et prosjekt. Sånn jeg har det nå, så har jeg en php fil som heter f.eks quiz.ajax.php hvor det er en hel rekke med if-er som bare venter på POST variabler sendt med ajax. Blir kanskje litt rotete, siden lista blir ganske lang :p

Også har jeg en functions.js (som inkluderes i index fila) med en hel rekke jQuery events som sender POST data. F.eks $(".showList").click(function(){ ..kode..}); som tar imot lista i JSON sendt fra PHP, og oppdaterer HTML-koden med lista.

Kan bli litt mye kode bare for å oppdatere småting.. Men er kanskje ikke så mange andre måter å gjøre det på?

Lenke til kommentar

Jo da, har database (MySQL), og er fult klar over sql injection :)

 

EDIT: Mulig jeg skifta tema litt, men tenkte det var unødvendig å starte en ny tråd siden vi var inne på noe av det samme :)

Endret av WillY-
Lenke til kommentar

så har jeg en php fil som heter f.eks quiz.ajax.php hvor det er en hel rekke med if-er som bare venter på POST variabler sendt med ajax. Blir kanskje litt rotete, siden lista blir ganske lang :p

 

Hvordan i strukturerer du det der, egentlig? Hardcoder du ting inn i scriptet? Burde det ikke heller vært et SELECT query der?

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...