Brugernavn:




Kodeord: Husk
Forside Forum Artikler Downloads Søg
 

Konfigurationsfiler i PHP


Hej Rowl-brugere og brugerinder, hvis man kan sige det.

I denne artikel vil jeg vise hvorfor og hvordan, .INI-filer bruges af et PHP-script. En INI-fil er en såkaldt konfigurationsfil. Den kan altså ikke alene udføre noget, men den bliver brugt af andre programmer og filer. Når man udvikler systemer i PHP, kan man med fordel benytte en INI-fil, i stedet for at oprette en PHP-fil ved navn ”config”, eller hvad jeres PHP-konfigurationsfiler nu plejer at hedde.

En INI fil består egentlig kun af variabler og sektioner. På det grundlag, at du meget gerne skal vide hvad variabler er, vil jeg nøjes med at forklare sektioner. Hvis vi skal sammenligne en sektion med noget, ville det første, jeg kom til at tænke på, være en klasse. En sektion kan nemlig indeholde variabler, ligesom en klasse. Dog kan den ikke indeholde funktioner, igen fordi INI-filen i sig selv ikke kan udføre noget. Det har en lille ulempe, og det er, at da den ikke bliver oversat af serveren inden den når ud til klienten, er det muligt at se koden i .INI filen direkte i browseren, så hvis din INI-fil indeholder nogle følsomme data, gør du klogt i at kalde den noget lidt indviklet, og gemme den et godt sted på din server. Du bør måske heller ikke gemme meget vigtige oplysninger i en INI-fil, men risikoen for at andre finder den er jo stort set minimal.

Før vi går i gang med at lave et PHP-script, der benytter INI-filer, skal vi kendes syntaksen på en INI-fil. Den er helt utroligt simpel. Et eksempel:
  1. navn = Thomas
  2. alder = 15
Det ligner altså lidt ASP, men gåseøjnene rundt om strengene er ikke nødvendige. Hverken rundt om talstrenge eller almindelige strenge.
Hvis vi vil oprette en INI-fil med sektioner, gør vi således:
  1. [navne]
  2. navn = Thomas
  3. [aldre]
  4. alder = 15
  5. [andet]
  6. mus = logitech
Det sidste, der er værd at kende ved en INI-fil, er kommentarer. Nogle folk bruger dem, andre gør ikke, det er helt op til dig. Hvor kommentarer i PHP startes med //, startes kommentarer i INI-filer med et ; , altså et semikolon.
  1. ; Først laver vi denne kommentar
  2. ; Så laver vi en sektion
  3. ; Og dernæst laver vi en variabel
  4. [sektion]
  5. variabel = værdi
Når PHP læser fra INI-filen vil teksten efter semikolonerne (kommentarerne) altså ikke blive taget med.

Prøv nu at lave en INI-fil, der ser således ud, og gem den som config.ini.
  1. [tagwall]
  2. beskeder_pr_side = 5
  3. html_tags = 0
  4. tekst_paa_submit_knap = Send
Nu skal vi til at lave PHP filen. Det første vi gør, er at lave et array, der indeholder alle variabler og deres værdier. Til det bruger vi PHP’s funktion parse_ini_file. Den tager to argumenter: Det første er stien til vores INI-fil, det andet angiver om vi vil benytte os af sektioner. Det kan vi ligeså godt, så får du lært det også. Altså kan koden indtil videre se sådan ud:
  1. <?php
  2. $ini = parse_ini_file (’config.ini’, true);
Hvis andet argument havde været 0 eller false (disse er det samme i PHP), ville vi ikke kunnet have benyttet os af sektioner.

Nu har vi indlæst vores fil. Det første vi nu vil gøre, er at tjekke om den besøgende må bruge HTML i vores gæstebog. Bemærk, at jeg ikke vil lave koden til en gæstebog i denne artikel, bare så du ikke leder forgæves :]

  1. while ($r = mysql_fetch_array ($resource))
  2. {

  3. if ($ini [‘tagwall’][‘html_tags’] == 0)
  4. $r [‘besked’] = htmlentities ($r [‘besked’]);

  5. }
I kodeblokken før denne oprettede vi $ini, som indeholder alle variabler og sektioner i vores INI-fil. Først bestemmer vi hvilken sektion vi henter fra, ved at skrive navnet på den i det første array-indeks ([’tagwall’]). Dernæst skal vi hente en variabel fra den pågældende sektion, så vi smider endnu et array-indeks ind ([’html_tags’]). Grunden til at vi kan dette, er en smule kompliceret, men jeg vil prøve at forklare det så godt som muligt:

