/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Hvordan processeres php-kode?
Fra : Lasse Vestergaard


Dato : 07-04-11 12:53

Hej!

Jeg har nu i et stykke tid ledt rundt på det store internet, men
jeg har endnu ikke fået svar på mit spørgsmål.

Hvordan evalueres php-kode? Løber webserveren gennem php-koden
linje for linje og venter de steder hvor der eksempelvis laves
forespørgsler til en database? Efter forespørgslen til databasen
har returneret fortsætter php-koden så med at evaluere der fra,
eller er webserveren fortsat med at evaluere den kode der måtte
komme efter databasekaldet, før databasekaldet har returneret?

Jeg ved der findes et begreb der dækker over dette, men jeg kan
simpelthen ikke huske hvad begrebet hedder og det har ikke været
muligt for mit at finde frem til det på Google .

Mit konkrete problem er at jeg har en funktion hvor jeg har lagt
en SESSION variabel ind som parameter. I funktionen foretager jeg
et kald til en MySQL-database med de oplysninger der står i
SESSION-variablen. Længere nede i funktionen nulstiller jeg
SESSION-variablen, da jeg jo regner med variablens indhold
allerede er blevet brugt. Men jeg oplever af og til problemer med
at SESSION data ikke bliver gemt i min database.

Vh

Lasse

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Andreas Andersen (07-04-2011)
Kommentar
Fra : Andreas Andersen


Dato : 07-04-11 13:16

Den 07-04-2011 13:53, Lasse Vestergaard skrev:
> Hej!
>
> Jeg har nu i et stykke tid ledt rundt på det store internet, men
> jeg har endnu ikke fået svar på mit spørgsmål.
>
> Hvordan evalueres php-kode? Løber webserveren gennem php-koden
> linje for linje og venter de steder hvor der eksempelvis laves
> forespørgsler til en database? Efter forespørgslen til databasen
> har returneret fortsætter php-koden så med at evaluere der fra,
> eller er webserveren fortsat med at evaluere den kode der måtte
> komme efter databasekaldet, før databasekaldet har returneret?
>
> Jeg ved der findes et begreb der dækker over dette, men jeg kan
> simpelthen ikke huske hvad begrebet hedder og det har ikke været
> muligt for mit at finde frem til det på Google .
>
> Mit konkrete problem er at jeg har en funktion hvor jeg har lagt
> en SESSION variabel ind som parameter. I funktionen foretager jeg
> et kald til en MySQL-database med de oplysninger der står i
> SESSION-variablen. Længere nede i funktionen nulstiller jeg
> SESSION-variablen, da jeg jo regner med variablens indhold
> allerede er blevet brugt. Men jeg oplever af og til problemer med
> at SESSION data ikke bliver gemt i min database.

Det skulle være, hvis mysql-kald blev udført asynkront, men det gør de
ikke. Der må være noget andet i vejen.

--
Andreas

Lasse Vestergaard (07-04-2011)
Kommentar
Fra : Lasse Vestergaard


Dato : 07-04-11 13:38

Ok. Så må jeg tilstå jeg er ret meget på bar bund. Jeg ligger lige noget
kode op så kan i evt. se om der er noget mistænkeligt i det.

Først laver jeg et AJAX-kald der poster fra en html-form og følgende
php-kode kaldes:

$tilid=dbRegisterUser($_POST['navn'], $_POST['telefon'],
$_POST['email'],$postnr,$alder,$_POST['sex'],$nyhedsb,$_SESSION['basket'])
;
submitform($tilid,$_POST['navn'],$_POST['email']);

dbRegisterUser funktionen:

