PHP » MyEgo.cz - Radek Hulán webzine

MyEgo.cz

home foto blogy mywindows.cz kontakt

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

PHP 07.01.2005

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

PHP 24.12.2004

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

PHP 10.12.2004

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

1 příspěvek PHP 26.11.2004

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()

7 příspěvky PHP 13.11.2004

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 <info@hulan.info>'."\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

PHP 10.11.2004

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 &lt; 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})', '&#x\1;',$txt);
  $txt = ereg_replace('%([[:alnum:]]{2})', '&#x\1;',$txt);
  return urldecode($txt);
}

GeSHi - obarvěte si svoje zdrojáky

8 příspěvky PHP 09.11.2004

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(&#38;$content) {
  $keys=array('body','more');
  foreach ($keys as $key)
  $content[$key] = 
   preg_replace_callback (
	'/&#60;pre\s(.*?)&#62;(.*?)&#60;\/pre&#62;/si',
	array(&#38;$this,'replaceString'),
	$content[$key] );
}
 
function replaceString($r){
  global $DIR_PLUGINS;
  $geshi = new GeSHi($r[2],$r[1],$DIR_PLUGINS."geshi/");
  $geshi-&#62;enable_classes();
  $geshi-&#62;set_header_type(GESHI_HEADER_PRE);
  $geshi-&#62;set_overall_class('code');
  $geshi-&#62;set_link_target($this-&#62;_linktarget);
  return $geshi-&#62;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:

<?php
include ('db.php');
$SQL_HOST='localhost'; // adresa DB
$SQL_USERNAME='root'; // uzivatel
$SQL_PASSWORD=''; // heslo
$SQL_DATABASE='test'; // nazev databaze
$SQL_TYPE=_MYSQL41; // typ databaze
$SQL_PREFIX=''; // prefix tabulek
?>

Příklad pro SQLite:

<?php
include ('db.php');
$SQL_DATABASE='/Dev/www/test.db'; // nazev souboru SQLite
$SQL_TYPE=_SQLITE; // typ databaze
$SQL_PREFIX=''; // prefix tabulek
?>

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:

<?php
// DB layer
include('config.php');
// pripojeni k DB
sql_connect(true);
// shutdown funkce
register_shutdown_function('sql_disconnect');
// vlastni kod
$query = sql_query( 'select * from '.sql_table('test') );
while ( $obj = sql_fetch_object($query) ) {
  // zpracovani vysledku
}
sql_free_result($query);
?>

Funkce SQLite se rozšiřují pomocí PHP

PHP 23.10.2004

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));
}
Banan.cz