php – functii cu numar variabil de parametri

Pe langa faptul ca parametrii unei functii php pot avea valori predefinite, precum in exemplul urmator :

<?php
    function say( $what = "nothing" )
    {
        echo $what . "\n";
    }
   
    say( "dude" );
    say( );
?>

mai exista posibilitatea de a defini si functii cu numar variabil de parametri in felul urmator:

<?php
    function say( )
    {
        for ( $i = 0; $i < func_num_args(); $i++ )
            echo func_get_arg( $i ) . " ";
        echo "\n";
    }

    say( "test", "another test" );
?>

In cazul cand se alege aceasta modalitate de a pasa parametrii, accesul la parametri se face cu ajutorul functiilor:

Asta inseamna ca putem defini o functie ce poate lua un numar de parametri intr-un caz si alt numar de parametri in alt caz.

Un exemplu practic unde se poate folosi acest feature al php-ului este la definirea functiilor de SET / GET in clase pentru accesul la anumite date private din clasa respectiva. O functie de SET este o functie ce seteaza o valoare privata in clasa, iar o functie de GET este una care ia valoarea unui membru privat din clasa. Se observa ca functia de set trebuie sa ia cel putin un parametru – fiind noua valoare a membrului

    ///set new value
    public function setValue( $newvalue );

iar functia de GET nu ia nici un parametru, dar trebuie sa returneze valoarea ceruta :

    ///get value
    public function getValue( );

la prima vedere aceste functii pot trai si separat si independente, dar exista posibilitatea sa le comansam in una singura cu ajutorul functiilor cu numar variabil de parametri.
Exemplu:

<?php
    /// definesc clasa A
    class A {
        /// membru privat $_id
        private $_id = 0;
       
        /// functie get/set cu numar variabil de parametri
        public function id( ) {
            if ( func_num_args( ) == 0 ) {
                //daca nu este pasat nici un parametru
                //se returneaza valoarea $_id
                return $this->_id;
            } else {
                //altfel, setez $_id cu primu parametru
                //(restul parametrilor se ignora)
                $this->_id = func_get_arg( 0 );
                return TRUE;
            }
        }
    }
   
    //creez o instanta a clasei A
    $a = new A();
   
    //apelez functia id() ca SET
    $a->id( 5 );
   
    //apelez functia id() ca GET
    echo $a->id();
?>

Prin aceasta modalitate, vom defini in clasa doar o singura functie ceea ce va scadea numarul functiilor declarate in clasa si va face clasa mai usor utilizabila.

atat.

Cum facem CSS mai dinamic cu PHP

Se presupune ca in timpul apropiat CSS-ul va suferi ceva modificari si va fi posibil de declarat un fel de variabile/constante si va fi mai usor de adapta css-ul de la un proiect la altul. Pina atunci exista o astfel de solutie: utilizam php-ul pentru a face css-ul mai dinamic, mai variabil si mai comod. Php-ul ne permite sa generam fisiere css, modificind contentul cu functia HEADER :

<?php header('content-type: text/css'); ?>

in asa mod, fisierul apelat, va fi considerat de browser ca fiind de tip css. Si asta ne permite sa scrim cod php in viitorul fisier css.
Si de exemplu vom face asa un fisier : style.css.php