$ini er et array--ikke en streng. Den indeholder navnene på alle vores sektioner. Hvert navn – eller sektion, om man vil – er et array, der indeholder navnene på alle vores variabler. Jeg vil her illustrere det med mine berømte Paint-evner.

Nu har jeg endelig fået mig en server. Så håber jeg bare billedet bliver ved med at være der! Nå, videre.

Vi kunne også udvide eksemplet med en database-forbindelse. Vores systemer skal være så fleksible og brugervenlige som muligt, så vi lader brugeren indtaste sine databaseoplysninger selv. Dette skal foregå i en INI-fil, i fald brugeren af systemet ikke har forstand på at tilkoble databaser i PHP. Altså har vi her kontakt.ini:
  1. host = localhost
  2. brugernavn = root
  3. database = systemer
  4. password = xyz123
Vi gider ikke beskæftige os med sektioner denne gang, da vores kontakt.ini kun har et bestemt formål, nemlig at indeholde oplysningerne til vores data.

kontakt.php
  1. <?php
  2. $ini = parse_ini_file (’kontakt.ini’);
  3. $cnt = mysql_pconnect ($ini [’host’], $ini [’brugernavn’], $ini [’password’]);
  4. $db = mysql_select_db ($ini [’database’], $cnt);
  5. if (!$cnt || !$db) exit (‘<p>Database kan ikke kontaktes.</p>’);
  6. ?>
Således kan vi kontakte vores database. Bruger du mysql_pconnect, skal du huske at lukke forbindelsen igen: mysql_close ($cnt).
Men dette kan hurtigt blive et relativt trivielt arbejde, og så er det dejligt med nogle genveje, så det skal du få. Først kigger vi på funktionen extract.
  1. <?php


  2. extract ($ini);
  3. $cnt = mysql_pconnect ($host, $brugernavn, $password);
  4. $db = mysql_select_db ($database, $cnt);
  5. if (!$cnt || !$db) exit (‘<p>Database kan ikke kontaktes.</p>’);


  6. mysql_close ($cnt);
  7. ?>
At extract’e betyder at udpakke. Det gør du blandt andet når din ven sender dig en .ZIP over MSN, eller du downloader en .RAR fra Internettet. Så pakkes indholdet ud. Vores array-indekser bliver altså omdannet til variabler. Dvs.
extract (array (”navn” => ”dexo”, ”alder” => 15));
… vil lave variablerne $navn og $alder, og de vil indeholde henholdsvis “dexo” og 15.
Obs.: Læs mere om extract i PHP manualen inden du bruger den i alle dine scripts, da den kan have nogle mere eller mindre fatale konsekvenser. Den kan blandt andet overskrive dine andre variabler, hvis du giver den de forkerte argumenter.

En anden dejlig funktion er array_map. Dens første argument er et såkaldt CALLBACK-argument, man smider altså navnet på en funktion deri, og så benytter array_map sig af den funktion. Jeg kombinerer tit array_map og extract med hinanden. Dette sparer mig for mange linier kode.
Nu forestiller vi os vi har vores INI-fil, der bestemmer hvor vidt en bruger må benytte HTML i sine indlæg eller ej. Hvis han ikke må, skal vi til at bruge htmlentities på hver eneste felt i vores database-tabel, for at undgå HTML-tags. Det er virkelig irriterende, og helt unødvendigt, det kan klares sådan her:

  1. $ini = parse_ini_file (’config.ini’);



  2. while ($r = mysql_fetch_array ($resource))
  3. {

  4. if ($ini [‘html_tags’] == 0)
  5. $r = array_map (‘htmlentities’, $r);

  6. extract ($r);

  7. print “Af: $forfatter<br /><br />$besked<br /><br />”;

  8. }
array_map gør det, at den bruger vores funktion (det, vi skriver i første parameter, altså ’htmlentities’) på hvert indeks i array’et, som vi smider som andet argument. Derefter udpakker vi $r, som indeholder alle data i vores gæstebog. Det betyder, at:

$r [’forfatter’] bliver til $forfatter
$r [’besked’] bliver til $besked

… og så videre. Det forudsætter selvfølgelig, at vi har et ”forfatter” og et ”besked” felt i vores database-tabel.

Det var det, nu kan jeg ikke komme på mere omkring INI-filer og praktiske funktioner. Det er måske værd at nævne, at dette kun kan lade sig gøre fra og med PHP4, men det er de færreste der kører med ældre versioner efterhånden.

