Avatar billede haolan Nybegynder
31. juli 2007 - 21:00 Der er 11 kommentarer og
1 løsning

Hjælp til PHP kodestil

Min måde at programmere på er som oftest at dele en del ting op i mapper.

Fx har jeg et bibliotek til functions, hvor jeg gemmer alle functions i hver sin fil med funktionens navn.
Jeg har også en mappe til forms, hvor jeg ligger alle mine formularer ind.

Øverst i min kode har jeg altid et tjek på om en bruger er logget ind, hvis ikke, så er der exit og header location;

Længere nede på samme side fremkommer opbygningen af mit site i divs og i den div hvor indholdet skal være tjekker jeg på om den side den forsøger at åbne er en ren tekst fil den kan hente direkte fra databasen eller om det er en .php fil den skal finde et andet sted.

Hvis det er en fil bliver den includet og på den måde får jeg sat alle sitets funktioner ind på siden alt efter hvad man nu har trykket sig frem til i menuen.

Mange af de funktioner har MySQL oprettelser, og lign.. Derfor bliver selve oprettelserne også includet midt på den side der vises.

Efter kommentarerne på denne har jeg pillet mit MySQL insert kald ud i en fil for sig selv, som herefter sender brugeren videre til en anden side med header location. Og denne fil indeholder ren php, kode og derved ingen udskrifter.. MEN opstår der fejl i databasen vil den jo meget gerne have lov at udskrive en fejlmeddelse på den side den opstår på, og når den gør det bryder den min header og sitet sendes ikke videre, hvordan jeg undgår dette og får givet brugeren en pæn fejlmeddelse på den næstkommende side har jeg ingen idé om..

Men kom endelig med kommentarer til min måde at kode på, udfra det jeg har skrevet om det, det er jo den eneste måde man lærer af sine fejl :)

Spørg endelig hvis i vil vide mere om min kodestil.

Points deles ud til dem med den bedste konstruktive kritik
Avatar billede wanze Nybegynder
31. juli 2007 - 23:05 #1
Synes det er en fjollet idé at du sender brugeren videre til en side uden indhold overhovedet - også selvom brugeren bliver sendt videre igen med det samme. Men hvis du vil gøre det sådan, så kan du jo bare sende fejlbeskeden med i headeren, fx:
header(Location: "/side.php?fejl=2");

Dog skal du huske på at brugeren kan manipulere med det, så du skal ikke stole på at brugerens input er korrekt. Men som sagt så synes jeg du skal undgå alle de header-forwards.
Avatar billede olebole Juniormester
01. august 2007 - 13:59 #2
<ole>

wanze >> Måske, det virker fjollet på dig, men det er måden, man laver SQL-indsættelser på professionelt - og også måden, det gøres på her på Eksperten. Man skulle ellers tro, du havde lært noget af den tråd, vi lige har været igennem (http://www.eksperten.dk/spm/789386)  =)

haolan >> Den bedste måde at organisere sin kode på, er at lade PHP-koden stå helt foroven, efterfulgt af HTML-koden. I HTML'en kalder du så PHP-funktioner, der returnerer HTML-strenge - og indskriver disse strenge i HTML-dokumentet. F.eks:

<?
function foo() {
    $res = [MYSQL_QUERY]; // Pseudokode
    $a = array();
    while ($row=mysql_fetch_object($res)) {
        $a[] = "Navn: ".$row->navn.", Brugernavn: ".$row->user;
    }
    return implode("<br>\r\n", $a);
}
?>
<html>
<head>
.... udeladt ....
</head>
<body>

<div>Oversigt over brugere</div>
<div><?=foo()?></div>

</body>
</html>

Samtidig kan du selv kontollere dine felmeddelelser. Et '@' undertrykker fejl-udskrivning:

<?
$sql = "INSERT INTO `tabelnavn` SET `feltnavn`='værdi'";
@mysql_query($sql);
$error = mysql_errno()<>0 ? mysql_error() : "success";

Header("Location: enside.php?error=".$error);
?>

På denne måde får du ikke header-fejl, fordi der på forhånd er udskrevet til dokumentet  ;o)

