/ 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
Fejl ved inkludering af en fil
Fra : Bertel Lund Hansen


Dato : 09-06-07 11:09

Hej alle

Jeg får en sær fejl ved et program jeg arbejder på. Det er opdelt
i flere filer, og der bruges databaseadgang (MySQL) i flere af
dem, så jeg samlede databasefunktionerne i én fil. Den bliver
required_once i tre af filerne. Det meste virker fejlfrit som
forventet, men ved én af filern får jeg denne fejl:

Warning: Cannot modify header information - headers already sent
by (output started at <sti>\<includefilnavn>:50) in
<sti>\<andet filnavn> on line 84

Jeg forstår det ikke. Jeg gik tilbage til den oprindelige fil der
bruger sine egne databaserutiner, og så fandt jeg ud af at fejlen
optræder blot jeg inkluderer filen. Jeg kunne endda kommentere
hele dens indhold ud uden at fejlen forsvandt, og jeg var hjeller
ikke begyndt at bruge dens funktioner.

Den primære fil kaldes direkte af en bruger der vil aktivere sit
medlemskab via et browserlink og er som sådan uafhængig af de
andre filer.

Som sagt kan jeg inkludere filen de to andre steder og fint bruge
dens funktioner.

Er der nogen der har et bud?

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

 
 