<?php
    header('content-type: text/css');
    if ( isset( $_GET['style'] ) ) {
        switch($_GET['style']){
            case 'blue':
                define('T_WIDTH_CELL',90);
                define('T_PADDING_CELL',10);
                define('T_FONT_SIZE',12);
                define('T_FONT_FAMILY','Verdana,Tahoma,"Trebuchet MS",sans-serif');
                define('T_TH_BKG','e1e9ed');
                define('T_TD_BKG','eef3f5');
                define('T_BORDER_C','c9d7df');
                define('T_TH_C','476678');
                define('T_TD_C','80a2b4');
                break;
            case 'orange':             
                define('T_WIDTH_CELL',120);
                define('T_PADDING_CELL',8);
                define('T_FONT_SIZE',11);
                define('T_FONT_FAMILY','"Trebuchet MS",Verdana,Tahoma,sans-serif');
                define('T_TH_BKG','ffb979');
                define('T_TD_BKG','ffc189');
                define('T_BORDER_C','ffa859');
                define('T_TH_C','9a4900');
                define('T_TD_C','fa7700');
                break;
            case 'green':
                define('T_WIDTH_CELL',120);
                define('T_PADDING_CELL',40);
                define('T_FONT_SIZE',15);
                define('T_FONT_FAMILY','"Tahoma,sans-serif,Trebuchet MS",Verdana');
                define('T_TH_BKG','e2e7c9');
                define('T_TD_BKG','e9edd6');
                define('T_BORDER_C','d4dcb0');
                define('T_TH_C','707c37');
                define('T_TD_C','acbb65');
                break;
            default :
                define('T_WIDTH_CELL',120);
                define('T_PADDING_CELL',40);
                define('T_FONT_SIZE',15);
                define('T_FONT_FAMILY','"Tahoma,sans-serif,Trebuchet MS",Verdana');
                define('T_TH_BKG','cacaca');
                define('T_TD_BKG','d2d2d2');
                define('T_BORDER_C','b9b9b9');
                define('T_TH_C','535353');
                define('T_TD_C','868686');
                break;
        }
       
    }else{
        define('T_WIDTH_CELL',90);
        define('T_PADDING_CELL',10);
        define('T_FONT_SIZE',12);
        define('T_FONT_FAMILY','Verdana,Tahoma,"Trebuchet MS",sans-serif');
        define('T_TH_BKG','e1e9ed');
        define('T_TD_BKG','eef3f5');
        define('T_BORDER_C','c9d7df');
        define('T_TH_C','476678');
        define('T_TD_C','80a2b4');
    }
?>

table.my-table{
    padding:0px;
    margin:0px;
    border-collapse:collapse;
}

table.my-table th{
    width: <?php echo T_WIDTH_CELL;?>px;
    padding: <?php echo T_PADDING_CELL;?>px;
    margin: 0px;
    background:#<?php  echo T_TH_BKG; ?>;
    border:1px solid #<?php echo T_BORDER_C; ?>;
    text-align:center;
    font:normal <?php echo T_FONT_SIZE.' '.T_FONT_FAMILY;  ?>;
    color:#<?php echo T_TH_C; ?>;
}


table.my-table td{
    width: <?php echo T_WIDTH_CELL?> px;
    padding: 5px 5px 5px <?php echo T_PADDING_CELL?>px;
    margin: 0px;
    background:#<?php  echo T_TD_BKG; ?>;
    border:1px solid #<?php echo T_BORDER_C; ?>;
    text-align:left;
    font:normal <?php echo T_FONT_SIZE.' '.T_FONT_FAMILY;  ?>;
    color:#<?php echo T_TD_C; ?>;
}

si un fisier index.php :

<html>
<head>
    <title>Test dinamic CSS </title>
    <link rel="stylesheet" href="style.css.php?style=green" type="text/css" media="all" />
</head>
<body>
<center>
    <table cellspacing="0" cellpadding="0" class="my-table">
        <tr>
            <th>Th Division 1</th>
            <th>Th Division 2</th>
            <th>Th Division 3</th>
            <th>Th Division 4</th>
        </tr>
        <tr>
            <td>Td Division 1</td>
            <td>Td Division 2</td>
            <td>Td Division 3</td>
            <td>Td Division 4</td>
        </tr>
        <tr>
            <td>Td Division 1</td>
            <td>Td Division 2</td>
            <td>Td Division 3</td>
            <td>Td Division 4</td>
        </tr>
</table>
<center>
</body>
</html>

