Category Archives

38 Articles

Rychlost: intval() vs. mysql_real_escape_string()

by Zdeněk Večeřa 1 Comment

intval()

for ($i = 0 ; $i < 1000 ; $i++){
  $num = intval(rand());
}

Doba zpracování: 0,0008 s

mysql_real_escape_string()

for ($i = 0 ; $i < 1000 ; $i++){
  $num = mysql_real_escape_string(rand());
}

Doba zpracování: 0,0035 s

Pro ošetření integer hodnot používejte intval(), pro řetězce mysql_real_escape_string().

phpMyAdmin: Wrong permissions on configuration file, should not be world writable!

by Zdeněk Večeřa 1 Comment

Pokud pro správu MySQL databáze chcete využít PHP aplikaci phpMyAdmin, a ona vám hlásí: „Wrong permissions on configuration file, should not be world writable!„, musíte upravit práva souboru (atributy souboru) config.inc.php, který je součástí instalace phpMyAdmin.

Je třeba práva souboru nastavit tak, aby nebylo možné soubor modifikovat zvenčí (nepřidělit právo zápisu pro ostatní). Práva souboru proto změňte například na 0644.

Více o právech se dočtete zde: Přístupová práva v Unixu

Zabezpečení přístupu do adresáře (.htaccess a .htpasswd)

by Zdeněk Večeřa 0 Comments

Pokud chcete do vybrané složky umožnit přístup jen uživatelům, mající login a heslo, můžete tak učinit následovně. Veškeré přístupy budou podléhat http ověření (HTTP autentizace).

Postačí vám webový server Apache, .htaccess a .htpasswd

  1. Vygenerujte hesla pro uživatele (vygenerování .htpasswd); můžete tak učinit například na této adrese: http://projekty.remontsw.eu/htaccess_generator/
  2. Vygenerovaná hesla uložte do  souboru .htpasswd, který umístěte „někam“ na server. Obsah souboru .htpasswd může vypadat například takto:
    liga:MQasRkO.UOKzY
    admin:MQpwCAGbdsh7w
  3. Vytvořte v dané složce, kterou chcete zabezpečit, soubor .htaccess s následujícím obsahem:
    AuthUserFile /ABSOLUTNÍ_CESTA/.htpasswd
    AuthName "Zadej tajné heslo"
    AuthType Basic
    require valid-user

    Včásti AuthUserFile je nutné uvést absolutní (úplnou) cestu k souboru .htpasswd (cesta v rámci disku serveru, ne URL!). Jak cesta vypadá může prozradit proměnná $_SERVER[‚DOCUMENT_ROOT‘], kterou lze vypsat pomocí PHP. Případně pomocí funkce phpinfo();

Postřehy: snažím se přejít z Eclipse PDT na NetBeans (PHP), jsou ale problémy

by Zdeněk Večeřa 5 Comments

Přibližně rok a půl pro vývoj PHP aplikací používám IDE prostředí Eclipse PDT. Výhody IDE nástrojů oproti aplikacím PSPad nebo Intype nebudu zmiňovat (možná příště).

V Eclipse PDT si založíte nový projekt, do kterého přiřadíte soubory. Práce s většími PHP soubory, řekněme okolo 100 kB (cca 3 300 řádků) je ale (aspoň v mém případě) problematická. Eclipse PDT nestíhá. Úpravy textu (zdrojového kódu) jsou pomalé, Eclipse PDT reaguje se zpožděním.

Větší soubory v Eclipse dělají IntelliSense nepoužitelné

IntelliSense (našeptávač – doplňování kódu) taktéž reaguje se zpožděním. Zobrazení IntelliSense v takovém souboru netrvá pár milisekund, ale 2-3 vteřiny, což je pro práci zcela nepoužitelné.

Záchranou je NetBeans?

NetBeans je v tomto naštěstí jiný – „takový lepší“. Hlavně tedy rychlejší. IntelliSense je svižné, stejně tak práce se soubory, úpravy, ukládání aj.

Rok a půl používání Eclipse PDT ve mně ale zanechalo i návyky, kvůli kterým je přechod ke konkurenci složitější. Upravil jsem si barevné zobrazení syntaxe (dle Eclipse PDT), prošel klávesové zkratky, stále mi ale u NetBeans několik vlastností vadí.

V čem je lepší Eclipse oproti NetBeans?

