Archive

Archive for the ‘PHP’ Category

Kodiranje teksta u samo brojeve i slova

novembar 27th, 2014 No comments

Ukoliko vam je potrebno da kodirate tekst sa svim problematičnim znakovima u URL prikladan tekst, urlencode() nije pravo rešenje.

Ono što vam je potrebno je funkcija koja če vam dati samo brojeve i slova. Bez procenata, razmaka, ili drugih nealfanumeričkih znakova.

Za ovo ćemo koristiti PHP funkcije bin2hex() i pack().

Npr. one mogu konvertovati „(!X>4Ob=h/&hN\'“ u „2821583e344f623d682f26684e5c27“.

Evo funkcija koje su vam potrebne:

function hex_encode($string)
{
    return bin2hex($string);
}

function hex_decode($string)
{
    return pack("H*", $string);
}
Categories: PHP Tags:

CodeIgniter: recaptcha.php dokument nema odgovarajući konfiguracioni niz

oktobar 28th, 2013 No comments

Za one koji su naišli na ovaj problem, proverite podešavanje za PHP marker (<? and <?=).
Ukoliko nisu aktivirani, ova greška će se pojaviti jer se oni pominju u reCAPTCHA skriptama.

Izmenite „<?“ u „<?php“ i „<?=“ u „<?php echo“ i sve će biti uredu.
Druga opcija je da u konfiguracionim PHP fajlu dozvolite korišćenje kraćih markera.

Categories: PHP Tags: ,

Kreiranje PHP objekta bez upotrebe klase

jul 20th, 2013 No comments

U okviru JavaScript-a, kreiranje objekta je krajnje jednostavno:

myObj = {};
myObj.abc = "Here we go";

U PHP-u ovo možete uraditi na sledeći način:

$myObj = new stdClass();
$myObj->abc = 'Here we go';

Provera ispravnosti datuma u PHP-u

maj 10th, 2013 No comments

Šta se dešava ukoliko korisnik unese za datum rođenja 31/02/2000.?
Da li će datum biti ispravno sačuvan u bazi podataka?

Naravno da neće. U bazi podataka biće sačuvano 03.03.2000, jer je u definisanom datumu 3 dana više nego što je broj dana u februaru. Bilo bi dobro upozoriti na grešku. Da bi smo to uradili potrebno je napraviti funkciju koja će kontrolisati datum.

PHP već poseduje funkciju koja proverava ispravnost datuma:

bool checkdate(int $month, int $day, int $year);

Za zadat mesec, dan i godinu funkcija će vratiti informacoju da li ej uneti datum ispravan ili ne.

Categories: PHP Tags: ,

Preuzimanje naziva kontrolera i metoda u CodeIgniter-u

maj 10th, 2013 No comments

CI poseduje funkcije koje gledaju strukturu linka, iz nje vade naziv kontrolera i njegove funkcije koji su pozvani. U pitanju su funkcije:

$this->router->fetch_class(); // class = controller
$this->router->fetch_method();

Ono što je bitno, ukoliko koristite CI rutiranje, ove dve funkcije će to prepoznati i poslati vam ispravnu verziju putanje. Npr:

Za link:
http://www.prodavnica.com/proizvod/samsung-s3-case/123
Rutiranje vrši preusmeravanje na:
http://www.prodavnica.com/proizvodi/pregled/123/
Ci će bez problema vratiti kao klasu vrednost „proizvodi“ a kao metodu vrednost „pregled“

Za više detalaj o rutiranju posetite originalnu CI stranicu za URI rutiranje.

Categories: PHP Tags: , ,

Filtriranje sadržaja PHP promenljive

april 28th, 2013 No comments

PHP funkcija filter_var() se prvi put pojavljuje u okviru PHP 5.2.0 i tiče se filtriranja sadržaja u okviru promenljive. Detaljnije o funkciji možete pročitati ovde. U pitanju je funkcija koja će izvršiti kontrolu da li je sadržaj ispravno unet i preduzeti odgovarajuću akciju u zavisnosti od opcija koje ste definisali.

mixed filter_var(mixed $variable[,int $filter=FILTER_DEFAULT[,mixed $options]])

Funkcija prihvata 3 parametra. Prvi je tekst koji želite da kontrolišete, drugi je filter koji primenjujete, a treći su opcije koje dodatno opisuju filter koji primenjujete.

Postoji 4 tipa filtera:

  • Filteri provere
  • Filteri za saniranje
  • Ostali filteri
  • Markeri filtera

Filteri provere

Ovo su filter koji proveravaju da li je uneti tekst stvarno ono što i očekujete da bude. Tu spadaju:

  • FILTER_VALIDATE_BOOLEAN – proverava da li je uneta vrednost logička i vraća TRUE ukoliko je vrednost „1“, „true“, „on“, „yes“. U suprotnom vraća FALSE. (ovo je zgodno za proveru vrednosti koje se prosleđuje checkbox u okviru ExtJS framework-a )
  • FILTER_VALIDATE_FLOAT – proverava da li je uneta vrednost realan broj
  • FILTER_VALIDATE_INT – proverava da li je uneta vrednost ceo broj. Prihvata i opcione parametre za minimalnu i maksimalnu vrednost
  • FILTER_VALIDATE_IP – proverava da li je vrednost ispravna IP adresa. Podržavai IPv4 i IPv6
  • FILTER_VALIDATE_URL – da li je vrednost ispravan link. Kroz dodatne parametre možete definisati da li je dozvoljeno da link ima putanju (samo domen) i da li je dozvoljeno da ima parametre. Kroz kasnije verzije bi trebalo da bude podržano i dtip protokola (ssh, mailto…)
  • FILTER_VALIDATE_EMAIL – da li je vrednost ispravna e-mail adresa
  • FILTER_VALIDATE_REGEXP – potvrđuje da li je vrednost ispravan regularan izraz.

Neki od ovih filtera biće implementirani u okviru nove verzije CodeIgniter framework-a (v3) što će dodatno uticati na njegovu brzinu.

Filteri za saniranje

U pitanju su filteri koji ne vraćaju samo vrednost da li je sadržaj ispravan ili ne u zavisnosti od filtera, već i vrše dodatnu akciju u cilju njegovog adaptiranja kako bi postao ispravan. Tu spadaju:

  • FILTER_SANITIZE_EMAIL – uklanja sve znakove osim slova, brojeva i znakova !#$%&“*+-/=?^_`{|}~@.[]
  • FILTER_SANITIZE_ENCODED – url kriptovani tekst, opcioni briše specijalne karaktere
  • FILTER_SANITIZE_MAGIC_QUOTES – primenjuje funkciju addslashes()
  • FILTER_SANITIZE_NUMBER_FLOAT – uklanja sve karaktere osim +- i opcioni ., i naravno brojeva
  • FILTER_SANITIZE_NUMBER_INT – uklanja sve karaktere osim brojeva i +-
  • FILTER_SANITIZE_SPECIAL_CHARS – HTML karakteri ‘“<> & i karakteri sa ASCII vrednošću manjom od 32 , mogu biti izbačeni ili promenjeni u druge karaktere
  • FILTER_SANITIZE_FULL_SPECIAL_CHARS – ekvivalent komandi htmlslecialchars() sa s
  • FILTER_SANITIZE_STRING – briše sve tagove, a opciono briše ili kodira specijalne karaktere
  • FILTER_SANITIZE_STRIPPED – alijas prethodne komande
  • FILTER_SANITIZE_URL – uklanja sve karaktere osim slova, brojeva i $-_.+!*“(),{}|\\\\^~[]`<>#%“;/?:@&=
  • FILTER_UNSAFE_RAW – ne radi ništa, a opciono može da ukloni ili kodira specijalne karaktere

Ostali filteri

Ukoliko želite da kreirate svoju funkciju za filtriranje, ovo je odeljak za vas. Kao filter se unosi FILTER_CALLBACK, a kao dodatna opcija se navodi funkcija koja će izvršiti filtriranje/validaciju.

Markeri filter

Ovo su markeri koje možete koristiti kao opcioni treći parametar. Detaljnu listu možete pogledati ovde.

Ovo je samo uvod u mogućnosti koja ova funkcija pruža. Za više informacija pogledajte opis funkcije u okviru zvanične dokumentacije.

Optimizacija HTML koda

april 28th, 2013 No comments

Evo jednostavnog načina da se uklone sva ponavljanja razmaka, praznih linija, tabova, i svih znakova koji nisu vidljivi pada se gleda HTML stranica, ali su vidljivi ukoliko gledate izvorni kod. Rezultat je HTML kod u jednoj liniji, koji može biti manji i za nekoliko KB:

preg_replace("/\s+/", " ", $string);

$string je promenljiva u kojoj je smešten HTML kod.

Categories: PHP Tags: ,

10 saveta za optimizaciju PHP koda

mart 10th, 2013 No comments

Postoji mnogo načina kako možete da optimizujete svoj PHP kod. U ovom tekstu ćemo izdvojiti nekoliko metoda koje se jančešće koriste u programiranju.

1. Petlje

Ne postoji prorogram koji u svom radu ne koristi petlje. One nam omogućavaju da određeni deo koda ponovimo. Sa druge strane one su magnet za ubijanje efikasnosti, jer svaka i najmanja greška koja se u okviru njih napravi, automatski se množi sa brojem ponavljanja i može postati poprilično velika greška. U okviru PHP-a postoji više načina kako možete da realizujete petlje: for, foreach i while. Među njima je for petlja je najbrža. Ipak, i kod nje je potrebno voditi računa, primer:

// Upotreba funkcije koja daje broj elemenata niz u okviru dela za uslov
// daje gore perfomanse nego foreach i while petlje
for($i = 0; $i &lt; count($array); $i++) {
  echo 'Ovo je loše';
}
 
// Mnogo bolja primena
for($i = 0, $ci = (int)count($array); $i &lt; $ci; $i++) {
  echo 'Ovo je mnogo bolje';
}

Razlika je u tome što u prvoj petlji, svaki put kada proveravate da li je petlja postigla maksimalan broj ponavljanja, koristite funkciju koja daje broj elemenata niza. Na taj način funkciju aktivirate onoliko puta koliko prođete kroz petlju.
U drugom primeru je funkcija „izvučena“ u okviru dela koji se koristi za definisanje inicijalnih vrednosti tako da se funkcija poziva samo jednom bez obzira koliko puta prođete kroz petlju.

Drugi primer, bi bio upotreba petlje i uslova:

// Upotreba uslova unutar petlje
$ok = true;
for($i = 0; $i &lt; 10; $i++) {
  if ($ok)
    echo 'Ovo je OK';
  else
    echo 'ovo nije OK';
}
 
// Mnogo bolja primena
$ok = true;
if ($ok) {
  for($i = 0; $i &lt; 10; $i++) {
    echo 'Ovo je OK';
  }
} else {
  for($i = 0; $i &lt; 10; $i++) {
    echo 'Ovo je nije OK';
  }
}

Razlika je u tome što u prvoj petlji svaki put kada prođete kroz petlju postavljate uslov, u drugom primeru prvo postavite uslov i u zavisnosti od toga pristupate određenoj petlji koja obavlja svoj zadatak. Pri tome treba voditi računa da je uslov moguće staviti van petlje samo ukoliko u okviru nje ne postoji promenljiva na koji utiče petlja.

2. Jednostruki i dvostruki navodnici

U većini slučajeva nije bitno šta koristimo, pošto u okviru njih navodimo tekst koji koristimo dalje u kodu, ali nije baš tako. Razlika je u tome što je u okviru dvostrukih navodnika moguće ubaciti promenljive i PHP će ih uredno obraditi i na njihovo mesto ubaciti njihove vrednost što nije slučaj kod jednostrukih navodnika. Upravo iz tog razloga je upotreba jednostrukih navodnika mnogo brža. PHP-u se u startu naglašava da u okviru teksta ne postoji sadržaj koji je potrebno dodatno obraditi i ceo kod se brže izvršava. Koristite dvostruke navodnike samo kada imate potrebu za tim.

3. Pre increment i Post increment

Inkrementacija, odnosno povećavanja vrednosti za jedan se u okviru PHP programskog jezika može izvršiti na više načina, kao i u svim jezicima koji su proistekli iz C programskog jezika.

$i++;
$++i;
$i += 1;
$i = $i + 1;

U svim navedenim primerima, krajnji rezultat je isti, ali to ne znači da im je potrebno isto vreme za izvršavanje. Najbrže se izvršavaju pre i post inkrement, ali i izmenju njih je pre inkrement za oko 10% brži.

4. Apsolutne i relativne putanje

Apsolutne putanje su takođe poznate i kao kompletne putanje i gledano sa strane PHP-a one su bolje rešenje. Relativne putanje lako mogu da naprave problem prilikom korišćenja include i require operacija. Ono bitnije je da upotrebom apsolutnih putanja eliminišete potrebu da server rešava putanju umesto vas.

5. Echo i Print

Gledano sa strane benchmark testova, Echo je za oko 12-20% brži ukoliko se ne nalazi $ simbol u tekstu, a oko 40-80% ukoliko se $ simbol nalazi u tekstu.

6. Spajanje tekstova sa tačkom i zapetom

Između tačke (.) i zapete (,) koji koristiti za spajanje tekstova i promenljivih? Ja uglavnom koristim tačku ali kada sam pogledao testove na ovoj lokaciji i nisam siguran da je to uvek najbolje. Ono što se može zaključiti je da je bolje koristiti tačku ukoliko je u pitanju spajanje tekstova, ali ukoliko koristite i promenljive u tom spajanju, bolje je koristiti zapetu.

7. str_replace(), preg_replace() i ereg_replace()

U pitanju su 3 funkcije koje možete koristiti za pretragu teksta i izmenu nekog njegovog dela. Između njih, ukoliko nemate potrebe za naprednim pretraživanjem, najbolje je koristiti str_raplace(). Razlog je što ova funkcija ne koristi nakakve napredne izraze kao što je to moguće u preg_replace() i ereg_replace(). Ipak, kada je potrebno izvršiti zamenu nekoliko znakova u okviru teksta, mnogo je praktičnije koristiti jedan preg_replace() nego ponavljati str_replace() za svaki od njih.

8. explode() i preg_split()

Može se reći da je analiza ove dve funkcije identična prethodnoj tački. Funkcija explode je definitivno brža jer u okviru sebe nema mogućnost unošenja regularnih izraza, tako da uvek koristite nju kad god vam okolnosti to omogućavaju. Što bi rekao moj profesor – nema potrebe na vrapca pucati iz topa, dovoljna je puška (i to ona vazdušna), ubiće te ga verovatno i topom, ali će te zasigurno razneti i drvo na kome se on nalazi.

9. list() i [0]

Da li ste uopšte koristili nekada funkciju list()? Ja je koristim uglavnom kada je potrebno da mi funkcija vrati više vrednosti pa ih tom prilikom spakujem u niz i vratim niz, a onda je „dočekam“ ovom komandom. Primer:

function test()
{
  // some code here...
 
  return array(1, 'test', true);
}
 
list($number, $text, $logic) = test();

Ono što je interesantno je da je ovu funkciju poželjno korstiti kada god želite da promenljivoj dodelite vrednost nekog elementa niza jer možete dobiti na ubrzanju i do 90% (na toj jednoj funkciji naravno). Primer:

list ($v) = $GLOBALS['array'];
// vs.
$v = $GLOBALS['array'][0];

10. else if i elseif

Sigurno vam se desilo da u programiranju morate, u zavisnosti od više različitih uslova, da izvršite određeni deo koda. Tom prilikom je bolje koristiti elseif od običnog else if jer možete dobiti na uštedi i do 50% prilikom izvršavanja. Primer:

if ($GLOBALS['dummy_false'])
  $GLOBALS['dummy_false'] = true;
else if ($GLOBALS['dummy_true'])
  $GLOBALS['dummy_true'] = true;
// vs.
if ($GLOBALS['dummy_false'])
  $GLOBALS['dummy_false'] = true;
elseif ($GLOBALS['dummy_true'])
  $GLOBALS['dummy_true'] = true;

Ovo su samo neke optimizacije koje možete uraditi na svom kodu, ukoliko vas zanima kompletnija slika koja obuhvata precizne informacije koliko će te dobiti optimizovanjem određenog dela koda, pogledajte testove na ovoj lokaciji

Categories: PHP Tags: ,

(English) Moneybookers payments, part I: Create account

februar 7th, 2012 No comments

Zao nam je, ovaj ulaz je jedino moguc u Američki Engleski.

Categories: PHP Tags:

Sprečavanje keširanja CSS i JavaScript dokumenata

februar 4th, 2012 No comments

Projekat u razvoju, u toku dana bezbroj puta menjate CSS i JavaScript dokumenta, svaki put praznite cache browsera kako bi bile učitane poslednje verzije skripta. Čak i postavljanje veličine cache na 0MB ne pomaže svaki put. Jedini način je forsiranje pražnjenja kombinacijom tastera, npr. u FF je to ctrl+F5. Ovo posebno predstavlaj poblem ukoliko više ljudi radi na istom projektu.

Rešenje je korišćenje „fantomskog“ querystring-a koji čini da browser uvek skript ili css dokument vide kao nov. Ono što je još bitnije, u procesu razvoja projekta querystring može da se postavi kao promenljiva i da se po lansiranju projekta izvrši njegovo uklanjanje čima se dozvoljava keširanje.

Pa, kako to funkcioniše?

  <link href="/style.css?<?= time(); ?>" rel="stylesheet" type="text/css" />
  <script type="text/javascript" src="/script.js?<?= time(); ?>"</script>
  <!-- rezultat //-->
  <link href="/style.css?0123456789" rel="stylesheet" type="text/css" />
  <script type="text/javascript" src="/script.js?0123456789"</script>

Umesto time() je bolje postaviti neku promenljivu koja će imati vrednost koju daje ova funkcija, po lansiranju projekta, potrebno je samo promenljivoj dodeliti prazan string kao vrednost i sve je spremno.

Categories: PHP Tags: , ,