function dbRegisterUser($navn, $tlf,
$mail,$postnummer,$alder,$sex,$nyhedsbrev,$tilmeldte){
   mysql_query("LOCK TABLES tilmeldt WRITE, tilmeldtftst WRITE");
   mysql_query("insert into tilmeldt (navn, tlf, mail, postnummer, alder,
sex, nyhedsbrev) values ('$navn', $tlf,
'$mail',$postnummer,$alder,'$sex',$nyhedsbrev)") or die(mysql_error());
   $DBtid = mysql_insert_id();
//Det er sker indtil her lader til altid at komme ned i databasen. Det
næste kommer ikke altid i databasen. I ca. 30 procent af tildældende
bliver det efterfølgende ikke kørt.
   if(!empty($tilmeldte)){
      foreach($tilmeldte as $key => $value)
         mysql_query("insert into tilmeldtftst (tilid,ftstid,antal) values
($DBtid,$key,$value)");
   }
   mysql_query("UNLOCK TABLES");
   return $DBtid;
}


submitform funktionen:

function submitform($tilid,$navn, $email){
   
//Der sendes en mail
   
   dbDeleteSessionFromTempCart(session_id());
   $_SESSION['basket']=array();
}

dbDeleteSessionFromTempCart funktionen:

function dbDeleteSessionFromTempCart($sesid){
   mysql_query("delete from tempcart where sesid='$sesid'");
}

Er der umiddelbart noget unaturligt her?

Vh

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Andreas Andersen (07-04-2011)
Kommentar
Fra : Andreas Andersen


Dato : 07-04-11 15:06

Den 07-04-2011 14:38, Lasse Vestergaard skrev:
> //Det er sker indtil her lader til altid at komme ned i databasen. Det
> næste kommer ikke altid i databasen. I ca. 30 procent af tildældende
> bliver det efterfølgende ikke kørt.
>    if(!empty($tilmeldte)){
>       foreach($tilmeldte as $key => $value)
>          mysql_query("insert into tilmeldtftst (tilid,ftstid,antal) values
> ($DBtid,$key,$value)");
>    }
>    mysql_query("UNLOCK TABLES");
>    return $DBtid;
> }

Er du sikkert på at $tilmeldte altid indeholder data? Har du prøvet at
skrive din query ud og køre den direkte på databasen?

--
Andreas

Lasse Vestergaard (07-04-2011)
Kommentar
Fra : Lasse Vestergaard


Dato : 07-04-11 18:03

> Er du sikkert på at $tilmeldte altid indeholder data? Har du prøvet at
> skrive din query ud og køre den direkte på databasen?

Det er nemlig det der er problemet. $tilmeldte refererer til en
funktionsparameter. Så $tilmeldte refererer til $_SESSION['basket']. Jeg
nulstiller $_SESSION['basket'] senere i koden og det var derfor jeg ville
høre om php "kører videre" med at evaluere koden mens den venter på svar
fra databasen.

Så vidt jeg kan se virker min query fint nok, men det er som om
$_SESSION['basket'] ikke altid har indhold, som du påpeger. Det underlige
er at hver gang jeg selv tester så virker det fint (jeg har testet firefox
4, IE 9, og nyeste Safari). Og det fungere også i mange tilfælde når kunder
bruger systemet (ca. 70 % af tilfældende). Umiddelbart må det næsten have
noget at gøre med SESSION. Jeg kan bare ikke forstå at SESSION nogle gange
skulle fejler med at blive initialiseret. Jeg har noget statistik til at
køre på min database hvor jeg kan se hvilken browser kunderne bruger og det
strækker sig over stort set hele spektret af browsere og versioner af
disse. Så det er ikke noget med at bestemte browserversioner ikke vil være
med til noget.

Hvis ikke det har noget at gøre med SESSION så er mit eneste bud at jeg
gøre noget forkert i forhold til LOCK og UNLOCK af tabeller i databasen, så
hele databasen kommer til at fryse i lang tid. Hvilket så vil resultere i
at forespørgsler går tabt.

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Andreas Andersen (07-04-2011)
Kommentar
Fra : Andreas Andersen


Dato : 07-04-11 20:01

Den 07-04-2011 19:03, Lasse Vestergaard skrev:
> Så vidt jeg kan se virker min query fint nok, men det er som om
> $_SESSION['basket'] ikke altid har indhold, som du påpeger. Det underlige
> er at hver gang jeg selv tester så virker det fint (jeg har testet firefox
> 4, IE 9, og nyeste Safari). Og det fungere også i mange tilfælde når kunder
> bruger systemet (ca. 70 % af tilfældende). Umiddelbart må det næsten have
> noget at gøre med SESSION. Jeg kan bare ikke forstå at SESSION nogle gange
> skulle fejler med at blive initialiseret. Jeg har noget statistik til at
> køre på min database hvor jeg kan se hvilken browser kunderne bruger og det
> strækker sig over stort set hele spektret af browsere og versioner af
> disse. Så det er ikke noget med at bestemte browserversioner ikke vil være
> med til noget.

Kan det have noget at gøre med at sessionen timer ud? Man kan sætte en
parameter, der hedder gc_maxlifetime i php.ini. På min maskine er den
sat til 24 minutter, som vel er default:

session.gc_maxlifetime = 1440

Så hvis en bruger sidder og kigger på varer i over 24 minutter, kunne
sessionsdataene blive garbage collected.

Jeg er ikke ekspert i PHP's session management system, så det er gæt.

--
Andreas

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste