Rekurze je sexy!
Rekurze je rozhodně velice sexy, protože se s minimem kódu dají dělat mraky operací velice jednoduše :-)
function copyIt($a,$b){ $c = scandir($a); foreach($c as $d) { if ($d != '.' && $d != '..') { $e = $b.$d; $f = $a.$d; if (is_dir($f)) { mkdir($e); copyIt($f.DIRECTORY_SEPARATOR,$e.DIRECTORY_SEPARATOR); } elseif (is_file($f)) copy($f, $e); } } }
Otázka pro PHP začátečníky: víte, co tento kód dělá?
Zend’s PHP 5 Coding Contest - učíme se PHP z chyb ostatních
Na Interval.cz vyšel můj článek Zend’s PHP 5 Coding Contest - učíme se PHP z chyb ostatních. Doporučuji jej k přečtení, dívám se v něm na 5 nejhorších aplikací této soutěže, a je to psané docela zajímavým stylem.
Zend’s PHP 5 Coding Contest - více praxe, méně teorie
Na Interval.cz vyšel můj článek Zend’s PHP 5 Coding Contest - trochu méně teorie a více praxe, který popisuje hned 6 užitečných aplikací z této soutěže.
Zend’s PHP 5 Coding Contest - PRADO - Interval.cz
Na Interval.cz vyšel můj článek Zend’s PHP 5 Coding Contest - PRADO framework, který rozhodně doporučuji k přečtení, pokud PRADO neznáte.
Zend’s PHP 5 Coding Contest - Interval.cz
Na Interval.cz vyšel můj článek o Zend’s PHP 5 Coding Contest, první ze série pěti článků. S Vilémem Málkem jsem domluven i na napsání několika článků o JEditu a PHPEclipse.
PHP problém s mail()
Tedy, on to možná není ani tak problém s PHP, jako takový zajímavý problém (či bug?) skriptu. Podívejte se na tento kód:
$to = 'info@hulan.info'; $subject = 'New password requested'; $message = 'Hello Radek Hulan,'."\n". 'You have requested to have a new password '."\n". 'assigned to your account in the '."\n". 'discussion forum at http://forum.blogcms.com/. '."\n". 'Your new password is: abcdefgh'; $headers = 'From: BLOG:CMS'."\n". 'Date: Sat, 13 Nov 2004 12:26:14 +0100'."\n". 'MIME-Version: 1.0'."\n". 'Content-transfer-encoding: 8bit'."\n". 'X-Mailer: PunBB Mailer'."\n". 'Content-Type: text/plain; charset=utf-8';
A nyní tento email pošleme:
mail($to, $subject, $message, $headers);
Vtip je v tom, že u mě na SUSE 9.1 s PHP 5.0.2 to email posílá, na xhost.cz s PHP 4.3.9 to email, rovněž posílá, ale na www.tojeono.cz s PHP 5.0.2 to email nepošle. Řešil jsem to s Ondřejem Svobodou asi hodinu, než nám to došlo, a přitom je to tak triviální…
A víte proč?
PHP: convert named entities to decimal Unicode
This script was written to overcome validation problems with RSS 0.9/1.0/2.0
and Atom 0.3 feeds which may not contain (X)HTML entities, otherwise widely
used. Usage is very simple, function entity_to_decimal_value()
will return
a Unicode encoded string, with entities it does not recognise replaced for
spaces.
There are also other two useful functions, for converting (X)HTML entities
back to their original representation (makes <
again <
), and for Unicode
decoding of an URL string.
/* convert HTML entities back */ function unhtmlentities ($string) { $trans_tbl = get_html_translation_table (HTML_ENTITIES); $trans_tbl = array_flip ($trans_tbl); return strtr ($string, $trans_tbl); } /* decodes URL into Unicode string */ function unicode_decode($txt) { $txt = ereg_replace('%u0([[:alnum:]]{3})', '\1;',$txt); $txt = ereg_replace('%([[:alnum:]]{2})', '\1;',$txt); return urldecode($txt); }
GeSHi - obarvěte si svoje zdrojáky
Včera v noci, poté, co jedna milá kamarádka odešla domů k rodičům (musí zítra do školy), jsem se náhodou dostal ve dvě hodiny ráno na web GeSHi. GeSHi je prima věc, barevná. GeSHi umí obarvit automaticky Vaše zdrojáky v actionscript, ada, apache, asm, asp, bash, c, caddcl, cadlisp, cpp, css, delphi, geshi, html4strict, java, javascript, lisp, lua, nsis, oobas, pascal, perl, php-brief, php, python, qbasic, sql, vb, visualfoxpro, xml.
A ona GeSHi nejenom barví, ale rovněž, pokud ji k tomu mírně přinutíte, udělá třeba pro PHP funkce automaticky odkazy na manuál PHP. Dokonalé. Stejně se dá přinutit i k odkazům na HTML či CSS.
Použití je potom triviálně jednoduché, místo <pre>
zadáte <pre language>
.
Napsal jsem si k tomu samozřejmě plugin pro BLOG:CMS, pod názvem NP_GeSHi, funguje dvěma způsoby, buď při ukládání článku (parse-and-save), nebo online (realtime), používám přitom tu nej-geniálnější funkci PHP, tedy preg_replace_callback
.
include('geshi.php'); class NP_Geshi extends NucleusPlugin { function parseString(&$content) { $keys=array('body','more'); foreach ($keys as $key) $content[$key] = preg_replace_callback ( '/<pre\s(.*?)>(.*?)<\/pre>/si', array(&$this,'replaceString'), $content[$key] ); } function replaceString($r){ global $DIR_PLUGINS; $geshi = new GeSHi($r[2],$r[1],$DIR_PLUGINS."geshi/"); $geshi->enable_classes(); $geshi->set_header_type(GESHI_HEADER_PRE); $geshi->set_overall_class('code'); $geshi->set_link_target($this->_linktarget); return $geshi->parse_code(); } } // NP_Geshi
Databázový layer
Představuji k volnému použití (licence GNU GPL) jednoduchý dababázový layer, který je určen pro MySQL 3.23 až 4.0 (mysql), MySQL 4.1 (mysqli), SQLite a PostgreSQL.
Tento layer je záměrně psán neobjektově. Proč? Je určen pro úpravu starých skriptů, které jsou natvrdo psány pro MySQL 4.0, aby co nejdříve fungovaly s DB-layerem (na libovolné open-source databázi).
Názvy funkcí layeru jsou navrženy tak, aby byly shodné se syntaxí MySQL funkcí,
jen místo mysql
budete psát sql
, tedy například místo mysql_connect
budete
psát sql_connect
. Teoreticky je tak možné na Vašem skriptu udělat
hromadný search-and-replace slov mysql_
na sql_
,
a Vaše aplikace by měla fungovat s DB-layerem.
Pro nový vývoj je samozřejmě vhodnější použít DB-layer objektový, uvedu jej zde zítra.
Zdrojové kódy layeru jsou zde.
Použití layeru pro MySQL:
Typické použití pro MySQL 4.1 bude spočívat ve vytvoření souboru config.php
s
tímto obsahem:
Příklad pro SQLite:
Prefix tabulek:
Uvedený skript počítá rovněž s prefixem tabulek. Ten je velice důležitý, typicky máte na web-hostingu povolenou jen jednu MySQL/PGSQL databázi, a potom je nezbytně nutné jednotlivé instalace stejné aplikace odlišit právě prefixem v názvech tabulek.
Použití tohoto skriptu?
Náš index.php
může vypadat například takto, a bude fungovat na
MySQL 4.0, MySQL 4.1, SQLite a PostgreSQL:
Funkce SQLite se rozšiřují pomocí PHP
SQLite je ještě lepší, než jsem čekal. Nejenom má v 200KB podporu pro triggery a views, ale její SQL příkazy a funkce je díky integraci s PHP možno rozšiřovat o libovolné callbacky (na PHP funkce).
Pokud tedy SQLite nemá funkci UNIX_TIMESTAMP()
, která převede
string na UNIX-like datum (počet sekund od 1.1.1970), tak si ji nadefinujete
v PHP, registrujete pro SQLite, a používáte ji potom zcela normálně ve Vašich
SQL příkazech.
Například takto můžete SQLite rozšířit o podporu pár funkcí, které oproti MySQL nativně nemá:
sqlite_create_function($db,'UNIX_TIMESTAMP','strtotime',1); sqlite_create_function($db,'NOW','time',0); sqlite_create_function($db,'DAYOFMONTH','_day',1); sqlite_create_function($db,'MONTH','_month',1); sqlite_create_function($db,'YEAR','_year',1); sqlite_create_function($db,'SUBSTRING','substr',3); function _day($time) { return date("d",strtotime($time)); } function _month($time) { return date("m",strtotime($time)); } function _year($time) { return date("y",strtotime($time)); }