Avatar billede htx98i17 Professor
13. november 2008 - 18:25 Der er 83 kommentarer og
1 løsning

Årets mærkeligste PHP opførsel

Det er med at finde på en titel som fanger, når man virkelig har brug for så mange eksperter der læser indlægget som muligt. :)

Følgende fil.php parses to gange. Læs korrekt: filen parses af PHP to gange efter hinanden. Der indsættes nemlig TO rækker i tabellen hver gang siden loades een gang.

fil.php

<body background="#CCCCCC">
<?
    mysql_connect("localhost","udvikling","adgangskode") or die("Kan ikke forbinde til mysqlserver");
    mysql_select_db("udvikling");
    session_start();
    mysql_query("INSERT INTO tider (url,tid,brugerid) VALUES ('$_SERVER[REQUEST_URI]',NOW(),'$_SESSION[sess_userid]') ")or die(mysql_error());
?>


Følgende fil parses EEN gang. Der indsættes een række i tabellen hver gang siden loades.

fil2.php

<body >
<?
    mysql_connect("localhost","udvikling","adgangskode") or die("Kan ikke forbinde til mysqlserver");
    mysql_select_db("udvikling");
    session_start();
    mysql_query("INSERT INTO tider (url,tid,brugerid) VALUES ('$_SERVER[REQUEST_URI]',NOW(),'$_SESSION[sess_userid]') ")or die(mysql_error());
?>

Som I kan se er den eneste forskel attributten background="#CCCCCC" !

Kan nogen ekspert fortælle mig hvor i hele hulen fanden i skuret, at lortet opfører sig sådan?

At tilføje: Det er nok kun at fjerne havelågen # for at få den til kun at parse een gang.

Serveren:
FreeBSD domain.dk 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 10:40:27 UTC 2007 root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386

PHP Version 5.2.3 - PHP API 20041225 - PHP Extension  20060613
Mysql 4.1.22
Avatar billede showsource Seniormester
13. november 2008 - 18:34 #1
Af hvad snakker du om ?

Men du kan jo prøve med en REPLACE i stedet for en INSERT
Avatar billede showsource Seniormester
13. november 2008 - 18:35 #2
Nå, hov, hvis du laver output til browser ( <body background="#CCCCCC"> )
og derefter session_start() skal der jo gå ged i den ! :O)
Avatar billede htx98i17 Professor
13. november 2008 - 18:41 #3
Ja nemlig. Jeg er glad for at du studser over det lige så meget som jeg.
Og jeg har prøvet at bytte om så session_start() kommer som det første. Det gør ingen foreskel.
Avatar billede showsource Seniormester
13. november 2008 - 18:43 #4
Nu er det jo ikke hele koden for sitet du viser, så evt. er der en include() to steder.
Evt. flere session_start() :O)
Avatar billede htx98i17 Professor
13. november 2008 - 18:45 #5
Jeg må hellere også lige fortælle at oprindeligt var session_start() i toppen. Derudover: problemet er ikke kun i denne fil. Problemet går igen i et større manager system.
Avatar billede htx98i17 Professor
13. november 2008 - 18:45 #6
showsource: Det du ser, er hvad der er. Jeg lover det. Det er 7 linjer. Intet andet.
Avatar billede showsource Seniormester
13. november 2008 - 18:55 #7
Jahh, du viser jo ikke al php kode, så hvor det egentlig går galt kan der jo kun gættes på! :O)

Den kode du viser, burde ikke lave to inserts
Avatar billede htx98i17 Professor
13. november 2008 - 18:57 #8
Jeg viser alt kode. Der er ingen includes, eller andet. Hvad jeg har postet her, er hvad der er.
Avatar billede showsource Seniormester
13. november 2008 - 19:07 #9
Det får du mig ikke til at tro på :O)
Avatar billede htx98i17 Professor
13. november 2008 - 19:12 #10
Jeg ved godt det lyder fuldstændig vanvittigt. Og du kan tro jeg har overvejet mange gange om jeg overhovedet skulle poste dette spørgsmål, af fare for at latterliggøre mig selv. Men læs her: Jeg opdagede problemet for over 1 år siden og jeg har skruplet over det siden. Og det er lige før jeg vil poste login til server for at bevise at det er rigtigt hvad jeg siger :)
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:15 #11
Det har intet med PHP at gøre. Men når du ikke afleverer et lovligt HTML-dokument til en browser, kan du ikke regne med hvad browseren gør. Den kan hente det 2 gange. Såmænd.
Avatar billede htx98i17 Professor
13. november 2008 - 19:20 #12
Erik vil du ikke forklare nærmere. please
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:28 #13
Du kunne jo starte med at undersøge hvad background-attributten gør ved en body-tag.
Avatar billede htx98i17 Professor
13. november 2008 - 19:29 #14
Nu ved jeg at du har svaret allerede. Du piner mig :)
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:30 #15
Ja
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:31 #16
Den er faktisk ret sjov. Det burde udløse en (virtuel) kvajebajer.
Avatar billede htx98i17 Professor
13. november 2008 - 19:33 #17
At background er til billeder og bgcolor er til en farvekode?
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:34 #18
Ok, jeg må hellere, af hensyn til olebole, og andre fluekneppere, præcisere: Det handler ikke om et "lovligt" HTML-dokument, men om man får skrevet det man mener, eller mener det man skriver.

