Avatar billede engaai Nybegynder
09. marts 2004 - 15:31 Der er 12 kommentarer

Strukturering af kode

Hej

Jeg kunne godt tænke mig at høre, hvordan i strukturerer jeres kode.
En måde er jo at lave følg kode:

<html>
<head>
<title>test></title>
</head>
<body>

<a href="index.php?side=forside">Forsiden</a>
<a href="index.php?side=side2">Side 2</a>
<a href="index.php?side=side3">Side 3</a>

<?php

if(isset($_GET['side'])) {
    $side = $_GET['side'];
} else {
  $side = "forside";
}

if($side == "forside") {
    include("forside.php");
} elseif($side == "side2") {
    include("side2.php");
} elseif($side == "side3") {
    include("side3.php");
} else {
    echo "Der blev angivet et sidenummer der ikke eksisterer";
}

?>

Men så opstår der et problem når man vil bruge headers i den inkluderede fil. Så kort og godt, hvordan kan jeg smartest strukturere min kode, eller bruge ovenstående metode, og undgå header() problemet?
Avatar billede bearhugx Nybegynder
09. marts 2004 - 15:43 #1
da alt så noget som session-styrring osv, bør foregå, lige meget, hvilken siden man er på, så burde man inkludere en fil som sørger for session_start osv. øverst i filen - og så lade vær med at bruge/inkludere det nede i de forskellige inkluderede filer ...

Men "skabelon" varierer alt efter, hvad jeg skal lave . men overordnet ser den således ud

<?php
  include("/inc/inc.session.php");
  include("/inc/inc.database.php");
?>
<html>
  <head>
    ...
  </head>
  <body>
    <?php
      include("/inc/inc.header.php");
      include("/inc/inc.menu.php");
    ?>
    <!-- content starrter her -->
    <?php
      include("/inc/inc.footer.php");
    ?>
  </body>
</html>
Avatar billede jakoba Nybegynder
09. marts 2004 - 16:08 #2
HTML:
  2 blanktegn pr indrykning og indrykning for hvert nestet niveau.
  Såvidt mulige een html-kommando på hver linie. Dog gerne med flere indlejrede indeni hvis det kan gøres overskueligt.
      <td><img src='bilde.gif'></td>
  På steder hvor der ikke må være blanktegn imellem (fx 3 billeder efter hinanden der skal 'løbe sammen' flyttes den afsluttende '>' eller '/>' ned foran næste kommando
      <td><img src='bilde.gif'
        /><img src='bilde2.gif'
        /><img src='bilde3.gif'
      /></td>
  Inline formattering skriver jeg blot <b>inline</b>

PHP:
  formatteres som helt separat script uafhængigt ag HTML indlejringen der hvor koden står. igen 2 blanktegn pr niveau. Jeg prøver at følge den foreslåede formattering for java, dvs '{' bagerst i startlinien, '}' på yderniveau og alt indhold indrykket indimellem. Som hovedregel skriver jeg altid { og } også npr niveauet kun indeholder een php sætning:
    if ( betingelse ) {
        goer_dit();
    } else {
        goer_dat();
    }

mvh JakobA
Avatar billede engaai Nybegynder
09. marts 2004 - 17:04 #3
Hvad gør du så med headers i de inkluderede filer bearhugx?
Avatar billede bearhugx Nybegynder
09. marts 2004 - 17:28 #4
de filer, som du inkludere skal du ikke tænke på som fulde HTML filer - derimod skal du tænke på dem som brudstykker, som hver har deres "emne"...

dvs. at du ikke skal bekymre dig om headers (hverken PHP-specifikke header-kommandoer, eller for den sags skyld <head>...</head>-indhold) i disse filer - de skal bare outputte en specifik sektion af dit website...
Avatar billede engaai Nybegynder
09. marts 2004 - 17:35 #5
ja, men hvis jeg f.eks har en side som denne, som sakl inkluderes:

<?

$id = $_GET['id'];

if(!isset($_SESSION['user'])) {
    include("include/needlogin.php");
    exit();

if(!isset($id)) {
    echo "du skal vælge et indlæg på <a href='index2.php?side=forside>forsiden</a>";
} else {
    mysql_query("delete from nyheder where id='$id'") or die(mysql_error());
    header("location:index2.php");
}

?> 

Skal jeg jo netop bruge headers i det inkluderede script. Eller er det noget andet du mener?
Avatar billede engaai Nybegynder
09. marts 2004 - 18:36 #6
?
Avatar billede sukos Juniormester
09. marts 2004 - 18:58 #7
Hvis du VIL bruge en header midt i din HTML, så brug Javascript til at sende en bruger videre, eller evt. noget med ob_start() i starten af det script som includer andre filer.

<script>
window.location.href('http://www.eksperten.dk');
</script>
(tror jeg nok! :O] )

http://dk.php.net/manual/en/function.ob-start.php
Avatar billede bearhugx Nybegynder
09. marts 2004 - 19:42 #8
engaai >> undskyld jeg ikke lige svarede tilbage -- men har haft travlt med ikke-computer ting...

som sukos forslår, så kan du bruge ob_start , dvs. at bruge output buffering...

du kunne også overveje, om din arkitektur skulle ændres - jeg foretager f.eks. alt database-aktivitet i dedikerede php-filer, som ikke har noget output...

jeg kan lige give et eksempel senere... har først tid omkring kl. 22 til at skrue et eksempel sammen...
Avatar billede engaai Nybegynder
09. marts 2004 - 21:29 #9
sukos >> Jeg skal da ikke starte ob_flush, hvis jeg vil bruge det javascript du skrev? Jeg vil meget gerne undgå at bruge ob_flush, eftersom det laver såkaldt overkill ( spørg mig ikke om hvad det er men det lyder dårligt :-)  )
Er der nogen 'bivirkninger' ved det javascript du skrev?