si astfel putem sa apelam fisierul style.css.php cu trei parametri : blue, green, orange; care se transmit prin $_GET, in dependenta de care se genereaza un anumit fisier css. Daca intimplator se va gresi parametrul si nu va fi unul din cei enumerati mai sus se va genera un fisier css care va stiliza tabelul my-table in culori gri. Implicit se va apela fisierul css cu parametrul blue. comod nu ?
aici puteti sa scoateti sursele, sursele sunt verificate.

philosophy about open-source sites

Acest post nu are ca scop prezentarea creierii unui site/program/tool open source, ci prezentare functionalitatilor si posibilitatilor codului scris pentru a fi utilizat de catre altcineva.

Iau ca un caz aparte creare unui site pentru a fi utilizat de catre altcineva, iar aceste idei se pot adapta usor si la celalte tool-uri open-source.

In continuare prin cuvantul “developer” se va subintelege persoana care a creat site-ul initial iar “utilizator” – o persoana care va folosi acel site ( de asemenea, el poate scri/adauga/modifica cod in site dupa necesitatile pe care le vrea de la noul site )

E o diferenta foarte mare atunci cand creez un site, eu ca dezvoltator, pentru mine, si in a crea o pagina pentru un utilizator necunoscut, utilizator care poate nu o sa-l vezi niciodata.

In primul caz cand eu sunt utilizatoru si tot eu sunt si dezvoltatorul, folosind tehnologiile precum PHP, MYSQL, DESIGN se formeaza un conglomerat de code.

in toate cele 3 cercuri se afla cod scris de catre dezvoltator, si toate luate impreuna reprezinta site-ul.

Acum, hai sa facem un test si sa dam acest site unui utilizator care nu va avea nici un contact cu dezvoltatorul site-ului.

  • Partea buna e ca utilizatorul va avea un site gata facut.
  • Partea rea… mai bine zis partile rele apar atunci cand utilizatorul are nevoie de personalizarea site-ului. Si anume, el trebuie sa invete cam tot ce inseamna cod php si motorul din spatele site-ului ( care necesita un efort enorm din partea utilizatorului si respectiv din partea dezvoltatorului care trebuie sa scrie documentatie pentru tot codul php ) si trebuie sa se uite peste ce inseamna design al site-ului. Rezumat in cateva cuvinte: utilizatorul va trebui sa invete tot codul din site si pe langa faptul ca invata cod strain, este posibil ca sa nu ii placa codul vazut si poate are si idei mai bune de a crea acel site… si intr-un final exista o mare probabilitate de a renunta la el in favoarea altui.

Pentru a face un astfel de site accesibil mai usor unui utilizator, trebuie de identificat toate tehnologiile/tooluri cu care se va lucra:

  • MYSQL – utilizat pentru managementu cu datele.
  • PHP – limbaju de scripting din spatele site-ul.
  • TEMPLATE – fiecare utilizator doreste sa aiba un design personalizat.

Acum, luati pe pasi mici, se pot face urmatoarele lucruri:

  • ascunderea lucrului cu baza de date mysql, astfel ca tot codul sa fie doar PHP curat. Asta se face prin dezvoltarea unor clase ( engine ) care intorc datele necesare framework-ului prin structuri de tip php. Astfel vom avea ceva de genu :

In acest moment in ecuatie raman doar 2 componente : PHP si TEMPLATE.

  • Pentru a “ascunde” codul php, trebuie definita o interfata, o multime de functii care vor fi expuse mediului exterior si care sa fie foarte bine documentate. Aceste functii/scripturi vor prezenta insusi motorul (engine-ul) site-ului si toate feature-ule/posibilitatile site-ului.

acum avem din tot codul PHP o interfata de functii ( componenta PHP am simplificato ) si designul.