Til sidst vil jeg sige, at jeg meget gerne tager i mod kommentarer, ligeså vel som kritik, så længe sidstnævnte er konstruktivt og begrundet. Jeg håber du har læst hele artiklen igennem, inden du rater den, hvis du altså gør det, og at du vil lægge en kommentar, der beskriver hvorfor du har givet artiklen den karakter, du nu end måtte give, så jeg kan forbedre mig i fremtiden.

Hilsen Dexo :-)
Sidst redigeret 12:23 - 16/05/2007
Oprettet af:

PHP

Point modtaget: 0

Rate:
21:41 15/05/2007

Kommentarer

Giv din mening tilkende om denne artikel, eller læs andres.
Har du spørgsmål eller brug for hjælp til denne artikel henvises du til forummet.
Super interesant artikel.
Dog kunne du godt fortælle lidt om mulighederne for at sikre sine .ini-filer, istedet for blot at kalde den noget indviklet..

Fx. kan man via .htaccess ændre på de rettigheder som gør at filen kan læses i browseren, mener jeg.

Eller man kunne evt. kalde den med endelsen .php? Ville det gøre nogen forskel? Eller forsøge med nogle små-hacks som:
;<?exit("Forsvind!")
; dine ini-variabler her
;?>
Sidst redigeret 23:49 - 16/05/2007
Oprettet af:
  Mail
23:40 16/05/2007
Nice 5 !
Oprettet af:
  Mail
17:04 17/05/2007
Du har fået fém af mig.

En rigtig god, interessant og lærerig artikel. Jeg sidder også med det samme spørgsmål som Micra. Kan man beskytte sin .ini-fil?

Selvfølgelig kan man jo bare lave en fil, som der fx hedder settings.php, også opretter sine variabler derinde, men det virker nu mere smart og professionelt at gøre det via .ini-filer.
Oprettet af:
  Mail
10:19 19/05/2007
Martin > Ja, helt enig.
Micra fandt faktisk en metode frem.
Hvis du kalder din fil for (fx) settings.php
Så laver du stadig en INI-syntax i den fil, men i starten skriver du:

;<? exit(); ?>

og efter den linie kommer alle dine INI-sektioner og INI-variabler osv

Edit: Du bruger self stadig parse_ini_file, selvom det er en PHP-fil.
Eksempel:
$fil = parse_ini_file("settings.php");
Sidst redigeret 11:34 - 19/05/2007
Oprettet af:
  Mail
11:30 19/05/2007
skide godt homie ! :D
god forklaring og godt skrevet .. du får stuur 5tal af maj
Oprettet af:
  Mail
15:54 19/05/2007
Blæret nok.
Oprettet af:
  Mail
23:19 30/05/2007
Du har fået 4 af mig. Somsagt tidligere er det sjovt at høre om en funktion der ikke bliver brugt så meget. Igen vil jeg gerne høre hvad fordelen er ved konfigurationsfilerne i forhold til en almindelig .php fil der bliver included? Jeg kunne forestille mig at disse filer kunne redigeres med programmer, men hvilke, hvad er mulighederne i det og hvordan? Det kunne evt. være stof til en ny og rigtig spændende artikel.
Oprettet af:
  Mail
09:34 02/06/2007
Jeg ved ikke om det er en fordel at bruge INI filer, men det er et alternativ. Det er rigtigt, de kan bruges og redigeres af programmer. Det kan PHP filer i og for sig egentlig også, men det kan ikke rigtigt betale sig.

Fordelen ved INI filer kunne eventuelt være syntaksen. I PHP er det måske ikke den store fordel, da variablerne automatisk bliver indlæst og oprettet af PHP, men i andre programmeringssprog er det en stor lettelse, at syntaksen er så enkel. Jeg har blandt andet arbejdet med INI filer i Delphi, det er blandt andet klart at foretrække fremfor TXT filer.
Oprettet af:
  Mail
09:52 02/06/2007
Rigtig god artikel, det kunne nemlig godt være et alternativ hvis man nu skal til at lære andre programmeringssprog end PHP, hvor syntaksen "sværere".

Et stort 5 tal, jeg synes du formår at forklare tingene på en god måde, så man forstår det, og ikke skal læse det igennem 2-3 gange :)
Oprettet af:
  Mail
22:45 16/08/2007
Du skal være oprettet og logget ind for at kommentere en artikel
Copyright © Rowl.dk v/ Michael Raagaard | 2005-12 | Alle rettigheder forbeholdes