Gå til innhold

Anbefalte innlegg

Velkommen til brukernes egen FAQ her på sourcecode.no. Denne tråden er så dere, brukerne, kan lage spørsmål og svar på ting dere ofte blir spurt om, eller som dere vet er ting folk lurer på. Hvis dere ønsker å diskutere ting i FAQ'en anbefaler jeg å gå hit for å unngå rot. Useriøse innlegg vil bli slettet på stedet.

 

Jeg vil også minne om at kopiering av FAQ'ens innhold uten brukernes tillatelse ikke bør forekomme.

Lenke til kommentar
Videoannonse
Annonse

starter med legge posten til chiclins hit da for den var jo faktisk Veldig bra:

 

Innledning

 

Hva er PHP?

PHP er en Hypertext Preprocessor, et program som som preprosseserer hyperteksten. Hypertekst vet du hva er. Det er jo HTML. (HyperText Markup Language). Når vi sier preprossesere mener vi å lage noe på forhånd. PHP lager HTML sidene før de vises i nettleseren. Dette gir oss muligheten til å lage sider med dynamsik innhold.

 

Hva kan du gjøre med PHP?

PHP er et kraftig verktøy, du kan bruke det til veldig mye. Siden PHP har støtte for et utall antall databaser (mySQL, pgSQL, oracle, msSQL ++) er PHP er meget godt verktøy til utvikkling av internett basserte aplikasjoner. Med PHP kan du f.eks lage: gjestbok, dagbok, treffteller, forum, webshop og webmailsystmer som hotmail. Men mye av dette er ganske innviklet. Vi vil gjerne holde det enkelt i starten.

 

Hva kan du ikke gjøre med PHP?

Selv PHP har sine begrensninger. PHP er megt bra til noen ting, men til andre ting er det ubrukelig. Det er en ting man må vite, det er at PHP aldri kan "ta over for" HTML, fordi PHP fakstisk lager HTML så slutter man ikke å skrive HTML når man "går over til" PHP. Dette kan ikke PHP gjøre:

 

- Lage animasjons effekter

- Kjøre ting i realtime, fordi PHP bare kjøres en gang på hver side (når den blir lastet)

- Lage spill som CS og Starcraft

 

Denne listen er kanskje ikke fullstendig, men jeg kommer ikke på noe mer i farten. Men hvis du vil lage noe med animasjon, eller realtime er Flash en fin ting.

 

Språket

 

Strukturen i PHP ligner veldig på mange andre programeringsspråk. De fleste funksjonene vil man forstå hvis en har grunnleggende engelsk kunnskaper, men ikke alle. Det sies at PHP er et lett språk å lære, dette er fordi det har en struktur som en vil forstå ganske lett. Men det er en stor forskjell på å forstå PHP og å være i stand til å skrive det.

 

basic regler

- PHP skrives mellom <?php og ?> i et dokument med .php fil endelse

(.phtml, .php4, .php3 fleier også å virke, men .php er vanligst)

- Nesten alle program linjer i PHP avsluttes med et ; (semicolon)

- PHP script kjøres kun på servere med innstallert PHP

 

Funksjoner

PHP er bygget opp av "funksjoner", noen funksjoner tar "paramatere". Ved å kjøre funksjoner gir du PHP en oppgave den skal gjøre. Du kjører funksjoner slik:

 


funksjon(parameter)

 

Noen funksjoner tar flere paramatere, akkurat som i HTML der f.eks. bildet taggen <img> tar kilde, høyde, bredde, alternativ tekst +++. slike funksjoner kjøres slik.

 


funksjon(parameter1, parameter2)

 

Variabler

PHP lagrer data i variabler, disse variablene kan du hente ut på ulike måter. PHP han få variabler fra skjemaer (forms) som du poster til php-script, fra databaser, fra tekstfiler som du leser inn eller variabler som du har skrevet verdien inn i i scriptet ditt. Variabler har verdier, for å gi en variabel verdi bruker du = (likhetstegn), altså:

 


variabel = verdi

 

De vanligste variablene er tekststrenger (string) og tall (int). Alle variabler i PHP har et dollar tegn forran seg dette dollar tegnet er etterfulgt av navnet på variablen.

 

Hva er det som avgjør om en variabel blir tekst streng eller tall? Jo det er hvordan du bestemmer variablen.

 


$variabel = 1;

 

dette vil gi variabelen $variabel en verdi av 1 og variabel typen vil være tall. Hadde vi skrevet:

 


$variabel = "1";

 

ville variabel typen vært tekststreng

 

Altså forskjellen mellom tall og tekststreng definisjonen er at tekst strenger har "" (hermetegn) rund seg.

 

Kontrollstruktur

PHPs kontrollstruktur består av funskjonene: if, else, elseif, while, do..while, for, foreach, break, continue, switch, declare, return, require(),

include(), require_once() og include_once()

 

Jeg skal forklare noen va disse senere i dette "kapittelet"

 

Logiske operatører

 

PHP bruker mange logiske opperatører, du trenger ikke kunne alle, men noen trenger du. Disse brukes til å utføre tester o.l. Vi skal se nermere på hvordan de brukes senere. Her en en liste over noen av opperatørene:

 

a == b -- a er lik b

