SQLite3 a pár tipů pro vaše aplikace
Pokud převádíte vaše aplikace na použití SQLite databáze v PHP, mám pro vás pár poznatků.
Používejte PDO SQLite, nikoliv sqlite_ funkce
PHP obsahuje dvě sady funkcí pro práci s SQLite databází, jedna sada funkcí začíná na sqlite_ a druhá je implementována formou PDO. Použijte rozhodně PDO, podporuje totiž SQLite verze 2 i 3, s tím, že verze 3 již neobsahuje tolik kritických a nepříjemných bugů jako verze 2.
Vlastní sada funkcí sqlite_ je v praxi téměř nepoužitelná, podporuje jen SQLite2.
SELECT uzamyká celou tabulku
Představte si, že máte následující kód:
SELECT * FROM table LIMIT 0,1 UPDATE table SET id=1 WHERE ...
Prostě triviální kód, kde z tabulky něco načtete přes SELECT a následně na tabulku uděláte UPDATE. Nebude to fungovat.
SQLite3 to nepovoluje, po SELECTu je tabulka uzamčena dokud neprovedete kompletní fetch() předchozího dotazu nebo zavření resource dotazu. Můžete to udělat třeba pomocí funkce unset($resource).
Pokud máte SELECT na více položek a v cyklu děláte UPDATE, jediná slušná možnost jak z tohoto problému ven je v databázovém layeru zavolat funkci fetchAll(), načíst veškeré hodnoty z tabulky do paměti, resource uzavřít, a v cyklu již dělat pouze UPDATE.
Je to opravdu velice nepříjemné omezení, ale SQLite3 je takto primitivní…
VIEW neumí update / insert / delete, TRIGGER na VIEW ale ano
SQLite3 umí vytvořit VIEWs, nicméně, nelze na nich provádět UPDATE, DELETE a INSERT příkazy. Naštěstí se to dá obejít pomocí TRIGGERu s parametrem INSTEAD OF.
Takže můžete psát třeba následující:
CREATE TRIGGER foto_users_delete INSTEAD OF DELETE ON foto_users BEGIN DELETE FROM forum_users WHERE username = OLD.username; END;
Prosim,
jak se vyresi ceske razeni? Nyni mi konci Č, Š... na konci seznamu
PHP 5.3.1 a sqlite3 3.6.neco