May 26 2016

Transakce v MySQL a PHP: Pokud nezavoláte rollback, máte zaděláno na pořádný průšvih

Při práci s transakcemi v MySQL se občas můžeme zamotat do jejich volání. START TRANSACTION považujme za párový příkaz, po kterém by mělo být vždy zavoláno COMMIT nebo ROLLBACK. Jinak máte zaděláno na velký problém.

 

Pokračování článku


Jan 2 2014

Jakub Vrána: Deploy ve Facebooku a nasazování funkcí mezi uživatele

Zajímavá přednáška Jakuba Vrány, tehdy ještě zaměstnance Facebooku, jak se pracuje ve Facebooku s preparables, mcproxy a XHP. Rozpovídal se také o deployi a způsobu nasazování jednotlivých funkcí mezi uživatele.

Pokračování článku


Jul 5 2012

Jak naimportovat hodně velký SQL dump do MySQL?

Třeba pomocí BigDump: Staggered MySQL Dump Importer.


Feb 28 2012

Užitečné on-line nástroje pro webové vývojáře

Výkon webu

https://developers.google.com/pagespeed/

http://www.webpagetest.org

http://tools.pingdom.com

Gzip komprese

http://nontroppo.org/tools/gziptest/

DNS, A, MX, TTL aj.

http://www.who.is/dns/

Pokračování článku


Feb 7 2012

V čem upravovat velké textové SQL dump soubory? (edit big files)

Editace a prohlížení velkých textových souborů (1 GB+) není žádná legrace. Představte si, že máte před sebou textový soubor s SQL dumpem databáze a potřebujete v něm pod Windows něco upravit.

Jestli je soubor v řádu jednotek nebo maximálně desítek megabytů, můžete zkusit český PSPad (v 4.5.6) nebo lépe Notepad++ (v 5.9.6.2).

Pokud ale musíte pracovat s dumpy, které mají stovky megabytů nebo jednotky gigabytů, rovnou na výše dva zmíněné programy zapomeňte. Potřeboval jsem pracovat s dumpem o velikosti cca 700 MB a ani jeden si s ním neporadil (ne že bych čekal něco jiného).

Pokračování článku


Sep 1 2009

UTF-8, MySQL, kódování a PHP funkce pro práci s řetězci: strlen, substr aj.

Možná jste při práci s PHP narazili na problém s UTF-8 kódováním. Doposud jste využívali kódování cp1250 nebo iso-8859-2 a nebyl problém. Okolnosti vás přinutily požívat UTF-8 a najednou bum. Na stránkách se vám chybně vypisují znaky s českou diakritikou a nevíte co s tím.

Jak správně použít UTF-8 a MySQL?

Je třeba dodržet následující pravidla:

  1. Po připojení nastavit kódování, ve kterém bude probíhat komunikace s databázovým serverem:
    mysql_query("SET NAMES 'utf8'");
    nebo 
    mysql_query('SET CHARACTER SET utf8');
    
    Od PHP 5.2.3 a MySQL 5.0.7 raději použijte:
    mysql_set_charset('utf8');
    
    Je to správná a bezpečná varianta
    pro použití mysql_real_escape_string(). Více: 1, 2, 3.
  2. Kódování PHP souborů nastavit na UTF-8 (pozor na počáteční UTF-8 boom znak)
  3. Odesílat hlavičky s UTF-8 kódováním:
    header('Content-Type: text/html; charset=utf-8');
  4. Nastavit UTF-8 kódování v HTML (meta tagy, xml hlavička aj.)
  5. Používat PHP řetězcové funkce, které zvládají UTF-8 (viz dále)

Pokračování článku


Jun 23 2009

MySQL: Rychlost UPDATE sloupce v závislosti na přítomnosti indexů

Nedávno jsme s Lukášem Churým a Ondrou Vašíčkem řešili rychlost operace UPDATE v závislosti na tom, jestli upravovaný sloupec má či nemá nastavený index.

Představte si, že máme v MySQL 5.0 tabulku o několika sloupcích, dva z nich jsou “id” a “xy”. Nad sloupcem “id” je přidělený index. Sloupec “xy” index nemá. Rychlost UPDATE sloupce “xy” trvá nějaký čas.

Otázka zní, jestli UPDATE zabere stejný čas i v případě, kdyby sloupec “xy” měl přidělený index.

Udělal jsem jednoduchý test, který přináší odpověď.

Pokračování článku


May 21 2009

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.

Pokračování článku


May 6 2009

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

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)

Pokračování článku


Apr 8 2009

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

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í.

Pokračování článku