piątek, 4 września 2009

Kodowanie znaków amfphp & mysql

Przechodząc od razu do rzeczy, kodowanie bazy i tabel należy ustawić na utf_polish_ci - jeśli aplikacja będzie używała jedynie języka polskiego, jeżeli nie utf_general_ci - natomiast w serwisach phpowych łączyć się z bazą danych w następujący sposób:

mysql_connect( $host, $user , $pass );
mysql_select_db( $dbase ); 

@mysql_query("SET NAMES 'utf8';");
@mysql_query('SET CHARACTER SET utf8;');
 Dzięki mooska za refresh :D

W bramce komentujemy zmianę kodowania w locie. Tutaj nam się to nie przyda ;-)

[AS3] Walidacja e-maila w 2 linijkach

To nie żart :) Wystarczy posłużyć się tym kodem:

var regexp : RegExp = new RegExp( '^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4}) , 'i' ) ;
regexp.test( emailText.text ) ;

Zapis logów do pliku w PHP

Ostatnio napisałem sobie Loggera w PHP. Prosta aczkolwiek bardzo przydatna klasa. Poniżej zamieszczam pełny kod.

<?php
define( 'LOGGER_NEW_LINE' , "\r\n" ) ;

class Logger
{
/**
* Jedyna instancja klasy
* @var Logger
*/
private static $_instance = null ; 

/**
* Zwraca jedyną instancję klasy
* 
* @return Logger
*/
public static function getInstance()
{
if( is_null( self::$_instance ) )
{
self::$_instance = new Logger() ;
}

return self::$_instance ;
}

private $absolute_path ;
private $logs_path ;
private $date ;
private $log_file ;

/**
* W konstruktorze następuje połaczenie z bazą danych.
* 
* @return Logger
*/
private function __construct()
{
$this->absolute_path = dirname( __FILE__ ) . '/' ;
$this->logs_path = $this->absolute_path . 'logs/' ;
$this->date = date( 'Y_m_d' ) ;
$this->log_file = $this->logs_path . 'logs_' . $this->date . '.log' ;

$this->clearOldLogs( 5 ) ;
}

/**
* Usuwa stare pliki logów
* @return unknown_type
*/
private function clearOldLogs( $maxHistory )
{
$files = glob( $this->logs_path.'*.log' ) ;

$this->log( $files , __FUNCTION__ , __CLASS__ , __FILE__ , __LINE__ ) ;

// przerwanie usunięcia jeśli plików jest zbyt mało
if( sizeof( $files ) <= $maxHistory )
return ;

for ($i = 0; $i < sizeof( $files ) - $maxHistory; $i++ )
{
unlink( $files[ $i ] ) ;
}
}

/**
* Zapis danych do pliku
* @param $data        Dane do zapisania w logu
* @param $function    Zawsze jako parametr podawać __FUNCTION__
* @param $class    Zawsze jako parametr podawać __CLASS__
* @param $file        Zawsze jako parametr podawać __FILE__
* @param $line        Zawsze jako parametr podawać __LINE__
*/
public function log( $data , $function , $class = null , $file = null , $line = null )
{
ob_start( $log_str ) ;
echo date( 'H:i:s' ) , '    ' , $class , '::' , $function , '    in    ' , $file , '    on line    ' , $line , LOGGER_NEW_LINE ;
var_dump( $data ) ;
echo LOGGER_NEW_LINE , LOGGER_NEW_LINE ;
$log_str = ob_get_contents() ;
ob_end_clean() ;

$log_str = str_replace( array( "\r\n" , "\n" ) , LOGGER_NEW_LINE , $log_str );
file_put_contents( $this->log_file , $log_str , FILE_APPEND ) ;
}
}

?>

A o to przykład użycia:

Logger::getInstance()->log( $someData , __FUNCTION__ , __CLASS__ , __FILE__ , __LINE__ ) ;

Logger zapisuje dane w formie wyświetlanej przez funkcję var_dump.

Mapowanie klas w amfphp i AS3

Ponieważ niektórym się zapomina - mi w sumie też - dodawać magiczną linijkę w klasach VO postanowiłem napisać tego posta. Potraktujcie to jako how-to. Pomijam wszelkie zbędne linijki kodu jak includy, importy, pakiety, itp :)

Zacznijmy od kodu w PHP:
  • klasa obiektu VO
class UserVO
{
public $_explicitType = 'vo.UserVO' ;

public $login ;
public $pass ;
}
  • klasa serwisu amfphp
class User
{

public function getUserData()
{
$user = new UserVO() ;
$user->login = 'myLogin' ;
$user->pass = 'myPass' ;
return $user ;
}
}
Z tego co widać jest to bardzo prosty kod. Metoda getUserData zwraca na sztywno obiekt klasy UserVO. Uwagę należy zwrócić na właściwość $_explicitType. Tutaj wpisujemy alias jakiego będziemy używać po stronie flasha dla danej klasy w amfie.

Pora na kod AS:
  • odpowiednik phpowej klasy UserVO
public class UserVO
{
public var login : String ;
public var pass : String ;
}
  • niezbędny kod do pobrania obiektu UserVO
registerClassAlias( 'vo.UserVO' , UserVO ) ; 

var nc : NetConnection = new NetConnection ;
function result( o : Object ) : void
{
var user : UserVO = o as UserVO ;
trace( user ) ;
}
nc.call( 'User.getUserData' , new Responder( result , null ) ) ;
Ważna rolę odgrywa tutaj metoda registerClassAlias która odpowiada za rejestrację aliasu użytego w klasie UserVO, a tym samym prawidłowe mapowanie przesłanych danych na obiekt UserVO we flashu.