berhugx >> Det er selvfølgelig i orden. Blev bare lidt naiv, eftersom jeg sad fuldstændig fast i mit script :-)
Avatar billede engaai Nybegynder
10. marts 2004 - 13:19 #10
bearhugx ville du ikke lave et eksempel?
Avatar billede bearhugx Nybegynder
10. marts 2004 - 13:38 #11
et simpelt opret telefonnr. script

(forudsætter, at der forefindes en tabel [TelefonOversigt] med felterne ID, Navn og TelefonNr )


[[opretTelefonNr.php]]
<html>
  <body>
    <form action="do.opretTelefonNr.php" method="post">
      navn <input type="text" name="navn"/><br/>
      telefon <input type="text" name="telefon"/><br/>
      <input type="submit" value="gem"/>
    </form>
  </body>
</html>

[[do.opretTelefonNr.php]]
<?php
  $navn = $_REQUEST['navn'];
  $telefon = $_REQUEST['telefon'];
  if($navn=="" || $telefon="") {
    header("location:fejlIOpret.php");
    exit();
  }
  include("inc/inc.database.php);
  $sql = "INSERT INTO TelefonOversigt(ID, Navn, TelefonNr) VALUES ('', '$navn', '$telefon');"
  mysql_query($sql];
  header("location:opretGennemfoert.php");
?>



Hvad der er værd at bemærke i filen do.opetTelefonNr.php er- at jeg ikke på noget tidspunkt outputter noget.... Når du laver modifikationer til databasen (dvs. al anden database-aktivitet, end læsning/opslag), så behøver du i princippet ikke at outputte noget som helst.

Først når jeg har brug for at "melde tilbage til brugeren", forwarder jeg til de passende sider (i dette tilfælde enten en side, som forklarer at det ikke kunne oprettes, eller at oprettelsen var gennemført...)
Avatar billede engaai Nybegynder
10. marts 2004 - 14:19 #12
okay, men i mit script, inkluderer jeg alle sider, på en side som ser således ud:

<?
session_start();
?>

<html>
<head>
  <title>Slumkum version 1.02</title>
  <link rel="stylesheet" type="text/css" href="stylesheet2.css">
</head>

<body>

<!-- Linkmenu -->

<div class="linkmenu">

<ol>
<li><a href="index2.php?side=forside">Forside</a></li>
<li><a href="index2.php?side=forum">Forum<a></li>
<li><a href="index2.php?side=hvemerdu">Hvem er du?</a></li>
<li><a href="index2.php?side=talgaetteren">Talgætteren</a></li>
<li><a href="index2.php?side=nyhedsbrev">Nyhedsbrev</a><</li>
</ol>
<br />
- Admin sider
<ol>
<li><a href="index2.php?side=opret">Opret bruger</a></li>
<li><a href="index2.php?side=skrivnyhed">Skriv nyhed</a></li>

<!-- Er brugeren logget ind? -->

<?
if(isset($_SESSION['user']) {
    echo "<li><a href='index2.php?side=logout'>Logout</a></li>";
} else {
    echo "<li><a href='index2.php=side=login'>Login</a></li>";
}
?>

</div>

<!-- Indhold -->

<div class="indhold">

<?

if(isset($_GET['side'])) {
    $side = $_GET['side'];
} else {
    $side = "forside";
}
if($side == "forside") {
    include("include/forside.php"); // forside
} elseif($side == "forum") {
    include("include/forum.php"); // forum
} elseif ($side == "hvemerdu") {
    include("include/hvemerdu.php"); // hvem er du?
} elseif($side == "talgaetteren") {
    include("include/talgaetteren.php"); // tal gætteren
} elseif($side == "nyhedsbrev") {
    include("include/nyhedsbrev.php"); // nyhedsbrev
} elseif($side == "opret") {
    include(include/opret.php); // opret bruger
} elseif($side == "skrivnyhed") {
    include("skrivnyhed.php"); // Skriv nyhed
} elseif($side == "logout") {
    include("include/logout.php"); // logout
} elseif($side == "login") {
    include("include/login.php"); // login
} elseif($side == index_rediger) {
    include("include/index_rediger.php"); 
} elseif($side == "index_rediger") { // rediger
    include("include/index_rediger.php");
} else
    echo "Du har angivet et sidenummer der ikke findes!<p /><a href="forside.php?side=forside">Til forsiden</a>";
}

?>

</div>



<!-- rightmenu -->

<div id="rightmenu">


</div>


<!-- Banner -->

<div class="overskrift">

<h1>Slumkum</h1>

<div id="version">
  version 1.02
</div>

</div>


</body>
</html>


Så i dit tilfælde, skulle jeg lave to sider af ovenstående kode; En hvor formularen var på, og en til den side, som skal bearbejde formlen ( i tilfælde af at der skulle outputtes noget, så skulle det jo gerne have samme opbygning som resten af scriptet, altså med en linkmenu til venstre osv. ) Og i længden bliver det utroligt mange af ovenstående kode jeg skal lave, eftersom jeg skal bruge en for hvert php script jeg har, altså det dobbelte antal sider. Derfor er den metode, jeg skrev i indlæg #1 meget smart for mig.
Er der ingen ulemper ved at bruge ob_flush?
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