Bertel Lund Hansen (09-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-06-07 11:21

Bertel Lund Hansen skrev:

> Jeg får en sær fejl ved et program jeg arbejder på.

Og nu fandt jeg årsagen. Hovedfilen benyttede nogle
mysql-funktioner efter at databasefunktionerne var blevet kaldt.
Når kaldet skete i en funktion, blev der jo lukket for det varme
mysql-vand.

Men det var en forvirrende fejlbesked at få.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Bertel Lund Hansen (09-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-06-07 17:08

Bertel Lund Hansen skrev:

> Men det var en forvirrende fejlbesked at få.

Senere fandt jeg en anden fejl der var drilagtig:

Jeg har for vane at afslutte en fil med linjeskift så cursoren
står på en tom linje. Da jeg havde gjort det ved en fil der
bliver inkluderet, og som ikke producerer udskrift, gav det en
fejl når jeg senere brugte en header-kommando fordi linjeskiftet
blev opfattet som om siden allerede var påbegyndt, og så er der
jo lukket for header-kommandoen.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Mads Lie Jensen (09-06-2007)
Kommentar
Fra : Mads Lie Jensen


Dato : 09-06-07 21:17

On Sat, 9 Jun 2007 18:07:58 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Senere fandt jeg en anden fejl der var drilagtig:
>
>Jeg har for vane at afslutte en fil med linjeskift så cursoren
>står på en tom linje. Da jeg havde gjort det ved en fil der
>bliver inkluderet, og som ikke producerer udskrift, gav det en
>fejl når jeg senere brugte en header-kommando fordi linjeskiftet
>blev opfattet som om siden allerede var påbegyndt, og så er der
>jo lukket for header-kommandoen.

Man kan lade være med at afslutte sine php-filer med ?>
- så sker der ikke noget ved et linieskift sidst i filen. Det er kun
hvis linieskiftene ligger uden for <?php ?>-tags at det har betydning.

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
Gartneriet - http://www.gartneriet.dk/

Bertel Lund Hansen (09-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 09-06-07 22:20

Mads Lie Jensen skrev:

> Man kan lade være med at afslutte sine php-filer med ?>

Ja, det gik op for mig da jeg fandt en fil der sluttede sådan
(jeg bearbejder andres filer i projektet).

Nu er jeg i to sind for jeg vil helst lukke alle tags efter mig,
men på den anden side så er et usynligt tegn der giver fejl,
altså noget lusk som før har drillet mig i andre sammenhænge.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Michael Zedeler (10-06-2007)
Kommentar
Fra : Michael Zedeler


Dato : 10-06-07 09:48

Bertel Lund Hansen wrote:
> Mads Lie Jensen skrev:
>
>> Man kan lade være med at afslutte sine php-filer med ?>
>
> Ja, det gik op for mig da jeg fandt en fil der sluttede sådan
> (jeg bearbejder andres filer i projektet).
>
> Nu er jeg i to sind for jeg vil helst lukke alle tags efter mig,
> men på den anden side så er et usynligt tegn der giver fejl,
> altså noget lusk som før har drillet mig i andre sammenhænge.

Sørg for at det sidste, der står på den sidste linie er den tag, der
lukker. Mon ikke du har lært lektien nu, så du hurtigere løser
problemet, hvis det opstår igen?

Mvh. Michael.

Michael Zedeler (10-06-2007)
Kommentar
Fra : Michael Zedeler


Dato : 10-06-07 09:47

Mads Lie Jensen wrote:
> On Sat, 9 Jun 2007 18:07:58 +0200, Bertel Lund Hansen
> <unospamo@lundhansen.dk> wrote:
>
>> Senere fandt jeg en anden fejl der var drilagtig:
>>
>> Jeg har for vane at afslutte en fil med linjeskift så cursoren
>> står på en tom linje. Da jeg havde gjort det ved en fil der
>> bliver inkluderet, og som ikke producerer udskrift, gav det en
>> fejl når jeg senere brugte en header-kommando fordi linjeskiftet
>> blev opfattet som om siden allerede var påbegyndt, og så er der
>> jo lukket for header-kommandoen.
>
> Man kan lade være med at afslutte sine php-filer med ?>
> - så sker der ikke noget ved et linieskift sidst i filen. Det er kun
> hvis linieskiftene ligger uden for <?php ?>-tags at det har betydning.

Det lyder som en ekstremt dårlig idé. Det er jo ikke gyldig syntaks og
den næste version af PHP kan lige så godt finde på at kaste op, når den
ser det.

Mvh. Michael.

Mads Lie Jensen (10-06-2007)
Kommentar
Fra : Mads Lie Jensen


Dato : 10-06-07 10:53

On Sun, 10 Jun 2007 10:46:37 +0200, Michael Zedeler <michael@zedeler.dk>
wrote:

>> Man kan lade være med at afslutte sine php-filer med ?>
>> - så sker der ikke noget ved et linieskift sidst i filen. Det er kun
>> hvis linieskiftene ligger uden for <?php ?>-tags at det har betydning.
>
>Det lyder som en ekstremt dårlig idé. Det er jo ikke gyldig syntaks og
>den næste version af PHP kan lige så godt finde på at kaste op, når den
>ser det.

Jo, det er gyldig syntaks.
Jeg kan desværre ikke lige finde frem til hvor det står, men det er
gyldigt nok.

DB_DataObject i PEAR laver kode som ikke har en afsluttende ?>
--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
Gartneriet - http://www.gartneriet.dk/

Michael Zedeler (10-06-2007)
Kommentar
Fra : Michael Zedeler


Dato : 10-06-07 11:11

Mads Lie Jensen wrote:
> On Sun, 10 Jun 2007 10:46:37 +0200, Michael Zedeler <michael@zedeler.dk>
> wrote:
>
>>> Man kan lade være med at afslutte sine php-filer med ?>
>>> - så sker der ikke noget ved et linieskift sidst i filen. Det er kun
>>> hvis linieskiftene ligger uden for <?php ?>-tags at det har betydning.
>> Det lyder som en ekstremt dårlig idé. Det er jo ikke gyldig syntaks og
>> den næste version af PHP kan lige så godt finde på at kaste op, når den
>> ser det.
>
> Jo, det er gyldig syntaks.
> Jeg kan desværre ikke lige finde frem til hvor det står, men det er
> gyldigt nok.
>
> DB_DataObject i PEAR laver kode som ikke har en afsluttende ?>

Hverken at det bliver brugt andre steder eller at det ser ud til at
virke lige nu, betyder at det er gyldig syntaks. Jeg har også ledt og
ikke fundet nogen steder, hvor der står at man kan udelade en
afsluttende ?>.

Mvh. Michael.

Peter Brodersen (10-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 10-06-07 02:06

On Sat, 9 Jun 2007 18:07:58 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Jeg har for vane at afslutte en fil med linjeskift så cursoren
>står på en tom linje. Da jeg havde gjort det ved en fil der
>bliver inkluderet, og som ikke producerer udskrift, gav det en
>fejl når jeg senere brugte en header-kommando fordi linjeskiftet
>blev opfattet som om siden allerede var påbegyndt, og så er der
>jo lukket for header-kommandoen.

For en god ordens skyld:

Ved ?> og et linjeskift bliver linjeskiftet ikke medtaget i outputtet.

Så fx ved:

Foo
<?php
print "Bar";
?>
Baz


... vil outputtet være:

Foo
BarBaz

Bemærk, intet linjeskift mellem Bar og Baz.

--
- Peter Brodersen
Kendt fra Internet

Bertel Lund Hansen (10-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-06-07 09:21

Peter Brodersen skrev:

> Ved ?> og et linjeskift bliver linjeskiftet ikke medtaget i outputtet.

Så forklar mig hvordan fejlen forsvandt da jeg fjernede
linjeskiftet (og intet andet).

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Peter Brodersen (10-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 10-06-07 21:55

On Sun, 10 Jun 2007 10:21:25 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>> Ved ?> og et linjeskift bliver linjeskiftet ikke medtaget i outputtet.
>
>Så forklar mig hvordan fejlen forsvandt da jeg fjernede
>linjeskiftet (og intet andet).

Så kan du først forklare, hvorfor mit eksempel giver et let
reproducérbart resultat, som understøtter min påstand :)

I de snart 10 år, jeg har rodet med PHP, har jeg ikke oplevet det
problem, du nævner (med forbehold for PHP/FI-tiden, hvor tags også så
anderledes ud). Mange af de filer, jeg inkluderer, har netop
linjeskift efter ?> i slutningen.

Men bemærk, at hvis du har et hvilket som helst tegn efter ?> - for
eksempel blot et mellemrum - så vil det netop blive outputtet. Det
samme gælder, hvis du har et mellemrum på den "tomme" linje derefter.

Lad os få lidt empiri på banen. Jeg har lavet et par tests:

?>(linjeskift)
... giver ikke noget ekstra output.

?>(mellemrum)
... giver både et mellemrum og et linjeskift (i den rækkefølge).
Bemærk, at vi rent faktisk også får et linjeskift "foræret" her.

?>(mellemrum)(linjeskift)
... giver både et mellemrum og *to* linjeskift.

?>(linjeskift)(mellemrum)
... giver et mellemrum og linjeskift (i den rækkefølge). Det første
linjeskift efter ?> bliver altså ignoreret, men PHP tilføjer som set
ovenfor selv et linjeskift, hvis der er ikke-PHP-output i slutningen.


Der er ingen forskel på hvad type output, man har. Følgende
udskiftning af mellemrum til tabulator giver samme type resultat:

?>(tabulator)
... giver både tabulator og linjeskift.

?>(linjeskift)(tabulator)
... giver tabulator og linjeskift (i den rækkefølge).


Resultatet er altså stadigvæk, som alle ovenstående eksempler viser,
at ?>(linjeskift) ikke giver noget linjeskift i sig selv.

Hvis du sender mig dine reelle originalfiler, så vil jeg kunne
forklare, hvorfor du oplevede den fejl, du gjorde. Mit bedste bud er,
at på den "tomme linje", du fjernede i slutningen, havde du rent
faktisk et par mellemrum eller tabulator, som måske ikke fremgik af
din editor, eller måske automatisk blev sat ind som indents.

--
- Peter Brodersen
Kendt fra Internet

Bertel Lund Hansen (10-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-06-07 22:24

Peter Brodersen skrev:

> forklare, hvorfor du oplevede den fejl, du gjorde. Mit bedste bud er,
> at på den "tomme linje", du fjernede i slutningen, havde du rent
> faktisk et par mellemrum eller tabulator, som måske ikke fremgik af
> din editor, eller måske automatisk blev sat ind som indents.

Min editor er sat til at strippe efterhængte blanktegn.

Jeg vil lave et modelforsøg.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Bertel Lund Hansen (10-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-06-07 22:56

Bertel Lund Hansen skrev:

> Jeg vil lave et modelforsøg.

Og det er her (på samme server hvor jeg fik problemet):

   http://lki.dk/test/test1.php

   http://lki.dk/test/test2.php

test1.php oh test2.php er identiske bortset fra at de inkluderer hver sin fil,
funk1.inc.php og funk2.inc.php.
Den eneste forskel på de to er at jeg lavede et linjeskift efter ?> i nr. 2.

test1.php:
================
<?
include 'funk1.inc.php';
header( 'Location: http://lki.dk/test/slutfil.htm');
?>
<html>
<head>
<title>Test af efterhængte linjeskift</title>
</head>

<body>
<h1>Dette er test1.php i mappen test på lki.dk's server.</h1>
<? present(); ?>
</body>
</html>
================


funk1.inc.php
================
<?
function present () {
   echo "Jeg er en inkluderet funktion (eller procedure som nogle ville sige).\n";
   echo "Der er ingen efterhængte blanktegn i min include-fil.\n";
}
?>
================


test1.php virker som ønsket: Den stiller omgående videre
til slutfil.htm.

test2.php viser en fejl og udskriver resten af siden.
slutfil.htm aktiveres slet ikke.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Peter Brodersen (11-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 11-06-07 00:00

On Sun, 10 Jun 2007 23:56:10 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Og det er her (på samme server hvor jeg fik problemet):
>
>    http://lki.dk/test/test1.php
>
>    http://lki.dk/test/test2.php

Hm, det virker som en ret spøjs webserver - ved du hvad software, den
kører? Såvidt, jeg kan se, er det en eller anden "Web/2"-software...
noget OS/2-værk, måske?

Overordnet tror jeg, det er et problem med webserveren (eller måske
den PHP-implementation). Kigger man i PHP-manualen, finder man
følgende:

http://www.php.net/manual/en/language.basic-syntax.php
"when PHP hits the ?> closing tags, it simply starts outputting
whatever it finds (except for an immediately following newline"

http://www.php.net/manual/en/language.basic-syntax.instruction-separation.php
"The closing tag for the block will include the immediately trailing
newline if one is present."

Så den pågældende webserver gør det slet og ret forkert. Det er dog
selvfølgelig en ringe trøst, hvis man rent faktisk skal bruge den
webserver.


Noget helt andet... det er dog lidt paradoksalt med indholdet:
"lki.dk arbejder for at udbrede brugen af webstandarder"
... og at serveren så bare afbryder forbindelsen, hvis man sender et
HEAD-request i stedet for at give et korrekt HTTP-svar tilbage. Det er
også spøjst, at der kun svares på hvilken webserver-software, der er
tale om, når man får et 404-svar, men ikke når man får et 200-svar.

Hvis den webserver har flere mærkværdigheder, vil jeg skønne, at
lki.dk netop selv ville vælte i forhold til kommende webapperater, som
benytter sig af mere avancerede forespørgsler (som stadigvæk kan være
i overensstemmelse med gældende standarder).

--
- Peter Brodersen
Kendt fra Internet

Kim Ludvigsen (11-06-2007)
Kommentar
Fra : Kim Ludvigsen


Dato : 11-06-07 00:25

Den 11-06-07 00.59 skrev Peter Brodersen følgende:

> Hm, det virker som en ret spøjs webserver - ved du hvad software, den
> kører? Såvidt, jeg kan se, er det en eller anden "Web/2"-software...
> noget OS/2-værk, måske?

Ja, det er den her:
http://dink.org/web2

> Overordnet tror jeg, det er et problem med webserveren (eller måske
> den PHP-implementation).

Lyder ikke godt. Programmøren har et forum
(http://dink.org/web2/web2msgboard.html), men jeg tør ikke oversætte
beskrivelsen af problemet for at spørge der. Jeg er ikke ret godt inde i
teknikken, så der vil være stor chance for, at jeg ikke får oversat korrekt.

> Så den pågældende webserver gør det slet og ret forkert. Det er dog
> selvfølgelig en ringe trøst, hvis man rent faktisk skal bruge den
> webserver.

Jeg kan muligvis installere Apache. Jeg valgte i sin tid Web/2, fordi
Apache var meget ustabil på OS/2 på det tidspunkt, men det skulle være
blevet bedre.

--
Mvh. Kim Ludvigsen
Gule huskesedler på skærmen - med indbygget alarmfunktion.
http://kimludvigsen.dk

Peter Brodersen (11-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 11-06-07 04:40

On Mon, 11 Jun 2007 01:25:21 +0200, Kim Ludvigsen
<usenet@kimludvigsen.dk> wrote:

>Jeg kan muligvis installere Apache. Jeg valgte i sin tid Web/2, fordi
>Apache var meget ustabil på OS/2 på det tidspunkt, men det skulle være
>blevet bedre.

Det kan selvfølgelig også være at problemet er blevet løst ved en
opgradering til PHP5 (som fx kan hentes fra
http://www.smedley.info/os2ports/index.php?page=php-5 ). Det er dog
aldrig et problem, jeg selv har stødt ind i, så lige præcis hvor
problemet opstår, er svært at sige.

--
- Peter Brodersen
Kendt fra Internet

Stig Johansen (11-06-2007)
Kommentar
Fra : Stig Johansen


Dato : 11-06-07 06:00

Peter Brodersen wrote:

[snip diskussion om newline]

> Så den pågældende webserver gør det slet og ret forkert. Det er dog
> selvfølgelig en ringe trøst, hvis man rent faktisk skal bruge den
> webserver.

Kan det være noget så simpelt, som at der er CRLF i filen i stedet for kun
LF?

--
Med venlig hilsen
Stig Johansen

Peter Brodersen (11-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 11-06-07 06:49

On Mon, 11 Jun 2007 06:59:59 +0200, Stig Johansen
<stig_johansen_it_at_=(@)hotmail.com> wrote:

>Kan det være noget så simpelt, som at der er CRLF i filen i stedet for kun
>LF?

Nej, PHP outputter heller ikke noget ekstra hvis ?> afsluttes med CRLF
(eller for den sags skyld blot med CR)

--
- Peter Brodersen
Kendt fra Internet

Bertel Lund Hansen (12-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-06-07 10:58

Peter Brodersen skrev:

> Nej, PHP outputter heller ikke noget ekstra hvis ?> afsluttes med CRLF
> (eller for den sags skyld blot med CR)

Jeg har lige kørt en test hos fire forskellige udbydere. Ved dem
*alle* var der forskel på om include-filen sluttede med et
linjeskift efter >.

Alle steder virkede det som på lki.dk (som var ét af dem) når man
ser bort fra at der som standard er lukket for fejludskrift på
B-one. Et afsluttende linjeskift i en include-fil uden output i
øvrigt forhindrer en header-kommando i at virke.

Gigahost, Unoeuro, B-one og lki.dk.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Peter Brodersen (12-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 12-06-07 11:18

On Tue, 12 Jun 2007 11:58:22 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Jeg har lige kørt en test hos fire forskellige udbydere. Ved dem
>*alle* var der forskel på om include-filen sluttede med et
>linjeskift efter >.

Gider du prøve at e-maile mig de filer, du bruger eller smide en
zipfil op et sted med filerne? Så kan jeg prøve at kigge på dem,
smide dem op forskellige steder og selv teste lidt.

Som sagt har jeg ikke oplevet, at den del af PHP ikke var i
overensstemmelse med manualen. Det undrer mig netop derfor, at du
oplever problemet konsekvent, når jeg tilsvarende aldrig har oplevet
problemet i en del forskellige setups i tidens løb.

--
- Peter Brodersen
Kendt fra Internet

Peter Brodersen (12-06-2007)
Kommentar
Fra : Peter Brodersen


Dato : 12-06-07 11:24

On Tue, 12 Jun 2007 12:17:38 +0200, Peter Brodersen
<usenet2007@ter.dk> wrote:

>Gider du prøve at e-maile mig de filer, du bruger eller smide en
>zipfil op et sted med filerne? Så kan jeg prøve at kigge på dem,
>smide dem op forskellige steder og selv teste lidt.

En anden hurtig test, i øvrigt:
http://stock.ter.dk/headertest/file1.php
Bemærk, at:

<?php
....
?>
<?php
....
?>

heller ikke medfører noget linjeskift i outputtet.

headers_sent() er stadigvæk false, og jeg kan sætte cookies og øvrige
headers.

Jeg bruger ikke output buffering.

--
- Peter Brodersen
Kendt fra Internet

Bertel Lund Hansen (12-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-06-07 12:39

Peter Brodersen skrev:

> Gider du prøve at e-maile mig de filer, du bruger eller smide en
> zipfil op et sted med filerne?

Jeg sendte filerne til Peter og fik en overraskende melding
tilbage fra ham: Der er *to* linjeskift i den fil der giver
problemer, ét i den der ikke gør.

Konklusion: Problemet udløses af min editor der vedhæfter et
usynligt linjeskift. Det er lidt ef en bét.

Men de testede systemer er altså alle i orden (på det punkt i
hvert fald).

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177485
Tips : 31964
Nyheder : 719565
Indlæg : 6408407
Brugere : 218885

Månedens bedste
Årets bedste
Sidste års bedste