Normalt vil jeg ikke, men html.dk har en fin oversigt over alle tags og attributter.
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:34 #19
Det er korrekt. Hvorfor sker det så?
Avatar billede showsource Seniormester
13. november 2008 - 19:34 #20
Jeg vil gerne ha' kvajebajeren ! :O)
Avatar billede htx98i17 Professor
13. november 2008 - 19:36 #21
Fordi at browseren søger en fil men får en farvekode. Så browseren loader siden gennem background tagget?
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:37 #22
Mnjahhhh, det er i den retning. Men den ved jo ikke den får en farvekode, "#CCCCCC". Hvad er det den får som værdi til attributten background?
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:38 #23
Eller hvad er det den forventer?
Avatar billede htx98i17 Professor
13. november 2008 - 19:40 #24
for f..... du piner mig. Jeg sidder her og bider negle. Jeg får helt sikkert admin til at slette dette spørgsmål bagefter.

den får en forkert værdi, men det skal da ikke få den til at læse siden 2 gange. arg afslør det.
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:40 #25
Du er godt nok tæt på. Den forventer en URL. Står der "CCCCCC" leder den efter en http://dit.domæ.ne/CCCCCC . Står der "#CCCCCC" leder den efter http://dit.domæ.ne/#CCCCCC . HVad er forskellen?
Avatar billede htx98i17 Professor
13. november 2008 - 19:40 #26
den forventer et filnavn
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:41 #27
Eller i dit tilfælde hvis filen hedder fil.php:
  http://dit.domæ.ne/CCCCCC
hhv
  http://dit.domæ.ne/fil.php#CCCCCC
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:41 #28
# er "anchor" notation
Avatar billede htx98i17 Professor
13. november 2008 - 19:43 #29
Ja det var det jeg mente. Fuck hvor er du god erik.

ja det er et anchor...

DOH!

En kvajebajer skal du have!

Men hvorfor har jeg ikke været udsat for det problem før? pga browser version?
Avatar billede htx98i17 Professor
13. november 2008 - 19:44 #30
Showsource: du kan trøste mig hvis du fortæller mig at det kunne lige så godt have været dig der lavede den fejl. sig det så :)
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:45 #31
Ehm. Du burde have set det før ....  Måske har du brugt bgcolor, som du "mente". Eller også har IE (måske, bruger den ikke), cached fil.php, for den ændrer sig ikke pga et "anchor"
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:46 #32
Hvis du bruger # i en url på samme side, hentes siden ikke igen, når man hopper op og ned i siden.
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:48 #33
Man kan forøvrigt nemt efterprøve dette fænomen, med dette korrekte HTML-kode:

