Autor Zpráva
Ap0
Profil *
Zdravím, mám PHP súbor s dajme tomu takýmto obsahom:
<?
$conf['app_version'] = "167";
$conf['license_number'] = "";
$conf['debug'] = "1";
$conf['install_lock'] = "1";
$conf['db_hostname'] = "localhost";
$conf['db_username'] = "username";
$conf['db_password'] = "password";
$conf['db_name'] = "sample";
$conf['db_type'] = "mysql";
$conf['db_prefix'] = "exp";
$conf['db_conntype'] = "0";
$conf['system_folder'] = "system";
$conf['cp_url'] = "http://sample:8888/system/index.php";
$conf['doc_url'] = "http://expressionengine.com/docs/";
$conf['cookie_prefix'] = "";
$conf['is_system_on'] = "y";
$conf['allow_extensions'] = "n";
$conf['multiple_sites_enabled'] = "n";
?>

Bude to konfiguračný súbor celého webu. Odtiaľ si viem tie premenné zistiť, ale neviem ich meniť. Pôvodne som chcel použiť funkciu parse_ini_file(), ale tá funguje na inom princípe, kvôli ktorému by si mohol ktokoľvek pozrieť nastavenia zadaním cesty ku tomu súboru. Potrebujem nejaký šikovný skript, niečo čo by vyzeralo podobne ako toto:
edit_config("config.php", array("$conf['debug']" => "0"));
A tým by sa hodnota v súbor config.php prepísala. Stretli ste sa už s tým? Vďaka za rady
Joker
Profil
Ap0:
Většina těch nastavení jsou jednorázové věci, které asi nemá smysl měnit za běhu.
Nestačilo by prostě editovat ten soubor?

Jestli je nutné webové rozhraní, udělal bych tu konfiguraci v nějakém „normálním“ standardizovaném formátu (XML, INI) a použil k tomu příslušný parser.
Výhoda bude, že standardní parser je spolehlivý (používají ho celé roky spousty lidí) a i kdyby něco uložil blbě, nejspíš přestane fungovat jen ta konkrétní položka v konfiguraci.
Zatímco když konfigurace bude PHP kód, bude ji přepisovat nějaký skript a vyrobí tam syntaktickou chybu, přestane fungovat celá aplikace.

Mimo téma, není úplně dobrý nápad dělat boolean u různých položek různými způsoby (někde "0"/"1", někde "y"/"n")
Chro
Profil
Ap0:
I klasický INI soubor, pojmenovaný např. nastaveni.ini.php můžeš skrýt před zraky zvědavců následujícím způsobem:
;<?php exit; ?>
klic1 = "hodnota1"
klic2 = "hodnota2"
a výhodně tak používat nativní funkci PHP parse_ini_file. Středník na začátku řádku se bere jako začátek poznámky až do konce řádku a parser ji ignoruje. PHP při pokusu zobrazit obsah souboru v prohlížeči poznámku vyhodnotí jako ukončení běhu skriptu a dále nic nevypisuje.
Alphard
Profil
Chro [#3]:
Má to nějaké výhody oproti klasickému řešení, kdy je konfigurace umístěná v z vnějšku nepřístupné části webu?
Fisir
Profil
Reaguji na Chra [#3]:
A co ho rovnou zakázat přes htaccess, než tohle pofidérní (avšak funkční) řešení?
Chro
Profil
Alphard, Fisir:
Já třeba na freehostingu, který používám, nemohu znepřístupnit soubor natož nakládat s htaccess. Takže pro mě přijatelné řešení problému.
Ap0
Profil *
Joker:
Ono robím totiž vlastný CMS, preto niektoré nastavenia si užívateľ vie zmeniť na stránke, a teda mali by sa zmeniť aj v tom súbore, takže nutné to je. Cez ten INI formát som to práve nechcel použiť, lebo by si obsah vedel ktokoľvek zistiť (viz. vyššie, ale Chro mi poradil ako nato). Ohľadom tých boolean - ja by som to riešil úplne inak ako som napísal, nakoľko ten skript som našiel na webe a má slúžiť len ako ukážka. Vďaka za rady :)

Chro:
Vďaka, o tom som vôbec nevedel, skusim sa s tým pohrať a dám vedieť, keby bol nejaký problém.

btw: skúšal som nájsť nejaké funkcie na úpravu jedného riadku (resp. jednej hodnoty) v INI súbore na stránke http://php.net/manual/en/function.parse-ini-file.php v komentároch, väčšina z nich ale prepíše celý súbor, takže by som musel uložiť do INI všetky hodnoty nanovo.
Joker
Profil
väčšina z nich ale prepíše celý súbor, takže by som musel uložiť do INI všetky hodnoty nanovo.
Přesně tak, načtou se hodnoty ze souboru, změní to co je potřeba a všechno se to uloží tak, aby to přepsalo ten starý soubor.

Vzhledem ke způsobu uložení souborů na disku není možné upravovat vnitřek souboru (funkce, které se tváří že to umí, dělají právě to, že načtou soubor, upraví načtený obsah a starý soubor přepíší tím obsahem).
Chro
Profil
Ap0:
Ta funkce by mohla vypadat takto, ale nejsem žádný PHP guru, jsou zde schopnější bastlíři.
<?php
//funkce pri existenci souboru, jeho uspesnem otevreni a ulozeni vraci TRUE, jinak FALSE

function rewrite_or_create_ini($soubor, $klic, $hodnota, $kdyz_klic_neexistuje_vytvor_novy = FALSE)
{
if (file_exists($soubor))
{
$obsah = file($soubor, FILE_IGNORE_NEW_LINES);
if ($obsah === FALSE)
{
return FALSE;
}
}
else
{
return FALSE;
}
$navesti = FALSE;
foreach ($obsah as $index => $radek)
{
if (substr_count($radek, '=') === 1)
{
list($klic2) = explode('=', $radek);
if (trim($klic2) === $klic)
{
$obsah[$index] = $klic.' = "'.$hodnota.'"';
$navesti = TRUE;
break;
}
}
}
if (!$navesti && $kdyz_klic_neexistuje_vytvor_novy)
{
$obsah[$index + 1] = $klic.' = "'.$hodnota.'"';
}
$obsah_novy = implode(PHP_EOL, $obsah);
if (file_put_contents($soubor, $obsah_novy, LOCK_EX))
{
return TRUE;
}
else
{
return FALSE;
}
}

//priklad 1: prepis klic pokud existuje, jinak nic
if (rewrite_or_create_ini('nastaveni.ini.php', 'admin_mail', 'pepa123@nic.cz'))
{
echo 'OK';
}
else
{
echo 'CHYBA';
}

//priklad 2: prepis klic pokud existuje, kdyz neexistuje, pridej ho
if (rewrite_or_create_ini('nastaveni.ini.php', 'admin_tel', '777123456', TRUE))
{
echo 'OK';
}
else
{
echo 'CHYBA';
}
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: