Nov 17

Definitia unui web-service: here
Cum se realizeaza un web-service in php: here

Nov 13

O mare problema in ziua de azi este spam-ul.
Cea mai simpla modalitate de a evita spam-ul este folosind Captcha. Aceasta face diferenta intre un calculator si o fiinta umana. Un calculator nu poate citi ceea ce scrie intr-o imagine, de aceea vom folosi si noi o poza.

Incepem prin a creea fisierul poza.php. Acest fisier va creea o poza cu un text ales de noi.


header('Content-type: image/jpeg'); // Acest fisier va afisa o poza in format jpg
$width = 60; // Latimea pozei ce va fi creata
$height = 24; // Inaltimea pozei ce va fi creata
$my_image = imagecreatetruecolor($width, $height); // Poza propriu-zisa este creata
imagefill($my_image, 0, 0, 0xFFFFFF); // Fundalul pozei va fi alb

Pana acum am creat o imagine cu o latime de 60 pixeli, o inaltime de 24 de pixeli si fundal alb.
Adaugam putine distorsiuni:

for ($c = 0; $c < 40; $c++){
$x = rand(0,$width-1);
$y = rand(0,$height-1);
imagesetpixel($my_image, $x, $y, 0x000000);
}

Am inserat 40 de pixeli de culoarea neagra. Acesti pixeli vor avea coordonate aleatorii de fiecare data cand o poza este afisata.

Scriem pe poza si textul necesar:


$x = rand(1,10); // Coordonata X a coltului stanga sus.
$y = rand(1,10); // Coordonata Y a coltului stanga sus
$rand_string = rand(10000,99999); // Obtinerea unui numar aleatoriu intre 10000 si 99999
imagestring($my_image, 5, $x, $y, $rand_string, 0x000000); // Numarul aleatoriu obtinut mai devreme este scris in poza

Acum vom salva string-ul din poza intr-un cookie. Acest cookie va fi citit in momentul in care un user completeaza un form si comparat cu valoarea introdusa de el in campul de verificare.

setcookie("cookie-captcha", (md5($rand_string)), time()+3600, "/"); // Setam un cookie in care salvam valoarea codata a stringului obtinut mai devreme ($rand_string).
imagejpeg($my_image); // Crearea pozei in format jpg
imagedestroy($my_image); // Poza este stearsa

In acest exemplu cookie-ul se numeste cookie-captcha, continutul acesteia va fi valoarea codata a $rand_string, este valabil o ora (time()+3600) pe tot domeniul dumneavoastra ( "/" )

Poza este stearsa (imagedestroy) pentru a salva spatiu pe server. Imaginati-va ca aveti 10000 de vizitatori pe ora - vor fi create 24000 de astfel de poze si vor ramane pe server-ul dumneavoastra.

Fisierul complet poza.php va fi:


<?php
header('Content-type: image/jpeg');
$width = 60;
$height = 24;
$my_image = imagecreatetruecolor($width, $height);
imagefill($my_image, 0, 0, 0xFFFFFF);
for ($c = 0; $c < 40; $c++){
$x = rand(0,$width-1);
$y = rand(0,$height-1);
imagesetpixel($my_image, $x, $y, 0x000000);
}
$x = rand(1,10);
$y = rand(1,10);
$rand_string = rand(10000,99999);
imagestring($my_image, 5, $x, $y, $rand_string, 0x000000);
setcookie("cookie-captcha", (md5($rand_string)), time()+3600, "/");
imagejpeg($my_image);
imagedestroy($my_image);
?>

Acum ca poza este creata si valoarea scrisa in poza este codata in cookie este timpul sa validam.
Poza creata de poza.php va fi inserata in html ca o poza normala:

<img src="poza.php" alt="Poza de verificare" />

Sa nu uitam de input:

<input type="text" name="numar_verificare" size="5" max-length="5" />

Definim variabilele:


$numar_verificare = $_REQUEST['numar_verificare'];
$text_corect = $_COOKIE['cookie-captcha']);

Nu uitati ca in cookie valoarea din poza este criptata md5.
Acum comparam textul introdus de utilizator (criptat md5) cu cel aflat in cookie:


<?php
if(md5($numar_verificare) != $_COOKIE['cookie-captcha']){
echo 'Ne pare rau dar textul introdus nu corespunde cu cel din imagine';
}
else
{
echo 'Textul corespunde cu cel din imagine.';
}
>