a != b -- a er ikke lik b

a < b -- a er mindre enn b

a > b -- a er større enn b

a <= b -- a er større eller lik b

a >= b -- a er mindre eller lik b

 

vi kan skrive slik


$variabel = ("a" == "b");

 

Vi vet at bokstaven a ikke er lik bokstaven b, når dette utsagnet er feil vil php sette verdien av $variabel til false (usann). Hadde vi skrevet


$variabel = ("a" != "b");

 

Ville $variabel fått verdien true (sann)

 

Logisk test

PHP kan utføre tester på diverse utsagn. Til dette bruker vi funskjonen funksjonen if (hvis) if tar et parameter og det er et logisk utsagn. men etter if(parameter) skal det være en krøll parantes, denne symboliserer starten av den koden som skal utføres om utsagnet er sannt (true).

etter den koden som skal kjøres finner vi en lukke-krøllparantes, strukturen for if er slik:

 


if(utsagn) {

kode som utføres når utsagnet er sannt (true)

}

 

legg merke til at det ikke er noe semicolon etter krøllparantesene.

 

PHP har også funksjonene elseif og else. De kan forklares slik:


if(ting er sånn) {

kode som utføres hvis ting er sånn

}

elseif(nei de er slik) {

kode som utføres hvis ting ikke er sånn men slik 

}

else {

hvis ting ikke er sånn eller slik i det heletatt

}

 

Looper

PHP kan loope kode dette betyr arbeidsbesparelse, tenk deg at du skal skrive alle tallene fra 0 til 99 da gidder du selvfølgelig ikke å skrive de ned. istede skriver du et lite PHP script som gjør det:

 


$i = 0;

while($i < 100) {



skriv ut $i

la $i vokse med 1

}

 

while vil tar et parameter, og den looper koden som står inne i seg så lenge parameteret er sannt (true) dette er en av loopene til PHP. En andnen loop er for-loopen, den ser kanskje litt verre ut, men jeg skal forsøke å forklare

 


for(kode som kjøres en gang ved starten av loopen [b];[/b] utsagn som skal stemme for at det skal loopes[b];[/b] kode som 

utføres etter hver loop) {

kode som utføres i hver loop

}

 

hvis vi skulle skrive koden til det forige eksemplet med for loop ville det bli slik

 


for($i = 0; $i < 100; $i++) {

skriv ut $i

}

 

$i++ vil øke verdien av $i med en

 

Vanlige funksjoner

 

Man trenger ikke lære seg alle funksjonene i PHP, langt ifra. En kan greie seg men et ganske lite knippe funksjoner. Det viktigste er at en kan gjøre nytte av de funksjonene en kan.

 

echo

Skriver tekst ut på siden, denne teksten settes inn i HTMLn der echo står f.eks.

 


<table>

  <tr>

     <td><h1>hei</h1></td>

  </tr>

  <tr>

     <td><?php echo($name); ?></td>

  </tr>

</table>

 

Hvis vi hadde satt variablen $name til tekststrengen "Per" ville HTMLn vise dette:

 


<table>

  <tr>

     <td><h1>hei</h1></td>

  </tr>

  <tr>

     <td>Per</td>

  </tr>

</table>

 

