Anniversary - BF C/C++ week
80 % bodů zdarma na online výuku díky naší Narozeninové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se C/C++

PHP: Databáza INIFILE

Databáza MySQL je veľmi populárny. Najmä medzi začínajúcimi vývojármi, ale ani pokročilí jej nepohrdnú. Podporuje totiž veľkú časť štandardu SQL. SQL je vynikajúci jazyk pre prácu s databázou, ale pre niektoré úložisko typu "kľúč => hodnota" je to povestný "kanón na vrabca".

V PHP som už vyskúšal už 11 databáz s rozdielnymi vlastnosťami. Niektoré sú veľmi dobre použiteľné, niektoré vynikajúce. Tiež sa medzi nimi vyskytol odpad, po ktorom žiadny rozumný vývojár nesiahne. Aby sa však non-MySQL databázy uchytila, musí mať aspoň v niečom výraznú prednosť.

Prvá databáz, ktorú som vybral, je INIFILE. Možno ten názov niekomu pripomenie súbory s príponou "ini" vo Windows. Áno, je to ono. Obyčajný textový súbor s jednoduchou vnútornou štruktúrou v tvare "kľúč = hodnota", v ktorom sú jednotlivé záznamy oddelené novým riadkom.

V čom je taká databázy jedinečná? V jednoduchosti! Iste ste si už niekedy potrebovali poznamenať prístupové údaje k "veľkej" databázu, spísať zoznam chybových hlásení v rôznych jazykoch a pod. Pritom ste to nechceli vkladať priamo do skriptov, pretože ste chceli oddeliť program od dát.

S použitím INIFILE je to veľmi jednoduché. Proste taký text napíšete v ľubovoľnom textovom editore a necháte PHP, aby si ho prečítalo.

host=localhost
user=kit
pass=kitovoheslo
name=test
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

Uložil som si ho do súboru .htdata.ini. ".Ht" na začiatku názvu mi zaistí, že si tento súbor nikto nezobrazí v prehliadači. Možností pre skrytie súboru je však viac.

Tu je časť aplikácie, ktorá si túto konfiguráciu dokáže prečítať a vypísať:

<?php
$mysql=parse_ini_file('.htdata.ini');
print_r($mysql);

Áno, to je všetko. A tu je výsledok:

Array
(
    [host] => localhost
    [user] => kit
    [pass] => kitovoheslo
    [name] => test
)

Ako je vidieť, všetky hodnoty sa uložili do asociatívneho poľa $mysql pripravené na ďalšie použitie. A ako je to s rýchlosťou? Dátový súbor, ktorý mal 100 KB (2000 kľúčov) mi PHP načítal za cca 10 ms. To by som bral ako horný limit. Pre bežné použitie pri pravidelnom načítaní bude 200 kľúčov rozumná hranica. Viac konfiguračných parametrov aplikácie ani nemávajú. Pre chybové hlásenia môže byť toto limitný číslo pokojne aj vyššie.

Štruktúra dát nemusí byť len plochá, ale je možné použiť ešte jednu úroveň zanorenia:

[MySQL]
host=localhost
user=kit
pass=kitovoheslo
name=test
[PgSQL]
host=localhost
user=kit
pass=pgheslo
name=testpg

program:

<?php
$inidata=parse_ini_file('.htdata.ini',true);
print_r($inidata);

výstup:

Array
(
    [MySQL] => Array
        (
            [host] => localhost
            [user] => kit
            [pass] => kitovoheslo
            [name] => test
        )
    [PgSQL] => Array
        (
            [host] => localhost
            [user] => kit
            [pass] => pgheslo
            [name] => testpg
        )
)

Vzniklo nám dvojrozmerné asociatívne pole, ktoré by mohlo vystačiť aj pre náročných konfigurácie.

Dajú sa nájsť aj návody, ako dvojrozmerné pole zapísať do INI, ale všeobecne tento postup nemôžem odporučiť. Obvyklejšie je taký súbor pripraviť na lokálnom PC a na server nakopírovať.

Zmienil som sa o multijazyčných verziách webe. Nie je to zas tak zložité. Stačí len vytvoriť patričný počet súborov, v každom z nich bude slovník hesiel v jednom jazyku. Funkcia parse_ini_file() potom len podľa zvoleného jazyka klienta otvorí ten správny súbor a jeho obsah uloží do poľa. Potom už je len na aplikáciu, ako s obsahom poľa naloží.