/mvh
</bole>
Avatar billede wanze Nybegynder
01. august 2007 - 14:21 #3
Olebole: Jeg lærer ikke noget af dig - jeg er uenig i meget af det du gør. Og nej, det er ikke en professionel løsning - og jeg tror heller ikke de gør det her på Eksperten. En professionel løsning er at lave det hele objekt-orienteret, med klasser i forskellige filer, så man slet ikke har behov for at lave headers. Og lad så venligst være med at lege bedrevidende uden belæg for det.
Avatar billede wanze Nybegynder
01. august 2007 - 14:22 #4
Jeg vil dog give dig ret i at OB er en panikløsning, men nu forsøger jeg at finde den nemmeste løsning til situationen, og ikke forklare ham, hvordan han skal omskrive hele sin side. Det er vist i vores alles bedste interesse.
Avatar billede haolan Nybegynder
01. august 2007 - 16:52 #5
Wanze, ikke for at blande mig i jeres mellemværende, men jeg foretrækker at lære tingene på den mest professionelle måde som muligt, da jeg har rimelig stor sandsynlighed for at skulle arbejde med det fast i fremtiden..

OB var jeg med det samme klar over var en panikløsning, så den undgik jeg overhovedet at kikke på.

Jeg tror det er smag og behag om man laver videresendelse eller ej.

Jeg koder professionelt c# til daglig, også objektorienteret..
Men har ingen idé om hvordan man bedst muligt sætter det op i PHP, jeg har endnu ikke set en hjemmeside i PHP være bygget op på klasser, på trods af at jeg har arbejdet med forskellige hjemmesider i PHP de seneste 3-4 år.. Desværre er alt min PHP selvlært, derfor har jeg ikke den fornødne viden, som jeg nu har brug for.

Jeg er enig i at klasser nok er den bedste løsning.. Men hvordan får man dem til at snakke sammen i PHP og bruge dem rigtigt? I c# laver man aggregering og associering og så er den skid slået..
Avatar billede olebole Juniormester
01. august 2007 - 17:57 #6
wanze >> Så har du komplet misforstået, hvad det er, jeg har forsøgt at illustrere. Om du anvender OO eller procedural programmering er ikke relevant i denne sammenhæng ... og jeg ved iøvrigt objektivt, det er metoden, Eksperten bruger  =)

Det fikse ved metoden her er, at du kan reloade dokumentet, uden at en evt. form re-submittes. Når formen i bunden af siden her submittes, sker det mod filen response.php. Her indsættes i DB og derefter returneres til denne side.

Hvis blot formen havde submittet mod dokumentet selv - og PHP foroven i dette dokument eller blandet ind mellem markupkoden havde indsat i DB - og siden atter var blevet udskrevet i browseren ... så ville formen re-submitte, hvis man tastede F5.
Det sker ganske uagtet, om der er blevet brugt OO eller procedural programmering - men det sker ikke, hvis der redirectes.

Man behøver ikke submitte formen mod et andet dokument. Man kan godt submitte mod det dokument, formen ligger i og foretage DB-indsættelse m.m. dér ... så skal man bare efterfølgende redirecte til dokumentet selv.

At der ikke er tvivl om, det er bedst at opbygge applikationer i OOP er en helt anden ting - men i på baggrund af den tråd, der affødte denne, var det ikke mit indtryk, at det var dét spørgsmålet primært gik på.

- og lad mig iøvrigt lige anføre, at der er forskel på at vide bedre og at være bedrevidende  ;o)
Avatar billede olebole Juniormester
01. august 2007 - 18:00 #7
PS: du undgår også at komme tilbage til en udfyldt form ved tryk på Back, hvis du redircter - og dermed undgås endnu en kilde til duplikerede indsættelser
Avatar billede haolan Nybegynder
02. august 2007 - 19:32 #8
Kan i evt. komme med et eksempel på hvordan man bygger en OOP op..
måske lige viser et par klasse filer og brugen af dem i en helt tredje php fil?
Avatar billede olebole Juniormester
09. august 2007 - 12:35 #9
Jeg tror lige, vi skal have styr på begreberne. Objekt Orienteret Programmering får dig ikke ud over det problem, der affødte denne tråd: At brugeren bliver spurgt, om vekommende vil køre formen igen. Hvis du vil slippe for dét, skal du lave en redirect.

Hvis du af andre årsager ønsker at lære lidt om OOP, så prøv at kikke på php.net. Det er dog vigtigt, du kikker under den rigtige version, da OOP har ændret sig meget i PHP5  ;o)

PHP4: http://dk2.php.net/manual/en/language.oop.php

PHP5: http://dk2.php.net/manual/en/language.oop5.php
Avatar billede haolan Nybegynder
11. november 2007 - 20:36 #10
Jeg har gennemført PHP5 OOP guiden på php.net og efterhånden fundet ud af at gøre tingene lidt mere proffesionelt :)

Takker for hjælpen olebole.. smid svar for points..
Avatar billede haolan Nybegynder
02. december 2007 - 23:25 #11
Kommer der svar?
Avatar billede haolan Nybegynder
16. marts 2008 - 18:47 #12
jeg lukker af her så... takker for hjælpen
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