Následující chování NetBeans mi docela vadí:

  1. Vlevo se nachází strom se soubory a projekty. Pokud v Eclipse vyberu soubor „index.php“ a udělám ctrl+c a ctrl+v, nakopíruje se jako kopie s názvem „Copy of index.php“. V NetBeans to bohužel nefunguje. Kopírování funguje, akorát je třeba při vkládání klepnout na složku, do které chci provést vložení (u Eclipse stačí mít označený libovolný soubor z dané složky).
  2. K levému stromu souboru ještě jednou. Eclipse jsem si nastavil tak, že stačí jednou klepnout na soubor a hned se vpravo zobrazí jeho obsah. Divné, ale u NetBeans tato možnost asi není (nenašel jsem).
  3. V Eclipse označím text a klávesovou zkratkou ctrl+k ihned dojde k nalezení dalšího výskytu řetězce v souboru. Nemusím tedy otevírat vyhledávací dialog. NetBeans to neumí.
  4. Pokud mám v Eclipse otevřený odkaz, span, div: <div>text, tak mi za slovem „text“ IntelliSense nabídne uzavření tagu. NetBeans bohužel hloupě nenabídne nic.
  5. Další věc se týká nahrazování. Chci provést nahrazení textu v souborech, vyhledávám pomocí regulárních výrazů. Uvedu tedy regulární výraz a text, kterým se má nahradit. Potud v pohodě. Jenže, před provedením se chci ujistit, jestli bude výsledek OK. Eclipse mi nabídne náhled, jak budou úpravy vypadat. NetBeans nikoli.
  6. Když v komentáři zdrojového kódu uvedu „TODO:“, oba nástroje jej pochopí jako úkol ke splnění. Eclipse ale navíc u čísla řádku zobrazí malou ikonku; na první pohled je vidět, že se musí něco dodělat. NetBeans nezobrazí nic.
  7. Mám proměnnou $test = 5;. Když na ni v Eclipse klepnu kurzorem následovaným klávesovou zkratkou ctrl+shift+j, vytvoří se nad ní komentář, kde k ní uvedu, co potřebuji. NetBeans to asi neumí (jen ve třídě po zahájení psaní komentáře /** a enteru).
  8. V NetBeans mi nefunguje posun horizontálního posuvníku při naklonění kolečka myši doleva/doprava.
  9. Když v Eclipse PDT napíši: <?, tak automaticky dopní php ?>. NetBeans bohužel nedoplní nic.

Napadá váš řešení? Pokud NetBeans výše uvedené chování zvládá, dejte, prosím, vědět do komentářů pod článkem.

PHP: Porovnání rychlosti str_replace() a preg_replace()

by Zdeněk Večeřa 1 Comment

Podívejme se na porovnání rychlosti funkcí str_replace() a preg_replace(), které lze použít pro nahrazení řetězce řetězcem.

$url = 'http://google.com/1/../2/././';

for ($i = 0; $i < 1000000 ; $i++){
str_replace('/./', '/', $url);
}
// Doba běhu: 1.6402 s

for ($i = 0; $i < 1000000 ; $i++){
preg_replace('/(\/\.\/)/', '/', $url);
}
// Doba běhu: 5.0405 s

Pokud chcete jen nahradit řetězec a nepotřebujete využít síly regulárních výrazů, využijte funkci str_replace(). Dle měření zpracování bude až 3× rychlejší než v případě preg_replace().

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)

PHPMailer: Snadné posílání (HTML) e-mailů z PHP

by Zdeněk Večeřa 2 Comments

E-mail, obálka, dopis

Pokud potřebujete z webu, kde běží PHP, posílat e-maily, můžete sáhnout po funkci PHP mail(). Jsou s ní trochu starosti, protože musíte myslet na kódování a nesmíte zapomenout na správné uvedení hlaviček (headers).

PHPMailer: Pomocná ruka při posílání e-mailů

Na pomoc přichází PHP knihovna PHPMailer, která zastřešuje vše okolo posílání e-mailů. Můžete ji využít pro posílání nejen přes funkci mail(), ale můžete e-maily zasílat i skrz existující SMTP server (tedy reálnou e-mailovou adresu).

Kódování a HTML e-maily bez problému

S knihovnou PHPMailer jednoduše vytvoříte HTML e-maily s obrázky a přílohou. Nemusíte se ani obávat, že bude problém s kódováním, jako se stává, když bez znalostí pracujete přímo s funkcí mail(). PHPMailer se o vše postará za vás.

Vydán CKEditor 3.0: Nová generace wysiwyg editoru FCKeditor je tu

CKEditor, FCKEditor

Oblíbil jsem si kvalitní FCKeditor, se kterým je psaní a úprava textů v administraci hračka. Přestože bych mu několik drobností vytknul, tak největší problém vidím v jeho rychlosti. Ano, je rychlý, ale jeho načtení a zobrazení by mohlo být rychlejší.

FCKeditor a jeho 6 let úspěchu

Ani se to nezdá, ale FCKeditor je vyvíjen už šest let a za tu dobu si získal velkou oblibu nejen mezi uživateli, ale i vývojáři. Troufám si tvrdit, že spolu s TinyMCE patří mezi nejoblíbenější a nejznámější open-source editory.

CKEditor 3.0: Nová generace přichází

Šest let stáří FCKeditoru je mírně znát, proto vývojáři poslední téměř dva roky pilně pracovali na další verzi, která získala nové jméno: CKeditor.

Prakticky vzato, CKeditor je pokračování FCKeditoru, takže se nenechte zmást, že by zde byl další produkt.

Proč došlo k přejmenování?

Vývojáři se pro změnu názvu rozhodli kvůli jeho problémové výslovnosti v anglicky mluvících zemích.

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ěď.

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.