Avatar billede trajkovski Nybegynder
08. januar 2005 - 23:10 Der er 18 kommentarer og
1 løsning

Inkludering af 404 fejlside

Hej

Jeg har benyttet nedenstående kode til at få serveren til at vise den rigtige side:
"
if(isset($vis)){
include $vis.".php" or die(header("Location: index.php?vis=404"));
} else {
include "forside.php";
}
"

Men det virker ikke efter hensigten. Hvis en person beder om en side, der ikke eksiterer, som f.eks. index.php?vis=jegvilhavedenne, så skulle scriptet sende personen til siden 404.php, men det gør det ikke... Det giver følgende fejl:
"
Warning: main(1): failed to open stream: No such file or directory in /hsphere/local/home/sagshow/sagshow.dk/design/index.php on line 163

Warning: main(): Failed opening '1' for inclusion (include_path='.:/usr/local/lib/php') in /hsphere/local/home/sagshow/sagshow.dk/design/index.php on line 163
"

Nogen der ved hvordan det kan fikses, sådan at personen bliver sendt til 404.php, hvis siden der skal inkluderes ikke findes?

På forhånd tak

Nicolai
Avatar billede erikjacobsen Ekspert
08. januar 2005 - 23:20 #1
Du kan sikkert:

if(isset($vis)){
  if (file_exists("$vis.php")) {
    include "$vis.php";
  } else {
    header("Location: index.php?vis=404");
    exit();
  }
} else {
  include "forside.php";
}
Avatar billede trajkovski Nybegynder
08. januar 2005 - 23:35 #2
Yes det virker. Anede ikke der fandtes en sådan funktion som file_exists.

Men... Nu kommer den bare med samme fejl som sidst, med at der allerede er sendt en header på linie 12 i index.php:
"
Warning: Cannot modify header information - headers already sent by (output started at /hsphere/local/home/sagshow/sagshow.dk/design/index.php:12) in /hsphere/local/home/sagshow/sagshow.dk/design/index.php on line 173
"
Avatar billede erikjacobsen Ekspert
08. januar 2005 - 23:38 #3
Så er det fordi du allerede har skrevet noget. Put det øverst, fx. som dette:

<?
if(isset($vis)){
  if (file_exists("$vis.php")) {
    $fil="$vis.php";
  } else {
    header("Location: index.php?vis=404");
    exit();
  }
} else {
  $fil="forside.php";
}
?>
<html>
blablabla
<? include $fil; ?>
blablabla
</html>
Avatar billede trajkovski Nybegynder
08. januar 2005 - 23:42 #4
Hmmm... Ja sådan kunne man gøre, men den mulighed har jeg jo ikke, når jeg har en header("Location: ...") i det dokument jeg inkluderer, og der kommer den ofte med samme fejl.

Hvad kan jeg gøre for at undgå det?
Avatar billede neocron Nybegynder
08. januar 2005 - 23:46 #5
Du kan evt. bruge et javascript til at redirecte istedet for header. Det kan f.eks. se sådan ud:

<?
if(isset($vis)){
  if (file_exists("$vis.php")) {
    $fil="$vis.php";
  } else {
?>
<script type="text/javascript">
    location.href = "index.php?vis=404";
</script>
<?
    exit();
  }
} else {
  $fil="forside.php";
}
?>
<html>
blablabla
<? include $fil; ?>
blablabla
</html>
Avatar billede erikjacobsen Ekspert
08. januar 2005 - 23:53 #6
Jeg forstår ikke problemet med header("Location: ") og noget der er skrevet ud
før. Du kan altid starte med at teste om alt er i orden - hvis ikke, så redirecter
du, men hvis det er viser du noget på siden. Der er aldrig nogen grund til at
begynde at lave noget HTML før du ved at det faktisk skal vises til brugeren.
Avatar billede trajkovski Nybegynder
08. januar 2005 - 23:58 #7
Ja men jeg vil helst undgå at bruge andet end php og html. Jeg kunne selvfølgelig tjekke med headers_sent og så lave en meta refresh, hvis de var sendt, men det ville jeg også helst undgå.

Der må kunne gøres noget i php?
Avatar billede morteeart Nybegynder
09. januar 2005 - 00:03 #8
jo da, et *hack* kan gøre det.
sæt ob_start(); i toppen af din side :)

www.php.net/ob_start
Avatar billede trajkovski Nybegynder
09. januar 2005 - 00:14 #9
Erik

Et eksempel:
index.php inkluderer siden logind.php. logind.php finder ud af at brugeren ikke har indtastet et password og eksekverer derfor en header("Location: index.php?side=fejl&fejl=password"), men dette kan index.php ikke lide, da denne side allerede har sendt headerinformation med <head>.

Hvordan kan jeg undgå at sådanne situationer opstår?
Avatar billede erikjacobsen Ekspert
09. januar 2005 - 00:18 #10
Det er fordi du blander logik og præsentation. Du skal måske dele op i flere
include filer, eller på anden måde lave strukturen om, men det kan (selvfølgelig)
altid lade sig gøre. Det grundlæggende problem med bl.a. PHP, er at man tænker i
de filer man laver, og ikke i en arkitektur. Og til småting kan det selvfølgelig
være ligemeget ;)
Avatar billede trajkovski Nybegynder
09. januar 2005 - 00:18 #11
Morteeart

Efter at have læst lidt på funktionen er jeg kommet frem til den konklusion, at det ikke ville være videre klogt at benytte den. Men tak for forsøget :)
Avatar billede trajkovski Nybegynder
09. januar 2005 - 00:21 #12
Hmm... Ja du har nok ret - havde dog lidt håbet på en mirakelløsning i stedet for så meget arbejde ;)
Avatar billede erikjacobsen Ekspert
09. januar 2005 - 00:24 #13
ob_start er dit mirakel, det er fuldt legalt at bruge ;)
At man har brug for det er blot et tegn på at man måske hellere skulle lavet sin struktur om - hvis man har tiden til det.
Avatar billede trajkovski Nybegynder
09. januar 2005 - 00:40 #14
Ja... ok... Tid er ikke noget, jeg har meget af for tiden :)

Morteeart, jeg tror, jeg vil gøre brug af dit forslag alligevel :)

Smid et svar og pointene er dine...
Avatar billede moocher Nybegynder
09. januar 2005 - 02:40 #15
Hvis du har en apache server så kig her http://www.webcafe.dk/artikler/apache/htaccessfejlbeskeder/
Avatar billede morteeart Nybegynder
09. januar 2005 - 16:39 #16
nej tak, samler ikke på point.

Men erik har ret , det er den dovnes løsning :D (Ja, jeg er doven)
Avatar billede trajkovski Nybegynder
10. januar 2005 - 10:17 #17
Ej mand, kan du ikke give mig den glæde at komme med et svar alligevel?

Det er det samme som hvis du har købt en gave til en, og personen så ikke vil tage imod den - så bli'r du da også ked ;)

Og Erik jeg har brugt dit første forslag, så vil meget gerne dele pointene imellem jer...
Avatar billede erikjacobsen Ekspert
10. januar 2005 - 11:30 #18
Nej tak, jeg samler slet ikke på point.
Ser ud til du skal svare selv, og acceptere eget svar.
Men du kan komme og slå min græsplæne til sommer ;)
Avatar billede trajkovski Nybegynder
10. januar 2005 - 21:19 #19
Ok det er så en aftale ;) Hvis det ikke er for langt væk....
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