Použitie tejto databázy môže byť výhodné v situáciách:

  • potrebujem načítať konfiguračné dáta, ktoré nechcem mať v súboroch .php
  • potrebujem použiť väčšinu načítaných dát, napr. do šablóny
  • dát nie je veľa
  • potrebujem jednoduchú editáciu prostým editorom
  • dáta budú použité výnimočne, napr. chybové hlásenia
  • potrebujem dáta, ktoré budú dostupné aj v prípade nedostupnosti hlavnej databázy

Existuje aj niekoľko proti:

  • dát je veľa, potrebujem čítať len niektoré
  • potrebujem vyhľadávať aj inak ako podľa primárneho kľúča
  • pořebujete často zapisovať
  • potrebujem zapisovať dáta od užívateľov (hrozí injection)
  • určite by sa našla aj ďalšie

 

 

Článok pre vás napísal Kit
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
Jsem spokojeným uživatelem operačních systémů založených na linuxovém jádře. Zejména openSUSE a Ubuntu. Pro psaní veškerých textů a programů používám vynikající textový editor Vim. Aplikace se snažím psát vždy v tom nejvhodnějším programovacím jazyk...
Všetky články v sekcii
Práca so súbormi v PHP
Aktivity (1)

 

 

Komentáre

Avatar
Kit
Redaktor
Avatar
Kit:14.9.2012 6:14

Ještě se INIFILE budu jednou věnovat, tentokrát budu i zapisovat. Bude se to však dost lišit a bude to mít i jiné použití.

Uvažoval jsem ještě o ukázce objektu se slovníkem a jeho využití v Heredoc.

Odpovedať
14.9.2012 6:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
albertpatera
Redaktor
Avatar
albertpatera:14.9.2012 15:33

ahoj, chtěl bych se zeptat, kam uložím tenhle kód, díky

$mysql=parse_i­ni_file('.htda­ta.ini');
print_r($mysql);

 
Odpovedať
14.9.2012 15:33
Avatar
user
Redaktor
Avatar
user:14.9.2012 16:55

zajímavé, těším se na pokračování :)

 
Odpovedať
14.9.2012 16:55
Avatar
Kit
Redaktor
Avatar
Odpovedá na albertpatera
Kit:15.9.2012 10:36

Do souboru PHP. Příště zkusím poctivě dávat <?php na začátek každého skriptu.

Odpovedať
15.9.2012 10:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
albertpatera
Redaktor
Avatar
albertpatera:15.9.2012 10:50

diky moc

 
Odpovedať
15.9.2012 10:50
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
jan.vencl
Redaktor
Avatar
jan.vencl:13.8.2013 17:32

Velice pékně :)) , mám dotaz jake by si poradil ten zápis do souboru aby to bylo co nejrychlejší? nebo jinak nemáš na to nějakou třídu:)

 
Odpovedať
13.8.2013 17:32
Avatar
Kit
Redaktor
Avatar
Odpovedá na jan.vencl
Kit:13.8.2013 18:17

Pokud chceš přepsat kompletně celou databázi, můžeš třeba použít běžnou funkci file_put_conten­ts(), ale pokud chceš měnit jen jednotlivé záznamy, tak je vhodnější otevřít pomocí dba_open(), přepisovat je dba_replace() a mazat dba_delete(). Tyto funkce se zároveň postarají o zamykání databáze.

Pozor, tyto funkce na INIFILE nejsou binary-safe. V záznamu nesmíš mít ani odřádkování. Na data návštěvníků se tato databáze vůbec nehodí. Spíš na uložení konfigurace.

Odpovedať
13.8.2013 18:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovedá na jan.vencl
Kit:13.8.2013 18:22

Pokud potřebuješ, aby to bylo co nejrychlejší, použij místo INIFILE jednu z databází DB4 nebo GDBM. Rychlejší běžně dostupné databáze už neznám.

Odpovedať
13.8.2013 18:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
jan.vencl
Redaktor
Avatar
Odpovedá na Kit
jan.vencl:14.8.2013 2:04

Já to chci hodně separovat potřebuju ty data hodně málo a to "jen" zapisování souboru stačí asi to infile,nebo jinak se zeptám jak nejrychleji načíst čtyřprvkové pole a jeden string o délce asi 120znaků? Jedná se o takovej malej konfigurační soubor

Editované 14.8.2013 2:05
 
Odpovedať
14.8.2013 2:04
Avatar
Kit
Redaktor
Avatar
Odpovedá na jan.vencl
Kit:14.8.2013 10:06

Těch možností je hodně. INIFILE, CSV, JSON,... To vše PHP podporuje a dá se zapsat na 1-2 řádcích.

Odpovedať
14.8.2013 10:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!