Myslíš GDBM? A na odkaz
http://php.net/manual/en/book.dba.php
ses už díval? Jsou tam i příklady.
Doporučuji datový soubor uložit do podadresáře s právy 777 (obvykle stačí 707) a do něj přidat blokující .htaccess, aby tam nikdo nelezl.
Myslím SQLite.
Na tu stránku jsem se zběžně koukl.
Nastavování práv a .htaccess jsem ještě nepoužíval.
Přístup k datům SQLite může být prakticky stejný jako u MySQL. V podstatě se liší jen v otvírání databáze a v dostupných funkcích.
Ohledně struktury dotazu SQL si troufám tvrdit, že SQLite toho umí víc, ale funkcí má méně než MySQL. Nevzpomínám si však, že by mi nějaká důležitá funkce chyběla.
Otvírání SQLite je velmi jednoduché:
$db=new PDO('sqlite:adresar/data.sqlite');
a pak už s objektem $db zacházíš podobně jako s MySQL.
Jen bych proti MySQL doporučil používat parametrizované dotazy. Aplikace se tím hodně zjednoduší, protože v klidu můžeš zrušit všechny ochrany proti SQL injection. Odpadne hromada "zbytečného" kódu PHP.
Co to znamená "parametrizované dotazy"? Vstup dat dělám já skrz zvláštní stránky, které si generuju. Jediný normální vstup je forum.
Parametrizované dotazy? SQL dotaz pak vypadá třeba takto:
INSERT INTO sds (plyn_imp,plyn_celkem,plyn_cena,plyn_aktual) VALUES (?,?,?,?);
a při jeho spouštění mu přidáš pole se seznamem parametrů. Výhodou je, že se to samo vypořádá se zlobivými znaky, jako např. s uvozvkami, apostrofy a různými paznaky. Prostě je do databáze normálně uloží. Přitom v běžném SQL dotazu by nadělaly značnou paseku.
Jak tedy bude vypadat kousek kódu, když mám DB pokus.sqlite, v ni tabulku prvni se dvěmi sloupci id, popis a chtěl bych tam vložit jeden řádek a pak celou tabulku vypsat?
http://php.net/manual/en/book.pdo.php
Už mi něco funguje, ale narazil jsem na problém:
Mám tabulku týmů ID, název ....
volám stránku: zapis.php?kdo=9&skym=1&datum=2012-01-08 18:00
kdo ...ID domácího týmu
skym ... ID hostujícího týmu
Chci z tabulky týmů přečíst názvy týmů a uložit si je do proměnných
$domácí a $hoste.
Jak to udělat?
Tak především: Pro zápis do databáze bys měl používat metodu POST. Zvykni si na to.
Na přečtení záznamů z databáze se používá SELECT.
SELECT tkdo.jmeno AS domaci, tskym.jmeno AS hoste, datum FROM zapas JOIN tym AS tkdo ON kdo=tkdo.id JOIN tym AS tskym ON skym=tskym.id;
Píšu to z hlavy, bez testování, po půlnoci, bez záruky.
Zkusil jsem jednak jeden select pro oba údaje najednou a pak i dva samostatné selecty, ale nevrací mi to data. Ona asi chyba nebude ve vlastním selectu, jako spíše v použití toho PDO :-(
Proč pro zápis používat POST?
Zjednodušeně: Když chci data získat, tak to je anglicky GET. Když chci něco poslat, tak je to POST. Prohlížeče mají ochranu proti double-postu, ale ne proti double-getu. Data získaná přes GET se cachují, ale data přes POST ne.
A jak používáš PDO? Je tam více metod: fetch(), fetchAll(), fetchColumn()... Na stránce
http://www.php.net/manual/en/pdo.query.php
máš hromadu příkladů.
foreach ($dbh->query('select k.jm_tymu,s.jm_tymu from tymy as k,tymy as s where k.tym=$kdo and s.tym=$skym;') as $row)
{
$domaci=$row[0];
$hoste=$row[1];
}
V takových případech obvykle pomáhá print_r()
foreach ($dbh->query('select k.jm_tymu,s.jm_tymu from tymy as k,tymy as s where k.tym=$kdo and s.tym=$skym;') as $row)
{
print_r($row);
}
Ten SELECT máš špatně. A názvy jsou také divné. Nauč se používat jednotné číslo pro pojmenování tabulek a zbav se pleonasmů v názvech sloupců. Místo `tymy.tym` a `tymy.jm_tymu` by názvy `tym.id` a `tym.jmeno` vypadaly mnohem lépe.
Nauč se používat JOIN, protože tak jak to máš to udělá kartézský součin a teprve ve výsledku se to prohrabává. Bude to líné.
Ty ten zápas nemáš v tabulce? To se potom špatně radí.
Select je v pořádku, v mysql funguje.
V tabulce plánovaných zápasů samozřejmě je. Já potřebuju jenom si načíst názvy týmů, abych je vyplnil do zápisu:
http://hla.borec.cz/zapis.php?kdo=9&skym=1&datum=2012-01-08%2018:00:00
A proč nefunguje tohle:
foreach ($dbh->query('select jm_tymu from tymy where tym=$kdo;') as $row)
{
$domaci=$row[0];
print_r($row);
}
Fakt, že SELECT funguje, ještě neznamená, že je správně. Kdyby sis spustil EXPLAIN, pochopil bys proč.
A proč tam potřebuješ do zápisu názvy týmů, když už je máš v tabulce tymy?
Ten poslední SELECT ti nefunguje, protože ho máš v apostrofech a snažíš se v něm dělat substituci proměnné $kdo.
Super. S uvozovkama to funguje :-)
Potřebuju do zápisu napsat jména týmů, které spolu hrají. Ten zápis si časomíra vytiskne a pak ho vyplňuje při vlastním utkání.
Však na to je ten SELECT, který jsem ti psal včera. Vybere zápisy utkání a do nich doplní názvy týmů. Zkoušel jsem to na své databázi a jede mi to.
Dostal jsem se už trošku dál, ale mám problém s tříděním. Např. na stránce http://hla.wz.cz/zapis.php?kdo=14&skym=9&datum=2012-01-12%2020:00 jsou hráči "Š" až na konci. Jak zajistit "české" pořadí?
Národní řazení v SQLite chybí. Možná proto, že by zabralo moc místa v knihovně. Spoléhá se na schopnosti hostitelského jazyka, v daném případě PHP.
Dá se však v PHP napsat doplněk, který písmena s háčky upraví na spřežky a čárky odstraní. Takový řetězec by se už řadil správně. V dotazu by přibyl jeden virtuální sloupec, podle kterého by se řadilo. Pokud by byl zájem, můžu něco takového zkusit vyrobit.
Přinejhorším se dá použít iconv('UTF-8', 'ASCII//TRANSLIT',$string), která háčky a čárky pro účely řazení odstraní. Vypisovat se však budou i s nabodeníčky. Neřeší to ale problém s 'ch'.
Jak moc je to složité? Znamená to v podstatě napsat proceduru nebo funkci, která řetězec "přepočte" na něco, co se dá jednoznačně třídit?
Ne, přepočte řetězec na něco, podle čeho se dá jednoznačně řadit. Kdysi dávno jsem si něco takového dělal v assembleru, tak by to mohlo jít i v PHP. Mám však takové tušení, že by na to v PHP měla být nějaká funkce.
Zkusil jsem v PHP sort(&$pole), ale také řadí špatně. Možná mám jen špatně nastavený jazyk. Systémový sort řadí na jedničku, ale ten v PHP nemůžeme použít.
Standardně to lze udělat přes setlocale(), které pro použití v sort/asort/rsort/ksort() vyžaduje SORT_LOCALE_STRING jako druhý parametr. Tohle řešení je podle dokumentace možné až od php 4.4.0, ale protože se mi ve vlákně nepodařilo najít, ke které verzi se diskuse vztahuje, raději píšu.
A případně vždycky zbývá řešení přes usort(), i když to samozřejmě bude opruz :)
Dlouho mi to nechtělo fungovat, ale tohle zdá se jede, i když to není úplně ono:
<?php
setlocale(LC_ALL, 'cs_CZ');
$a=Array("Seznam","Šalomoun","Sára","Tomáš","Dana","Chrudim");
sort(&$a,SORT_LOCALE_STRING);
print_r($a);
?>
[0] => Dana
[1] => Chrudim
[2] => Šalomoun
[3] => Sára
[4] => Seznam
[5] => Tomáš