<?php session_start(); header("Content-Type: text/html;charset=iso-8859-1");?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title>852727</title>
</head>
<body background="#cccccc">
<?php
$_SESSION['x']++; print $_SESSION['x'];
?>
</body>
</html>
Avatar billede htx98i17 Professor
13. november 2008 - 19:48 #34
Det er korrekt. Hvorfor gør den det så her?
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:49 #35
Kan ses på http://n0p.com/852722.php i ovennævnte form. Lad os høre hvad forskellige browsere gør: tæller op med een eller 2. Prøv at opdatere et par gange.
Avatar billede htx98i17 Professor
13. november 2008 - 19:50 #36
Dit eksempel viser 1 ved første load og derefter +2 hver gang
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:51 #37
"Hvorfor gør den det så her?" - browseren kunne cache siden, men gør det så ikke. Måske, principielt, en slags fejl. Men måske cacher de afhængig af type, og her forventes et billede. Nej, jeg ved det ikke.
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:51 #38
"derefter +2 hver gang" ... i hvilken browser?
Avatar billede htx98i17 Professor
13. november 2008 - 19:52 #39
IE 7.0.5730.13
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:52 #40
Og jeg har testet i FF 3.0.3 - vistnok med standard indstillinger.
Avatar billede htx98i17 Professor
13. november 2008 - 19:53 #41
Hvad gør din, en eller to?
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:54 #42
Ganske som du beskriver. Google Chrome li'sådan (0.3.154.9)
Avatar billede htx98i17 Professor
13. november 2008 - 19:55 #43
Erik så har jeg et tillægsspørgsmål: Kan dette problem være årsag til at sitet "hænger" sporadisk? Ved godt at det er et udefineret problemformulering. Men det er fejlfindingen på at sitet sporadisk hænger, der har ført til dette problem med body tagget.
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:56 #44
Men du har simpelthen sørget for dagens underholdende indslag. Og bare rolig: jeg (vi?) griner ikke af dig, men med dig!
Avatar billede erikjacobsen Ekspert
13. november 2008 - 19:57 #45
Ja, browseren hænger tilsynelande når den henter noget, den ikke kan tolke som et billede. Igen ikke noget med dit site, som sådan - (uforklarlig) browseropførsel.
Avatar billede htx98i17 Professor
13. november 2008 - 19:57 #46
eller rettere, ...at jeg fandt problemet med body tagget.
Avatar billede showsource Seniormester
13. november 2008 - 19:58 #47
Hvornår får jeg en kvajebajer ? :O)
Avatar billede htx98i17 Professor
13. november 2008 - 19:59 #48
showsource -> helt ærligt, sig det nu :)

MEN! hvordan skulle stakkels jeg vide at det hang sådan sammen? dumme browser
Avatar billede showsource Seniormester
13. november 2008 - 20:00 #49
Godt at erik er her !
Avatar billede erikjacobsen Ekspert
13. november 2008 - 20:03 #50
Avatar billede erikjacobsen Ekspert
13. november 2008 - 20:04 #51
Anmeld dig selv, men lad bare spørgsmålet stå. Ik'?
Avatar billede htx98i17 Professor
13. november 2008 - 20:09 #52
Tusind tusind tak Erik. Jeg fatter ikke hvordan du gør det.
Avatar billede htx98i17 Professor
13. november 2008 - 20:13 #53
Erik Jacobsen for president!

jeg mener det
Avatar billede erikjacobsen Ekspert
13. november 2008 - 20:15 #54
Hehe.
Avatar billede showsource Seniormester
13. november 2008 - 20:22 #55
Well, bare det ikke er president for USA så ok, og hvornår får jeg den kvajebajer ?
Avatar billede htx98i17 Professor
13. november 2008 - 20:25 #56
Du kan få nogle point kan du. Lig et svar. Så får Erik bajeren
Avatar billede showsource Seniormester
13. november 2008 - 20:26 #57
Jeg skal ikke ha' point, men bajser !!!!! :O)
Avatar billede showsource Seniormester
13. november 2008 - 20:30 #58
UPS -- gerne et sted med et billard bord ! :O)
Avatar billede htx98i17 Professor
16. november 2008 - 16:01 #59
Erik jeg kan se i dit eksempel 19:48:05 at du bruger session_start(). Er det for at sikre at session fungerer hvis man ikke har version 4.1.0 eller derover? eller mener du man bør bruge session_start() hele siden?
Avatar billede olebole Juniormester
16. november 2008 - 16:09 #60
<ole>

Du skal altid kalde session_start, hvis du vil bruge sessions

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
16. november 2008 - 16:12 #61
Man behøver ikke sige session_start i toppen af PHP-scripts på en server, hvor PHP er indstillet til at gøre det automatisk. Men det er selvfølgelig en go' ting, hvis man vil holde sine scripts flytbare.
Avatar billede olebole Juniormester
16. november 2008 - 16:13 #62
- med mindre session.auto_start er sat til true i php.ini, hvilket er ret sjældent  =)
Avatar billede olebole Juniormester
16. november 2008 - 16:14 #63
- et kryds i kalenderen, Erik?  ;o)
Avatar billede erikjacobsen Ekspert
16. november 2008 - 16:14 #64
Det er den her indstilling i php.ini:

; Initialize session on request startup.
session.auto_start = 0

Man ser tit at den er sat til 0 (false), for så sparer man lidt serverkraft på de sider, hvor man ikke bruger sessions.
Avatar billede erikjacobsen Ekspert
16. november 2008 - 16:15 #65
Eller 2 krydser ;)
Avatar billede htx98i17 Professor
16. november 2008 - 16:22 #66
Altså på min server er autostart sat til OFF. Men jeg har faktisk lige fjernet session_start() fra alle mine sider og session fungerer stadig? jeg kalder alle session variabler fra superglobal $_SESSION

Hvordan/hvorfor fungerer det lige?
Avatar billede olebole Juniormester
16. november 2008 - 16:24 #67
Det bør det heller ikke
Avatar billede erikjacobsen Ekspert
16. november 2008 - 16:28 #68
De sessions, der er, vil blive der, men der skulle ikke kunne komme nye. Men har du rettet det rette sted. Check det med en .php fil med:  <?php phpinfo(); ?>
Avatar billede htx98i17 Professor
16. november 2008 - 16:33 #69
session_start() bliver overhovedet ikke kaldt mere. Og selvom jeg lukker browseren og åbner en ny browser og logger ind, så fungerer session upåklageligt. Men det bør det ikke?

i phpinfo står der
session.auto_start Off Off

Jeg havde session_start() i en include hvor der også blev skabt forbindelse til mysql. Jeg fjernede session_start() fra den include.
Avatar billede erikjacobsen Ekspert
16. november 2008 - 16:46 #70
Og den skal vi tro på? ;)

http://n0p.com/852722x.php  Koden er:

<?php
  $_SESSION['xx']++; print $_SESSION['xx'];
?>

Sessions starter ikke automatisk. Og hvad sker der - det som Ole og mig (eller hedder det jeg?) forventer.
Avatar billede htx98i17 Professor
16. november 2008 - 16:52 #71
tja tjo... vent lidt :)

for nu har jeg lige lavet en fil med kun det kode du skriver der, og den tæller ihvertfald ikke en op...
Avatar billede erikjacobsen Ekspert
16. november 2008 - 16:56 #72
Den mest oplagte forklaring viser sig tit at være den korrekte, hehe.
Avatar billede htx98i17 Professor
16. november 2008 - 17:02 #73
altså kender i det der, når der er noget som burde være vildt logisk, pludseligt bliver ubegribeligt. Men jeg tror jeg har fundet ud af det nu :) skal vi ikke lade den ligge her.
Avatar billede erikjacobsen Ekspert
16. november 2008 - 17:03 #74
Gerne. Der er dog 2 ting jeg skal be' om

1) Du får afsluttet spørgsmålet på en eller anden måde. Jeg samler ikke på point.
2) Du ved lejlighed lige ultrakort siger om dit "store problem" så blev løst - jeg er bare lidt nysgerrig. Og jeg siger det ikke til nogen!
Avatar billede htx98i17 Professor
16. november 2008 - 17:08 #75
Jeg lukker gerne.

Jeg giver besked om det store problem er løst, når jeg får tilbagemeldinger fra brugerne af systemet.
Avatar billede htx98i17 Professor
19. november 2008 - 22:19 #76
Indtil videre har der ikke været en skygge af "det store problem". Systemet har ikke hængt en eneste gang siden. Jeg giver besked igen når der er gået længere tid.
Avatar billede erikjacobsen Ekspert
19. november 2008 - 22:20 #77
:)
Avatar billede erikjacobsen Ekspert
16. december 2008 - 11:49 #78
Det er ikke så tit jeg har kigget i det dueslag, men jeg kom forbi i dag.

Så tak for gaven, htx98i17.

Men nu er jeg lidt nysgerrig - hvem gemmer sig bag htx98i17 ?  ;)
Avatar billede olebole Juniormester
16. december 2008 - 12:13 #79
- og vi andre (olebole og hudorme) er nysgerrige efter at vide, hvad der gemte sig i dueslaget  =)
Avatar billede erikjacobsen Ekspert
16. december 2008 - 12:45 #80
Det var ikke italiensk.
Avatar billede olebole Juniormester
16. december 2008 - 15:53 #81
Okay ... ja, det er godt at kende sine koder  ;o)
Avatar billede htx98i17 Professor
09. april 2010 - 11:40 #82
Fik lige lyst til at genlæse en af mine bedste eksperten.dk oplevelser :)

Jeg kan informere om at systemet har ikke hængt siden erik løste dette problem. Så det kunne da godt ske at gaven skulle have været fransk i stedet for? :)
Avatar billede erikjacobsen Ekspert
09. april 2010 - 17:54 #83
Det er god underholdningsværdi. Var den ikke fransk? Længe siden...
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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