echo tar bare et parameter og det er det som skal skrives ut. echo kan skrive ut både tekst og tall, men husk å ikke skriv echo("$lala"); hvis $lala er en variabel med formatet tall, er det tekst går det greit, men det er ikke nødvendig med hermetegn rundt variabler inne i echo sine parametere, hvis du skriver teksten inn i echo slik echo("lalalalalala"); må du ha hermetegn hvis det er tekst streng du vil skrive ut. Hvis du skal skrive ut en tekststreng som innholder hermetegn må du lage en (skråstrek

fra venstre top høyre bunn) forran hermetegnet (slik "). Du vil får parse error hvis du ikke gjør det.

 

funksjonen print ligner veldig på echo bare at den returnerer en verdi til scriptet den står i, den returnerer true/false ettersom den får gjennomført jobben sin eller ikke

 

empty

Kontrolerer om en variabel er tom. Dette er fint hvis du har et skjema som poster til et php script, da kan su skrive slik:

 


<?php

if(empty($paakrevdFelt)) {

echo("fyll alle feltene");

}

else {

echo("du fyllte ut det påkrevde feltet");

}

?>

 

empty tar et parameter dette parameteret er et variabelnavn, hvis denen variablen er tom vil empty returnere true, hvis du vil ha true når variablen ikke er tom skriver du !empty() ! betyr ikke.

 

arrays

Arrays er vel strengt tatt ikke en funksjon men heller en variabeltype. Men det er mange funksjoner som tillhører arrays. Arrays er et veldig kraftig redskap om du en bruker de riktig.

 

Er en linje av variabler, som er lagret inne i en annen variabel. Når du lager et array går du fram slik:

 


<?php

$array = array(1,2,3,4);

?>

 

eller slik:

 


<?php

$array = array();

$array[] = 1;

$array[] = 2;

$array[] = 3;

$array[] = 4;

?>

 

eller slik:

 


<?php

$array = array();

$array[0] = 1;

$array[1] = 2;

$array[2] = 3;

$array[3] = 4;

?>

 

alle disse metodene gir samme resultat, når du setter en tom hakeparantes bak en array-variabel betyr det at du setter inn et nytt element i arrayet. Setter du et tall inn i arrayet blir det tallet nøkkelen du må bruke for å få tak i verdien.

 

Når vi henter ut verdier fra arrayet kan vi gjøre slik:

 


<?php

$array[0] // er her 1

$array[1] // er her 2

$array[2] // er her 3

$array[3] // er her 4

?>

 

koden til elementene i arrayet starter fra 0.

 

av funksjoner som er tilkynttet arrays er sizeof(array), sizeof returnerer hvor mange elemeter det er i arrayet. En vanlig annvendelse av sizeof

og arrays kan være slik:

 


<?php

$arr = array('a','b','c','d','e');

for($i = 0; $i < sizeof($arr); $i++) {

echo($arr[$i]);

echo("<br>");

}

?>

 

dette vil liste opp elementene i arrayet.

 

Hvordan bruke PHP

 

Jeg har nå forklart hva PHP er, hva du kan bruke det til, hva du ikke kan bruke det til, litt om kontrollstrukturen og noen enkle funksjoner. Men hvordan skal vi bruke alt dette?

 

Det som er fint med PHP er at du skriver PHP inn i HTMLn og ikke HTML inn i PHPn.Hva er så fint med dette? Det gjør at du kan forenkle PHPn ganske mye. Hvis du skal lage en webside og du sier at du vil bruke PHP og lage siden "dynamisk". Da trenger du ikke skrive ut siden slik:

 


<?php

echo("<html>");

echo("<head>");

echo("<title>webside</title>");

echo("</head>");

echo("<body>");

echo("<a href="$lenke">hovedsiden</a>");

echo("</body>");

echo("</html>");

?>

 

Dette blir mye echo, du kan selvfølgelig skrive ut alt i en linje, echo("<html><head><title>webside</title>..."); men hverfall jeg liker å ha koden min ryddig. det som er så fint med PHP, som sagt ovenfor er at du kan gå ut og inn av PHP modus. Dette gjør at vi kan skrive koden slik:

 


<html>

<head>

<title>webside</title>

</head>

<body>

<a href="<?php echo($lenke); ?>">hovedsiden</a>

</body>

</html>

 

Her skriver vi først vanlig HTML men så inne i lenken trykker vi inn en <? og en ?>, dette forteller serveren vår at her må du utføre noen PHP funksjoner. Det å gå inn og ut av PHP modus er en viktig siden du sparer deg en del koding.

 

Det er viktig å vite at en kan plassere sjekker og looper inne i hverandre:

 


<?php

if($a > 0) {

if($a > 10) {

 echo("A er større enn ti");

}

else {

 for($i = 0; $i < $a; $i++) {

  echo($i);

  echo("<br>");

 }

 echo("Er tallene opp til A");

}

}

else {

echo("A er mindre enn 0");

}

?>

 

tester først om variablen $a er større enn 0 hvis så tester den om $a er større enn ti hvis så, skriver den ut at "A er større enn ti", hvis ikke skriver den ut alle tallene opp til $a. Hvis $a ikke er positiv vil vi få se "A er mindre enn 0".

 

-------------------------------------------------------------------------

Lenke til kommentar

Foreach

Kan sammenlignes med For og While ved at det er en måte å lage loop'er, men Foreach brukes til array og bare array.

 

Foreach kan funktionelt sett sammenlignes med while på noen måter:


$arr = array("one", "two", "three");

reset ($arr);

while (list(, $value) = each ($arr)) {

   echo "Value: $value<br>n";

}

/*her tilsvarer funktionene hverandre*/

foreach ($arr as $value) {

   echo "Value: $value<br>n";

}

 

De følgende er også funktionelt like:


reset ($arr);

while (list($key, $value) = each ($arr)) {

   echo "Key: $key; Value: $value<br>n";

}



foreach ($arr as $key => $value) {

   echo "Key: $key; Value: $value<br>n";

}

 

Noen eksempler på bruk av foreach

 

/* foreach eksempel 1: kun tall */


$a = array (1, 2, 3, 17);



foreach ($a as $v) {

  print "Nåværende tall fra $a: $v.n";

}

 

/* foreach eksempel 2: tall (med nøkkel for presentationen) */


$a = array (1, 2, 3, 17);



$i = 0; /* bare for visnings skyld */



foreach($a as $v) {

   print "$a[$i] => $v.n";

   $i++;

}

 

 

/* foreach eksempel 3: nøkkel og nummer */


$a = array (

   "en" => 1,

   "to" => 2,

   "tre" => 3,

   "sytten" => 17

);



foreach($a as $k => $v) {

   print "$a[$k] => $v.n";

}

 

/* foreach eksempel 4: fler-lags array */


$a[0][0] = "a";

$a[0][1] = "b";

$a[1][0] = "y";

$a[1][1] = "z";



foreach($a as $v1) {

   foreach ($v1 as $v2) {

       print "$v2n";

   }

}

 

/* foreach eksempel 5: dynamiske array */


foreach(array(1, 2, 3, 4, 5) as $v) {

   print "$vn";

}

Lenke til kommentar

OOP

 

En enkel klasse:

 

For å kunne opprette et objekt i PHP må du først lage en klasse. En helt enkel klasse laget slik:

 

class klassenavn {



};

 

For å ta denne klassen i bruk som et objekt må du skrive:

 

$variabel_for_aa_holde_objektet = new klassenavn;

 

Variabler og funksjoner:

 

For å legge til variabler og funksjoner skriver du:

 

var $variabelnavn;          //for å deklarere en variabel

function funksjonsnavn { //for å opprette en funksjon



}

 

Inni funksjonen kan du manipulere eller hente ut hvilken som helst variabel som tilhører objektet. Hvis vi vil hente ut eller gjøre endringer på $variabel som tilhører objektet må dette skrives slik:

 

$this->variabel = "ny data"; //hvis brukeren skal endre variabelens verdi

 

eller:

 

return $this->variabel; //hvis brukeren ønsker å returnere variabelen i sin funksjon

 

For å nå en funksjon utenfor objektet bruker man bare:

 

$variabel_for_aa_holde_objektet->funksjonsnavn("parameter");

 

da vil parameterne settes på "vanlig måte" i funksjonene.

 

Contructor:

 

Du kan lage en funksjon som kjøres automatisk da klassen blir tatt i bruk som et objekt. Dette gjøres ved å lage en funksjon i klassen med samme navn som klassen selv. Også her kan du selv velge antall parametere og hva de skal hete i funksjonen på vanlig måte.

 

Tips & tricks:

 

Variabler du setter utenfor klassen kan være litt trøblete å bruke i selve objektet med mindre du sender den med som et parameter. Dette kan du løse ved at du deklarerer den som global:

 

global $variabel;

 

NB: OOP i PHP vil bli endel annerledes fra og med PHP 5

Lenke til kommentar

Har sett opp til flertallige spørsmål om hvordan man kjører php filer på egen maskin i det siste og derav skriver jeg nå svaret her og håper da at folk som lurer på det leser det her i framtiden.

 

1.

Q: Hvorfor kan jeg ikke kjøre php filer i Internet Explorer?

A: Den enkleste forklaringen er det at php er et server-side scripting language og derav trenger en server for å kjøres. Den litt lengre forklaringen har faktisk med selve navnet å gjøre: hele navnet er egentlig "php: hypertext preprocessor" og som en del her sikkert vet: HTML er en forkortelse for Hyper Text Markup Language, og hypertext preprocessor betyr da bare noe som skjer før HTML blir skrevet ut, altså fra serveren.

 

2.

Q: Er det mulig å kjøre php filer på egen maskin?

A: Ja, men da må du legge inn en webserver som feks apache og du må også legge inn php modulen til webserveren, hvis du skal bruke databaser feks mysql må det også legges inn database server.

Lenke til kommentar
  • 2 måneder senere...

Hvilke andre steder kan jeg lete?

Dette er litt avhengig av hva du er ute etter. Jeg har satt opp de resursene jeg bruker under. Hvis noen har noen flere forslag så send meg gjerne en beskjed og jeg skal legge dem til.

 

Manualen

Det er veldig mange svar som står i manualen, men vi vet alle at det ikke bestandig er like lett å vite hva man skal søke etter. Manualen finner du på

php.net

 

Søk på nettet

metasearch.dk

google.com

groups.google.com

 

Ferdiglagede script

Det finnes mange sider å velge imellom her de jeg kommer på i farten er

hotscripts.com

resourceindex.com

php-scripts.com

warpedweb.net

scriptz.com

codewalkers.com

freshmeat.net

sourceforge.net

 

Hvis du har en annen samling så send meg en beskjed og jeg vil legge den til.

 

Hjelp til å lære

Det er mange måter å lære seg PHP på. Her er noen

* få hjelp av en kamerat til å komme igang

* kjøp en bok.

* Spør på IRC (Heldiovis så er det mange vennlige sjeler på irc. prøv #php og #php.no på efnet (for eksempel via irc.homelien.no), men ikke be om ferdige script eller støtte til slike. Spør heller når du virkelig vil lære deg programmering og står fast med et proble.

 

Edit: Lagt til linker som Magikern anbefalte.

 

EDIT AV ADMIN: beklager, men måtte bare rette en skrivefeil i en URL.

Endret av invictus
Lenke til kommentar
  • 4 uker senere...
  • 3 måneder senere...
  • 4 måneder senere...
  • 1 måned senere...
Fikk et tips av en venn om en gratis webhost:


  •  
  • Ingen reklame!
     
  • PERL versjon 5.8.4
     
  • PHP versjon 4.3.8
     
  • MySQL version 4.0.20-standard
     
  • 100mb diskplass
     
  • 10gb båndbredde i mnd
     
  • 10 e-post kontoer
     
  • stats, error logg og lignende
     
  • Plus en del andre ting som CPanel..
     

URI: www.shyper.com

* takk for tipset. skal teste det ut. men la merke til at du skrev 10 mb i båndbredde i mnd. etter det jeg leste er det 10 gb

Lenke til kommentar
  • 2 uker senere...

Spørsmål: Uæææ! Scriptet mitt funker ikke, jeg får bare feilen Cannot modify header information - headers already sent by (output started at [lang filbane]:[linjenummer]) in [lang filbane] on line [linjenummer]

 

Svar: Du kan IKKE sende header-informasjon etter at annen output er sendt. Funksjoner som sender headere er bl.a. setcookie(), header() og session_start(). Disse funksjonene MÅ plasseres over alt annet som skal sendes til nettleseren, enten det er ren tekst eller HTML-kode. Derfor vil følgende kodesnutt returnere feil:

<?php

echo('Dette er output FØR header');
header('Content-Type: text/plain');

?>

Mens dette er riktig:

<?php

header('Content-Type: text/plain');
echo('Dette er output ETTER header');

?>

 

 

Så IKKE start nye tråder om dette igjen, vær så snille.

Lenke til kommentar
  • 6 måneder senere...

Angåande header()

 

Eg lurer på om det finst ein funksjon for å opna ei "falsk" ny side, og deretter header(), slik at eg kan bruka header() midt i ein kode. Kanskje litt dårleg forklart, men eg tenkjer at det blir opna ei side utan noko som kan påverka header(). Slik som det er nå, kan eg ikkje bruka header() pga at eg tidlegare i koden har brukt bl.a. setcookie() og <header>.

Lenke til kommentar

slenger inn en litt "alternativ" metode for inkludering som skaper hva jeg vil betegne som ekstremt mye bedre linker enn den normale php linken vi alle kjenner så godt (type: ?var=value&var2=value2)

 

skal sies at jeg fant originalen av dette på http://alistapart.com, men jeg har skrevet om noen linjer hist og her,

 

først en linje i .htaccess

RewriteRule !\.(gif|jpg|jpeg|png|css)$ index.php

den sender alle kall, unntatt de som har extenction lik en av de oppramsete, til index.php, på noen servere har jeg merket at man må skrive fullpath index.php selvom det er i samme mappa som .htaccess, litt usikker på hvorfor, men sånn var det ihvertfall noen.

grunnen til dette er at vi bruker url'er type:

www.server.com/sect/sub1/sub2/ osv

 

så litt php:

rett etter <?php før noe annet:

$REQUEST_URI = $_SERVER['REQUEST_URI']; //trengs for å fungere med register_globals = off

if(file_exists($DOCUMENT_ROOT.$REQUEST_URI) and ($SCRIPT_FILENAME!=$DOCUMENT_ROOT.$REQUEST_URI) and ($REQUEST_URI!="/")){
       $url=$REQUEST_URI;
       header($DOCUMENT_ROOT.$url); //if so go to it
       exit; //usikker på om denne er nødvendig, men lar den stå 
}

dette sjekker om f.eks /sect/ er en eksisterende mappe, hvis det er så skal den nemlig ikke inkluderes så da bare går vi til den og dropper resten av php'en med en exit;.

 

her kommer hoved delen av php koden


$url=strip_tags($REQUEST_URI); //henter hele url'en
$url_array=explode("/",$url); //url legges i array

array_shift($url_array); //første delen trenger vi ikke

if(!empty($url_array)){

//jeg bruker disse tre variablene, men de er bare å endre hvis man er mer komfortabel med andre "navn"
       $sect = $url_array[0];
       $sub1 = $url_array[1];
       $sub2 = $url_array[2];

//jeg har en /style/ mappe under document_root som aldri skal røres av denne php fila, og siden jeg bruker dette scriptet til inkludering av filer fra en mappe før document_root fjerner jeg med en gang muligheten for å bruke /../
       if($sect=="style"|| $sect==".."){ 
               $sect = "404"; //hos meg er 404 en fil på samme måte som andre filer som kan inkluderes
       }
       if(empty($sect)){//hvis sect er tom så finner vi fram en default side
               $sect = "up-front"; 
       }
       $path = ("/full/path/"); //fullpath til dine inc filer
       if(!is_file($path.$sect.".php")){//en liten kontroll
               $sect = ("404");
       }
       include($path.$sect.".php");//inkluderer valgte fil
}

Nå er det ikke sikkert at dette er satt opp på den absolutt smarteste måten, så bare kom med forslag til evt endringer, men ihvertfall er dette en måte å lage:

http://www.server.com/sect/page/sub1 linker på

 

noen ting som er genialt med den typen linker:

du slipper å noensinne tenke på hvorvidt alle undersidene dine blir indexert på f.eks google

 

hvis du senere føler for å endre system arkitektur (kanskje til ett annet språk enn php) så kan du beholde de samme linkene som da fortsatt vil ha like høy eller høyere plassering på igjen f.eks google

 

du slipper klager fra forskjellige validator'er...

 

og attpåtil blir det mye lettere for deg selv og dine besøkende å huske addressene...

 

på alistapart.com mente de at det var en usikkerhet ved dette, da man i deres versjon kan skrive /../passwd e.l. og inkludere noe utenfor den dedikerte mappa, men jeg fjerna som dere ser den muligheten, men det er godt mulig at man bør legge på litt flere kontroller...

 

 

Edit: fixet noen småfeil

Endret av magikern
Lenke til kommentar
  • 1 måned senere...
Fikk et tips av en venn om en gratis webhost:
  • Ingen reklame!
  • PERL versjon 5.8.4
  • PHP versjon 4.3.8
  • MySQL version 4.0.20-standard
  • 100mb diskplass
  • 10GB bånbredde i mnd
  • 10 e-post kontoer
  • stats, error logg og lignende
  • Plus en del andre ting som CPanel..

URI: www.shyper.com

Finner ikke noe gratis på den shyper siden bare sånn at jeg må betale har du en direkte link kanskje?

Lenke til kommentar
  • 1 måned senere...
Angåande header()

 

Eg lurer på om det finst ein funksjon for å opna ei "falsk" ny side, og deretter header(), slik at eg kan bruka header() midt i ein kode. Kanskje litt dårleg forklart, men eg tenkjer at det blir opna ei side utan noko som kan påverka header(). Slik som det er nå, kan eg ikkje bruka header() pga at eg tidlegare i koden har brukt bl.a. setcookie() og <header>.

<?php
ob_start();

echo 'masse output her!';
echo 'enda litt til!';
header();

ob_end_flush();
?>

Der har du det du spør etter ;)

 

Edit: Bah, plager meg det ikke er PHP Syntax Highlight på dette forumet

<?php echo 'hello world!'; ?>

<- :(

Endret av HaZnO
Lenke til kommentar
  • 2 måneder senere...
  • 1 måned senere...

Gjestebok uten MySQL

 

I denne artikkelen vil jeg vise deg hvordan du skal kunne lage en gjestebok i PHP. Den skal ikke bruke MySQL, men den skal bruke èn fil hvor alle innleggene har hver sin linje i fila. Det er raskt og ganske fleksibelt.

 

Litt informasjon før scripting

 

Når vi skal lagre innleggene så skal vi ikke bruke MySQL, men èn fil. Vi skal lagre alle innleggene i en fil istedenfor en fil per innlegg. Det vil gå mye tregere hvis vi gjør det på den måten. Det er ikke så komplisert som noen tenker i starten.

 

Hvert innlegg skal få sin egen linje i fila, hvor vi skiller forskjellig informasjon med en rekke spesielle tegn. Det høres komplisert ut for noen, for andre ikke. Her et eksempel:

 

8756754[{**--||--**}]navn [{**--||--**}]e-post [{**--||--**}]hjemmeside [{**--||--**}]melding [{**--||--**}]dato[{**--||--**}]ip [{**--||--**}]

 

Det første du ser er tallene: 8756754. Vi skal ordne slike tall på hvert innlegg fordi det er litt enklere å arbeide med innleggene hvis de har en ID.

 

Som du kanskje legger merke til har ID-en, navnet, e-posten og hjemmesiden etc. fått følgende bit liggende bak seg: «[{**--||--**}]». Det er en måte å skille innholdet på. Jeg kommer til å vise deg hvordan vi gjør det i PHP senere.

 

Begynne å scripte

 

Det jeg skal vise deg nå er ikke akkurat en funksjon, men en kontroll struktur. En løkke: «foreach». Det er en løkke som er spesielt brukt for matriser (arrays). Fordi, hele fila vår skal bli omgjort til en matrise, hvor da vært element er en linje i fila.

 

Først må du lage en fil, kall filen entries.db.php. Dette blir filen hvor alle innleggene skal bli lagret, nesten som en database. Du må huske å chmodde filen til 777. I øverste linje må du legge inn følgende kode:

 

<?php die (’’); ?>

 

Den vil sørge for at hvis folk prøver å åpne filen så blir de umiddelbart stoppet. Det vil vise en blank side. Det gjør at ingen skal kunne åpne fila og lese det som står der, og finne ut hvordan vi skiller innholdet. Litt dumt hvis noen vet det og skriver skilletegnet vårt inn i gjesteboka. Vedkommende vil kunne rote til hele gjesteboken.

 

Nå skal vi begynne på formen til gjesteboka, innputtene, eller kanskje du kaller det felter. Lag en fil kalt gb.php og fyll den inn med dette:

 

<h2>Gjestebok</h2>

<p><a href="gb_read.php">Les innlegg</a></p>

<form method="post" action="gb_act.php">

<p><label for="name">Navn</label><br />
<input type="text" name="name" id="name" />
</p>

<p><label for="email">E-post</label><br />
<input type="text" name="email" id="email" />
</p>

<p><label for="message">Melding</label><br />
<textarea name="message" id="message" style="width: 400px; height: 150px;"></textarea>
</p>
 
<p> 
<input type="submit" name="submit" value="Lagre innlegget" />
</p>

</form>

 

Dette blir filen hvor brukeren får skrive selve innlegget sitt, eller han kan trykke for å lese andres innlegg.

 

Nå skal vi lage filen som lagrer innlegget. Den må du kalle gb_act.php og den skal vi legge følgende inn i:

 

<?php

// Definerer en konstant. Det er det samme som en variabel bare at vi kan
// ikke endre verdien.
define ('ENTRIES_DB', 'entries.db.php');

// Setter maksimum hvor mange tegn navn og melding kan ha.
define ('MAX_INPUT_NAME', 75);
define ('MAX_INPUT_MESSAGE', 5000);

// Fjerner all form for HTML og whitespaces.
$name = strip_tags(htmlspecialchars(trim($_POST['name'])));
$email = strip_tags(htmlspecialchars(trim($_POST['email'])));
$message = strip_tags(htmlspecialchars(trim($_POST['message'])));

// Hvis Magic Quotes er på så vil det automatisk settes på \, slash altså
// på alle appostrofer. Koden under vil sørge for at det ikke skjer.
if(get_magic_quotes_gpc) {
       $name = stripslashes($name);

       $email = stripslashes($email);
       $message = stripslashes($message);
}

// Fikser slik at det ikke blir noen linjeskift i fila.
$replace = array("\r\n" => '<br />', "\t" => '');

$name = strtr($name, $replace);
$email = strtr($email, $replace);
$message = strtr($message, $replace);

// Fjerner [{**--||--**}] fra alle felter hvis noen har prøvd det. Det kan være svært skadelig for
// gjesteboka hvis noen gjør det.
$replace = array('[{**--||--**}]' => '');

$name = strtr($name, $replace);
$email = strtr($email, $replace);
$message = strtr($message, $replace);

// Sjekker om fila er skrivbar. Er den ikke det så blir det feilmelding.
if (!is_writable(ENTRIES_DB)) {
       echo '<h2>Feil!</h2><p>Vi kan ikke skrive til entries.db.php.</p>';
}

// Sjekker om navn og en melding er fylt ut. Hvis ikke blir det feilmelding.
elseif (empty($name) || empty($message)) {
       echo '<h2>Feil!</h2><p>Navn og en melding må fylles inn!</p>';
}

// Sjekker om navnet er for langt.
elseif (strlen($name) > MAX_INPUT_NAME) {

       $rest = strlen($name)-MAX_INPUT_NAME;
       echo '<h2>Feil!</h2><p>Navnet er for langt. Maks. '.MAX_INPUT_NAME.' tegn. Du må fjerne '.$rest.' tegn.</p>';

}

// Sjekker om meldingen er for stor.
elseif (strlen($message) > MAX_INPUT_MESSAGE) {

       $rest = strlen($message)-MAX_INPUT_MESSAGE;
       echo '<h2>Feil!</h2><p>Meldingen er for langt. Maks. '.MAX_INPUT_MESSAGE.' tegn. Du må fjerne '.$rest.' tegn.</p>';

}

// Hvis det er skrevet en e-post og den ikke er systematisk rett - feilmelding!
elseif (!empty($email) && !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
       echo '<h2>Feil!</h2><p>E-posten er ikke rett, den er systematisk feil.</p>';
       exit();
}

// Det virker som om det meste gikk bra, da begynner vi å titte på å lagre meldinga.
else {

       // Henter IP-en til vedkommende.
       $ip = $_SERVER['REMOTE_ADDR'];
       // Får PHP til å velge ut noen tall mellom 1000 og 9999.
       $id = rand(1000, 9999);
       // time() er en lur funksjon. Utifra den kan vi skrive forskjellige datoer.
       $date = time();

       // Samler alt sammen i ett.
       $content = $id . '[{**--||--**}]' . $name . '[{**--||--**}]' . $email . '[{**--||--**}]' . $message . '[{**--||--**}]' . $ip . '[{**--||--**}]' . $date . '[{**--||--**}]' . "\n";

       // Åpner filen
       if (!$fp = fopen(ENTRIES_DB, 'a')) {
               echo '<h2>Feil!</h2><p>Kan ikke åpne filen.</p>';
               exit();
       }

       // Skriver innholdet.
       if (fwrite($fp, $content) === FALSE) {
               echo '<h2>Feil!</h2><p>Kan ikke skrive til filen.</p>';
               exit();
       }

       // Beskjed om at det ble velykket.
       echo '<h2>Sukksess!</h2><p>Ditt innlegg er lagret, du kan lese det <a href="gb_read.php">her</a></p>';

       // Lukker filen.
       fclose($fp);

}

?>

 

Da er vi ferdig med action-fila. Vi har sjekket og gjort følgende:

  • Fjernet all form for HTML og andre farlige tegn.
  • Sørget for at ingen kan skrive en blank melding.
  • Sjekket om e-posten er systematisk rett.
  • Gjort slik at man ikke kan skrive veldig store meldinger. I tilfelle det er en som har lyst å ødelegge.
  • Lagret IP-en til vedkommende som skriver.
  • Laget en ID til hvert innlegg.

Når vi har lagret innlegget så vil vi gjerne se innlegget. Da må du lage filen gb_read.php og fylle den inn med:

 

<?php

define ('ENTRIES_DB', 'entries.db.php');

// Velger hvordan vi vil ha dato formen.
define ('DATE_FORMAT', 'd.m.Y');

// Gjør hele fila om til en matrise, hvor da hvert element er lik
// ei linje. I tillegg reverserer vi arrayen for å få det nyeste
// innlegget først.
$entries_array = array_reverse(file(ENTRIES_DB));

echo '<h2>Gjestebok innlegg</h2>';
echo '<p><a href="form.php">Skriv innlegg</a></p>';

foreach ($entries_array AS $lines) {

       // Sørger for å ikke ta med <?php die ('') etc.
       if (strpos($lines, "<?php") === FALSE) {

               // Hver linje er en matrise, hvor elementet er splittet med [{**--||--**}]
               $entry = explode('[{**--||--**}]', $lines);
       
               // Lager enklere variabel navn.
               $name = $entry[1];
               $email = $entry[2];
               $message = '<p>'.$entry[3].'</p>';
               $date = $entry[5];
       
               // Lager valid XHTML.
               $replace = array('<br /><br />' => '</p><p>');
               $message = strtr($message, $replace);
       
               // Lager navnet om til en lenk hvis det er en e-post som er skrevet.
               if (!empty($email)) {
                       $name = '<a href="mailto:'.$email.'">'.$name.'</a>';
               }
       
               // Skriver ut hele innlegget:
               echo '<p><strong>'.$name.' - '.date(DATE_FORMAT, $date).'</strong></p>';
               echo $message;
               echo '<hr />';
               
       }

}

?>

 

«Er det mer man kan gjøre for å bedre/sikre gjesteboken?»

 

Ja, det er noe mer du kan gjøre, noe man kan prøver å ordne selv. Flood sperre! Det vil si at vedkommende ikke kan skrive et innlegg rett etter han nettopp har skrevet et. Han må f. eks. vente i fem minutter. Nyttig i tilfelle noen ønsker å ødelegge gjesteboken din.

 

«Paging» er fullt mulig å ordne på gjesteboken. Du kan kanskje ordne et administratorsystem hvor du kan endre, slette og kommenterer innlegg.

 

Lykke til!

Endret av Beethoven
Lenke til kommentar
  • 2 uker senere...

En nedtellingstidtager

 

Siden det er ofte spørsmål her på forumet om nedtellingstidtager, så skal jeg legge ut min hjemmelagde!

 

class DagerIgjen {
function DagerIgjen($yes) {
$this->totalsek = $yes;
$this->totalmin = floor($this->totalsek / 60);
$this->totaltimer = floor($this->totalmin / 60);
$this->totaldager = floor($this->totaltimer / 24);
$this->totalår = floor($this->totaldager / 365);
$this->sek = $this->totalsek - ($this->totalmin * 60);
$this->min = $this->totalmin - ($this->totaltimer * 60);
$this->timer = $this->totaltimer - ($this->totaldager * 24);
$this->dager = $this->totaldager - ($this->totalår * 365);
$this->år = $this->totalår;
}

function standar($to) {
echo "Det er $this->dager dager, $this->timer timer, $this->min minutter og $this->sek sekunder til $to";
}

function sekunder($to) {
echo "Det er $this->totalsek sekunder til $to";
}
}

Eksempler:

// JUL
$jul = mktime(0, 0, 0, 12, 24, date("Y", time()));
if ($jul < $nå) {
$jul = mktime(0, 0, 0, 12, 24, date("Y", time()) + 1);
}
$tiljulsek = $jul - time();
$tiljul = new DagerIgjen($tiljulsek);
echo $tiljul->sekunder("jul");
echo $tiljul->standar("jul");

// Sommerferie
$sommerferie = mktime(0, 0, 0, 6, 22, 2006);
$tilsommersek = $sommerferie - time();
$tilsommer = new DagerIgjen($tilsommersek);
echo $tilsommer->sekunder("sommerferien");
echo $tilsommer->standar("sommerferien");

Linje for linje:

$jul = mktime(0, 0, 0, 12, 24, date("Y", $nå));

if ($jul < time()) {

$jul = mktime(0, 0, 0, 12, 24, date("Y", $nå) + 1);

}

Denne her lager et unix-timestample av 24.12. Hvis julaften nettopp har vært tar den neste års...

 

$tiljulsek = $jul - time();

Her finner vi ut hvor mange sekunder det er igjen til jul!

 

$tiljul = new DagerIgjen($tiljulsek);

Her kjører vi klassen vår, og alle variablene blir satt.

 

$tiljul->sekunder("jul");

Her printer vi ut hvor mange sekunder det er til "jul"

 

echo $tiljul->standar("jul");

Denne her vil printe ut f. eks: Det er 47 dager, 11 timer, 13 minutter og 42 sekunder til jul

 

$sommerferie = mktime(0, 0, 0, 6, 22, 2006);

Her lager vi et unix-timestample den 22. Juni 2006 (Da begynner sommerferien :) )

 

$tilsommersek = $sommerferie - time();

Her finner vi ut hvor mange sekunder det er igjen!

 

$tilsommer = new DagerIgjen($tilsommersek);

Her kjører vi klassen vår, og alle variablene blir satt.

 

echo $tilsommer->sekunder("sommerferien");

Her printer vi ut hvor mange sekunder det er til "sommerferien"

 

echo $tilsommer->standar("sommerferien");

Denne her vil printe ut f. eks: Det er 227 dager, 10 timer, 9 minutter og 13 sekunder til sommerferien

 

Hva er forskjellen fra $this->totalmin og $this->min?

Forskjellen er at $this->totalmin inneholder hvor mange minutter totalt det er igjen til tidspunktet, mens $this->min må brukes sammen med dagene og timene...

 

--------------------------------

 

Jeg håper du likte denne guiden (Det er min første, så jeg trenger nok litt trening). Er det noe som er uklart så send meg en PM så skal jeg rette det opp ;)

Endret av Judofyr
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...