Designul e singura componenta care e strins legata de utilizator, si de aceea trebuie sa creem site-ul in asa mod incat din codul template-ul sa avem acces la toate facilitatile enginului siteului, de aceea am creat o interfata a engine-ului din php. Designul, implementat ca template, trebuie doar sa aiba posibilitatea sa zica doar ca in acest loc vor fi anumite informatii ( preluate cu un singur apel de functie php din interfata declarata mai sus ) iar in alt loc sa fie alte informatii ( tot preluate din informatii ).

Astfel, avind definita o interfata de functii php cu toate functionalitatile site-ului, o pagina din template ar putea arata astfel :

<?php include site_interface(); ?>
<html>
 <head>
  <title><?php echo get_title(); ?></title>
  <?php print_css_files(); ?>
 </head>
 <body>
   <h1> <?php echo post_title(); ?> </h1>
   <p> <?php echo post_content(); ?> </p>
 </body>
</html>

Acum, utilizatorul in caz ca vrea sa modifice ceva, va modifica doar in template-ul sau, si va avea posibilitatea de a modifica diferite kestii foarte rapid. Si tot ce treb sa invete este doar lista functiilor din interfata.

Comentariile sunt binevenite.

Sisteme de securitate anti-robot, captcha, in php

Un sistem anti-robot reprezintă un mecanizm care opreste activitatea roboţilor pe site. Deci, un mecanizm care nu permite de a crea diferite aplicaţii pentru a automatiza procesele de manipulare dintr-un anumit mediu.
Din titlu, probabil, aveti impresia că vom vorbi despre cine ştie ce algoritmi complicaţi, insă spre bucuria noastră nu este totul chiar aşa de complicat. Sistemul captcha este un lucru genial, foarte uşor de realizat şi foarte uşor de implementat. Însă este foarte greu, pentru un robot, de a trece peste acest mecanism. Pentru ca un robot să poată trece peste acest mecanizm robotul trebuie să fie superdotat (algoritmi complexi si cod mult de scris).
Mecanizmul captcha constă în:
1. Realizarea unui script care genereză imagini, utilizînd resursele unei biblioteci grafice, în cazul php cel mai des se utilizează GD sau Imagick.
Imaginea care este generată conţine un cod aleator format din cifre şi litere, sigur poate să conţină şi alte caractere asta ramine la discreţia dezvoltatorului.
Acest cod este scris in imagine cu un anumit srift de o anumită marime pe un oarecare fundal. Mai mult ca atît fundalu şi caracterele din cod pot fi de diferite culori.
2. Odata cu generarea imaginii se crează o sessiune pe server, care pastrează valoarea acelui cod din imagine în formă textuală.
3. Imaginea generată se afişează împreună cu un input în browser. În input se va înscrie codul din imagine, codul va fi scris de către utilizator. Acest cod urmează sa fie comparat cu codul ce sa pastrat în sesiune. Dacă vor coincide atunci se consideră că confirmarea a avut loc cu succes, alfel se regenerează codul şi imaginea, se modifică sesiunea şi se cere din nou confirmarea.
Astfel putem sa implementăm imaginea, inputul si mecanizmul de verificare acolo unde este necesară confirmarea anti-robot. Deseori este utilizat acest mecanizm împreună cu formularul de înregistrare a utilizatorilor sau la postarea comentariilor din zona publică a vizitatorilor ne înregistraţi şi în multe alte cazuri. Chiar mai mult, dacă consideraţi că la completarea unui formular este cazul să verificaţi existenţa roboţilor atunci implementaţi sistemul anti-robot.
Urmatorul script php genereaza o imagine in format PNG cu text generat random si seteaza textul in variabila de sesiune :