Bineinteles ca in locul echo-ului 'Textul corespunde cu cel din imagine.' veti pune un mysql_query sau ce aveti nevoie.

Puteti vedea si un exemplu aici.

Am implementat captcha complet functional cu doar 17 linii de cod.

Nov 12

Probabil ati observat pe digg ca este afisat timpul scurs de la postarea unui comentariu in urmatorul format:

digg

Pentru a obtine un astfel de rezultat vom folosi functia strtotime. Aceasta functie numara secundele trecute de la 1 Ianuarie 1970.

Pentru a putea obtine cu exactitate numarul de secunde ar trebui sa salvam data postarii unui comentariu in urmatorul format: date(‘Y-m-d H:i:s’) – va returna 2008-11-12 14:39:53

La crearea fieldului data in tabela MySQL alegeti tipul datetime.

Incepem cu adaugarea in tabela MySQL a comentariului.

INSERT INTO `comments` (`nume` , `comentariu`, `data`) VALUES ('Sava Stefan', 'Acesta este un comentariu', NOW( ));

NOW() va insera valoarea exacta a timpului in acel moment in format 2008-11-12 14:39:53.

Acum ca avem un comentariu este timpul sa afisam timpul trecut.
Voi nota data postarii acestui comentariu cu $datacomentariu. Shtiti voi cum sa il obtineti :-) .

Vom crea o functie numita countTime.

function countTime($datacomentariu) {
$now = date('Y-m-d H:i:s');
$nrsecunde = (strtotime($now) - strtotime($datacomentariu));
}

Pana acum am obtinut numarul de secunde ce au trecut de la postarea comentariului ($datacomentariu).
Trecem mai departe si vom afla nr de zile, ore si minute trecute prin simple operatiuni matematice.


$nrminute = $nrsecunde / (60);
$nrore = $nrminute / (60);
$nrminuteafisat = intval($nrminute - ($nroreafisat * 60));
$nroreafisat = intval($nrore);

Dupa cum vedeti numarul de minute trecute este egal cu numarul de secunde obtinut mai devreme (diferenta) impartit la 60. Numarul de ore va fi la randul sau egal cu numarul de minute impartit la 60.

Am folosit intval pentru a obtine numarul intreg de ore si minute ce vor fi afisate.

Numarul de secunde afisat va fi si el un numar intreg:

$nrsecundeafisat = intval($nrsecunde - ($nroreafisat * 60 * 60) - ($nrminuteafisat * 60));

$nroreafisat * 60 * 60 = numarul de secunde in $x ore; daca $nroreafisat = 1 vom avea 3600 de secunde
$nrminuteafisat * 60 = numarul de secunde in $x minute; daca $nrminuteafisat = 2 vom avea 120 de secunde.

Acum sa customizam putin output-ul acestei functii:
echo 'comentariu postat acum '.$nroreafisat.' ore, '.$nrminuteafisat.' minute si '.$nrsecundeafisat.' secunde';

Functia completa:


function countTime($datacomentariu) {
$now = date('Y-m-d H:i:s');
$nrsecunde = (strtotime($now) - strtotime($datacomentariu));
$nrminute = $nrsecunde / (60);
$nrore = $nrminute / (60);
$nrminuteafisat = intval($nrminute - ($nroreafisat * 60));
$nroreafisat = intval($nrore);
$nrsecundeafisat = intval($nrsecunde - ($nroreafisat * 60 * 60) - ($nrminuteafisat * 60));
echo 'Postat acum '.$nroreafisat.' ore, '.$nrminuteafisat.' de minute si '.$nrsecundeafisat.' secunde';
}

Integrarea acestei functii se face foarte simplu. $comentariu['data'] este data postarii comentariului din baza de date.

Nume: $comentariu['nume'];
Comentariu: $comentariu['comentariu'];
countTime($comentariu['data']);

Va fi afisat:


Nume: Sava Stefan
Comentariu: Acesta este un comentariu
Postat acum 3 ore, 24 de minute si 13 secunde

Bineinteles ca puteti calcula si timpul ramas pana la o anumita data scazand din data limita data curenta:
$nrsecunderamase = (strtotime($dataincauza) - strtotime($now));

Next Entries »

Powered By Wordpress - Theme Provided By Wordpress Theme - Credit Loan