Category Archives

19 Articles

Jak na to: SQL injection, magic_quotes_gpc, addslashes() a stripslashes()

V názvu článku jsem vyjmenoval slova, která jsou strašákem nejednoho PHP programátora. Strašák to je ale pouze uměle vytvořený, vycházející z neznalosti problematiky.

Dost často se ve spojení s SQL injection (typ útoku hackera) zmiňuje PHP konstanta magic_quotes_gpc. Prý, že pokud je zapnutá, tak se dá SQL injection předejít. A víte, že od PHP 5.3 bude standardně magic_quotes_gpc vypnutá?

Znamená to, že poté budou SQL dotazy napadnutelné pomocí SQL injection? Ale vůbec ne.

Konstanta magic_quotes_gpc totiž s ochranou SQL injection nemá v podstatě nic společného. Pouze zde existuje průsečík v možnosti jejího využití. Proto ji neznalí programátoři začali přisuzovat větší váhu, než má. Váha magic_quotes_gpc je samozřejmě nulová, zvláštně, když od PHP 5.3 bude vypnutá a v PHP 6 zanikne úplně.

Vysvětleme si tedy, oč jde. SQL injection je vážný problém.

MySQL: Pokud záznam neexistuje, vytvoř nový. Jinak původní aktualizuj

by Zdeněk Večeřa 7 Comments

Typický příklad. Máme tabulku, kam ukládáme nějaké záznamy o činnosti uživatele. Tentokrát třeba návštěvu vlákna ve fóru, spolu s časem a počtem příspěvků ve vláknu.

Pokud takový záznam neexistuje (vázaný na ID uživatele a ID vlákna), tak vytvoříme nový záznam (INSERT), jinak provedeme aktualizaci záznamu (UPDATE), tedy čas a počet příspěvků.

Nabízí se několik možností, jak tento proces provést.

Možnost A

  1. Zjistit, jestli záznam existuje (SELECT COUNT(*)…)
  2. Pokud existuje, provést aktualizaci (UPDATE)
  3. Pokud neexistuej, vložit nový (INSERT)

Všetři tři kroky uzavřeme do stransakce (viz Jakub Vrána).

Možnost B

  1. Provést aktualizaci (UPDATE)
  2. Zjistit počet ovlivněných řádků (mysql_affected_rows())
  3. Pokud „nula“ (záznam neexistuje), tak provedeme vložení nového (INSERT)

MySQL: Jak překopírovat/přesunout řádky do jiné tabulky?

by Zdeněk Večeřa 2 Comments

Možná jste někdy narazili na potřebu v rámci jedné databáze překopírovat řádky z jedné tabulky do tabulky druhé. Nabízí se obstrukční řešení, kde získáme pomocí SELECT všechny položky, poté výsledky proženeme skrz while cyklus a mysql_fetch_array, a v každém průchodu cyklu provést INSERT. Případně si takový INSERT „poskládat“ a provést jen jednou; zde ale pozor na případný limit ve velikosti dotazu.

Takový způsob by byl samozřejmě zdlouhavý a chybný. Existuje naprosto jednoduché a elegantní řešení.

phpMyAdmin 3.0.1: blesková správa MySQL databáze

Při vývoji většinou pracuji přímo s databází na webhostingu (přes vzdálený přístup). Pokud je vyvíjená aplikace přístupná pro úzký okruh testerů, je daleko snazší, když webová aplikace využívá stejnou databázi, a to jak z localhostu, tak i přímo na serveru. Vždy mám totiž přístup ke stejným datům.

Proto nějaká lokální databáze, databáze na serveru, synchronizace, atp., jsou pro mě spíše zdržování. Abych si usnadnil práci a nemusel se připojovat na phpMyAdmina na serveru, využívám u sebe na localhostu lokální instalaci phpMyAdmin. Instalace je ale dosti nadnesené slovo. Stačí stáhnout, rozbalit, nastavit pět hodnot a spustit.

Doposud jsem využíval phpMyAdmin ve verzi 2.9.2. Nyní jsem přešel na phpMyAdmin 3.0.1.1. A co že přináší? Nejmarkantnější rozdíl oproti předchozí používané verzi je v rychlosti. Ta se totiž zvýšila, ale rapidně.

Hostmonster.com: přístup přes více účtů do phpMyAdmin (MySQL)

Pokud využíváte webhosting Hostmonster.com, možná jste narazili na nepříjemnost týkající se nemožnosti přístupu k phpMyAdminovi přes více uživatelských MySQL účtů. Hostmonster sice přes administraci cPanel umožňuje vytváření vlastních databází, uživatelů a přidělování práv. Můžete propojit jednotlivé uživatele a databáze, ale ke všem databázím můžete přistupovat pouze přes standardní phpMyAdmin s hlavním účtem do cPanelu.

Spravujete-li více webů – projektů, neobejdete se bez nutnosti poskytnout přihlašovací údaje do databáze dalším lidem, například programátorům či správcům. A zde právě nastává kámen úrazu. Je tedy zcela nemyslitelné, abyste hlavní heslo poskytli dalším uživatelům. Naštěstí existuje řešení, jak na Hostmonster.com zpřístupnit phpMyAdmin pro více uživatelských účtů MySQL databáze.

MySQL: Jak získat poslední vložené ID?

Když už zase psát, tak ať je to užitečné.

Určitě jste někdy při práci s databází (MySQL) chtěli zjistit ID nového prvku, který jste vložili přes příkaz INSERT. PHP nabízí funkci mysql_insert_id(), která přesně toto umožňuje. Vrátí generovanou hodnotu ID posledního příkazu INSERT. Je tedy nutné, aby se funkce mysql_insert_id() nacházela bezprostředně za dotazem s příkazem INSERT.

Tabulka musí obsahovat sloupec s nastaveným AUTO_INCREMENT. Hodnotu vloženého ID můžete také zjistit přímo přes SQL dotaz. Stačí použít funkci LAST_INSERT_ID().