session_start();
session_regenerate_id();
$nr = rand(65,122);
$captcha = chr($nr).rand(1000,9999);
$nr = rand(65,122);
$captcha .= chr($nr);
$nr = rand(65,122);
$captcha .= chr($nr);
// Setam variabila in sesiune
$_SESSION['captcha'] = $captcha;
$string = $captcha;
$size = 18;
$radius = 0;
$font = 'font/brushscriptstd.otf'; //fontul
$coord = imagettfbbox($size, $radius, $font, $string);
/*
* A(x0,y0) B(X1,Y1) A(x0,y0) = [0][1] B(x1,y1) = [2][3]
* C(x2,y2) D(X3,Y3) C(x2,y2) = [6][7] D(x3,y3) = [4][5]
*/
$width  = round(sqrt(($coord[0] - $coord[2])*($coord[0] - $coord[2]) +
($coord[1] - $coord[3])*($coord[1] - $coord[3])),0);
$height = round(sqrt(($coord[0] - $coord[6])*($coord[0] - $coord[6]) +
($coord[1] - $coord[7])*($coord[1] - $coord[7])),0);
$image =        imagecreatetruecolor($width+20, $height+20);
imagecolorallocate($image, 0, 0, 0);
$white = imagecolorallocate($image, 255, 255, 255);
ImageTTFText ($image, $size, $radius,10 ,30 , $white, $font, $string);
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?&gt;

Ce este o sesiune şi cum se utilizează în PHP

Sesiunea este un registru global în care se înregistrează date privind identitatea utilizatorului.Deoarece comunicarea dintre utilizator şi serverul web are loc în baza URL este necesar de filtra sau de controlat accesul la anumite resurse şi asta este foarte uşor de realizat cu ajutorul sesiunilor.
În php, sesiunea se pastrează într-o variabilă globală de tip matrice. Această variabilă are aceleaşi proprietăţi ca şi oricare altă variabilă. Această variabilă se numeşte $_SESSION şi este capabilă să păstreze tot felul de date : numere, texte, matrici, obiecte etc. Deoarece această variabilă este globală şi ea poate fi apelată în orice moment de execuţie a scripturilor php, şi nu numai atit, dacă se iniţializează o sesiune pe un anumit server atunci această sesiune este accesibilă din orice pagină de pe server, sigur dacă sesiunea nu se distruge.
Apelul sesiunii se face în felul următor :

&lt;?php
// iniţiem sesiunea
session_start();
.......
.......
// setăm sesiunia
$_SESSION['test_var'] = 'test_val';
.......
.......
// utilizăm sessiunea
print $_SESSION['test_var'];
?&gt;

NOTĂ : pentru a iniţializa corect o sesiune este necesar ca în primul rînd să apelăm funcţia session_start()

Continue reading Ce este o sesiune şi cum se utilizează în PHP

Interacţiunea PHP-MySQL

MySQL – utilizează la realizarea interogărilor standartul SQL (Server Query Language) cu anumite mici modificări. Pentru interactiunea PHP-MySQL sunt utilizate mai multe funcţii. Majoritatea funţiilor returnează un array sau un număr, care reprezintă datele referitor la numărul de coloane, tabele, inregistrări etc. Sau reprezintă un array cu inregistrările dintr-o tabelă sau mai multe tabele, sau numele coloanelor, tabelelor etc.
Pentru a putea realiza cererile MySQL este necesar să stabilim o legatură cu serverul MySQL. Pentru a stabili această legatură trebuie specificaţi 4 parametri strict necesari şi unul secundar :

1. Numele hostului unde este stocată baza de date MySQL.
2. Numele utilizatorului.
3. Parola
4. Numele Bazei de Date necesare.
5. Time zone (secundar)

Interacţiunea PHP-MySQL ar fi bine să o realizăm într-o clasă. Asta ne va permite implementarea interacţiunii PHP-MySQL oriunde unde vom avea nevoie de ea.
În baza acestor 5 parametri se stabileşte legatura cu serverul. Această legatură cu serverul ar fi bine să o realizăm în constructorul clasei. Asta ne va asigura că la utilizarea instanţelor de tip clasă, va fi realizată legatura cu serverul. Aceşti 5 parametri DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_TIME vor fi definiţi ca constante în fişierul de config.
Continue reading Interacţiunea PHP-MySQL