OOP u PHP - prednosti i mane

2

OOP u PHP - prednosti i mane

offline
  • m4rk0  Male
  • Administrator
  • Administrator tech foruma
  • Marko Vasić
  • Gladijator - Maximus Decimus Meridius
  • Pridružio: 14 Jan 2005
  • Poruke: 15766
  • Gde živiš: Majur (Colosseum)

Hvala, idemo sledece:

$mysqli = new mysqli("localhost", "korisnicko_ime", "sifra", "baza"); if ($mysqli->connect_errno) {     printf("Veza nije uspostavljena: %s\n", $mysqli->connect_error);     exit(); }

Jasno mi je zasto sve funkcije sluze, ali me interesuje ovaj red koda od printf pa nadalje.
Znam da je %s tu da bi rezultat connect_error funkcije (tj greska) bio prikazan u obliku stringa kada sa pozove printf naredbom. Ali zasto je to neophodno kada (valjda) connect_error ionako vraca string ? Zasto ne bi bilo dovoljno:

printf("Veza nije uspostavljena: \n", $mysqli->connect_error);

ili cak:

echo "Veza nije uspostavljena: " $mysqli->connect_error

?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 17 Jun 2012
  • Poruke: 727

Mislim da bi moglo ovako:

Citat:echo "Veza nije uspostavljena: ", $mysqli->connect_error;



offline
  • m4rk0  Male
  • Administrator
  • Administrator tech foruma
  • Marko Vasić
  • Gladijator - Maximus Decimus Meridius
  • Pridružio: 14 Jan 2005
  • Poruke: 15766
  • Gde živiš: Majur (Colosseum)

OK, ako moze i tako, onda me i dalje interesuje zasto se forsira

printf("Veza nije uspostavljena: %s\n", $mysqli->connect_error);

sta ona to radi sto ne moze varijanta bez %s ili echo varijanta ?

offline
  • Pridružio: 25 Jan 2004
  • Poruke: 2784
  • Gde živiš: Niš

Na taj način će ti biti lakše posle da formatiraš string ako želiš da uvedeš višejezičnost, jer ćeš samo wrapovati stringove novom funkcijom koju ljudi uglavnom nazivaju __()

function __($string) {  $string = "Connection went wtf: %s";  return $string; } printf(__("Veza nije uspostavljena: %s\n"), $mysqli->connect_error);
Tako da već možeš odmah i da sastavljaš tako stringove i da imaš funkciju koja samo vraća taj isti string bez formatiranja.
Iskreno nisam to nikada radio ozbiljno tako da ne znam koliko mi je predlog dobar da već odmah wrapuješ stringove praznom funkcijom jer sam primetio se kod veće kompleksnosti koristi sprintf, tako da bi u svakom slučaju morao da menjaš kod.

Naravno, ako praviš nešto što sigurno neće biti internacionalno onda nema poente Smile

offline
  • soxxx 
  • Prijatelj foruma
  • Pridružio: 25 Maj 2005
  • Poruke: 1482
  • Gde živiš: Gracanica, Kosovo

m4rk0 ::OK, ako moze i tako, onda me i dalje interesuje zasto se forsira

printf("Veza nije uspostavljena: %s\n", $mysqli->connect_error);

sta ona to radi sto ne moze varijanta bez %s ili echo varijanta ?

Nisam upoznat sa PHP-om, ali pretpostavljam da je, pored ostalog, jedan od razloga i bezbednost:

http://en.wikipedia.org/wiki/Uncontrolled_format_string

http://securityblog.gr/338/prevent-format-string-vulnerabilities-in-php/

offline
  • m4rk0  Male
  • Administrator
  • Administrator tech foruma
  • Marko Vasić
  • Gladijator - Maximus Decimus Meridius
  • Pridružio: 14 Jan 2005
  • Poruke: 15766
  • Gde živiš: Majur (Colosseum)

Napisano: 28 Nov 2013 14:41

Hvala na odgovorima. Smile

Sledece pitanje.
Ucim prepared statements i zakljucio sam sledece (ispravite me gde gresim):

bind_param smesta promenljive na mesto znakova pitanja i koristi se kod iskaza koji vrse modifikacije: INSERT, UPDATE, REPLACE, DELETE, DROP, CREATE..

bind_result smesta rezultate upita u prmenljive i koristi se kod iskaza SELECT.

Pitanja:

Da li ima smisla ili je uopste tehnicki moguce koristiti bind_param i u slucaju SELECT iskaza ?
Da li se bind_result moze koristiti i kod drugih iskaza osim SELECT ?
Da li sam dobro primetio da nema znakova pitanja kod pripremanja iskaza kada se koristi SELECT ?
Da li je to i jedini slucaj kada se znakovi pitanja ne koriste ?
Da li se za jednu istu pripremu iskaza (tj. nakon jedne pripreme iskaza: mysqli->prepare()) mogu jedna za drugom koristiti i bind_result i bind_param ?

Molim samo konkretne odgovore ili primere gde su dati odgovori konkretno na moja pitanja.

Dopuna: 01 Dec 2013 21:42

Bump

offline
  • Pridružio: 25 Jan 2004
  • Poruke: 2784
  • Gde živiš: Niš

Izvini ako se kasno javljam =|
m4rk0 ::bind_param smesta promenljive na mesto znakova pitanja i koristi se kod iskaza koji vrse modifikacije: INSERT, UPDATE, REPLACE, DELETE, DROP, CREATE..

bind_result smesta rezultate upita u prmenljive i koristi se kod iskaza SELECT.


bind_param se koristi i kod upita, a bind_result kao što si i napisao - samo kod upita, tj. kada uzimaš podatke.
Ne znam da li si sam već shvatio ulogu prepared statements ili te još nešto koči, ali nije na odmet -
bind_param ti omogućuje da vrednosti za bilo koju naredbu smestiš naknado u već 'pripremljenu' (čitaj kompajliranu) naredbu - što iz razloga da se upiti koji se ponavljaju izvršavaju optimizovanije, što iz sigurnosnih razloga (query/statement injection).
bind_param ili bind_value se razlikuju u prosleđivanju vrednosti - prvo prosleđuje referencu na vrednost a drugo prosleđuje vrednost.
bind_result ili get_result slede kasnije i koristiš ih za smeštanje/štampanje podataka.
bind_result je prikladniji za upite željenih kolona, a get_result recimo kada čupaš sve * podatke.

Citat:Da li ima smisla ili je uopste tehnicki moguce koristiti bind_param i u slucaju SELECT iskaza ?
Da. Iz istih razloga kao i kod drugih naredbi a naročito ako su parametri uneti sa korisničke strane.
Citat:Da li se bind_result moze koristiti i kod drugih iskaza osim SELECT ?
Ne?
Citat:Da li sam dobro primetio da nema znakova pitanja kod pripremanja iskaza kada se koristi SELECT ?
Ja nisam primetio. Osim naravno ako ne upisuješ vrednost direktno u upit Very Happy
Sa druge strane PDO koristi promenljive umesto znakova pitanja i pritom pruža više mogućnosti. Pređi odmah na PDO i biće ti lakše.
Citat:Da li je to i jedini slucaj kada se znakovi pitanja ne koriste ?
Možda ja stvarno nisam upućen u nešto oO
Citat:Da li se za jednu istu pripremu iskaza (tj. nakon jedne pripreme iskaza: mysqli->prepare()) mogu jedna za drugom koristiti i bind_result i bind_param ?
Da.

soxxx ::Nisam upoznat sa PHP-om, ali pretpostavljam da je, pored ostalog, jedan od razloga i bezbednost:

http://en.wikipedia.org/wiki/Uncontrolled_format_string

http://securityblog.gr/338/prevent-format-string-vulnerabilities-in-php/


Jeste bezbednost u pitanju ali kod ulaznog dela koda. Ovde se radi o jednostanvom štampanju mysqli grešaka koje nemaju nikakav input.
Celokupan korisnički interfejs za koji bi on definisao statičke vrednosti ovih grešaka za koje je pitao ne bi imao nikakav input osim neke klase koja proverava koji fajl bi interpeter trebalo da učita gde bi inače te statičke vrednosti bile smeštene. Naravno, to je već dalje projektovanje koda - možda bude neophodno da korisnik sam prevodi interfejs, gde bi onda bilo dodirnih tačaka sa ovim mysql errors Razz

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

Evo pošto sam počeo sad da pravim neku jednostavnu aplikaciju u PHP i AJAX (neki chat), a radi se OOP da vas pitam kako vam se čini ovo za početak Smile Koristim PDO i čini mi se dosta lakšim nego mysqli.

Arrow konekcija.php

<?php         try{     $konektor = new PDO("mysql:host=mysql4.000webhost.com;dbname:...;","...","...");         }catch(Exception $greska){         die("GRESKA : " . $greska->getMessage());     } ?>

Arrow klase.php

<?php class korisnik{         private $id,$username,$mail,$pass;     public function getId() {        return $this->id;     }     public function postaviId($id){        $this->id=$id;     }     public function getUsername() {        return $this->username;     }     public function postaviUsername($username){        $this->username=$username;     }     public function getEmail(){        return $this->mail;     }     public function postaviEmail($mail){        $this->mail=$mail;     }         public function getPass(){            return $this->pass;     }         public function postaviPass($pass){         $this->pass=$pass;     }         public function postaviKorisnika(){          include "konekcija.php";          $req=$konektor->prepare("INSERT INTO korisnici(username, mail, pass) VALUES(:username, :mail, :pass)");          $req=execute(array(             'username'=>$this->getUsername(),             'mail'=>$this->getEmail(),             'pass'=>$this->getPass()             ));     } } class chat {      private $chatid, $chatuserid, $chattext;      public function getChatId(){             return $this->chatid;      }      public function postaviChatId(){          $this->chatid = $chatid;      }      public function getChatUserId(){         return $this->chatuserid;      }      public function setChatUserId(){         $this->chatuserid = $chatuserid;      }      public function getChatText(){         return $this->chattext;      }      public function postaviChatText(){         $this->chattext = $chattext;      }      public function prikazChatPoruke(){          include "konekcija.php";          $req=$konektor->prepare("INSERT INTO chats(chatuserid, chattext) VALUES(:chatuserid, :chattext)");          $req->execute(array(                'chatuserid'=>$this->getChatUserId(),                'chattext'=>$this->getChatText()             ));      } } ?>

offline
  • C# and PHP Developer
  • Pridružio: 16 Feb 2011
  • Poruke: 1630
  • Gde živiš: Pancevo

Cisto onako od oka

Tebi ova metoda radi?

    public function postaviKorisnika(){          include "konekcija.php";          $req=$konektor->prepare("INSERT INTO korisnici(username, mail, pass) VALUES(:username, :mail, :pass)");          $req=execute(array(             'username'=>$this->getUsername(),             'mail'=>$this->getEmail(),             'pass'=>$this->getPass()             ));     }

Gde si ti definisao objekat $konektor ? ja ga u datoj metodi nevidim nigde!

Ljudi lako je napisati klasu to moze svako dete, tesko je naterati sebe da razmisljas na taj nacin.

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4575

Napisano: 07 Dec 2013 19:32

Pa nije gotovo _iKaC, treba da se doda još stvari Very Happy

Dopuna: 25 Dec 2013 17:05

Jedno pitanje - zašto moram ponovo da definišem objekat $konektor ako sam includovao fajl gde je definisan taj isti ?

Ko je trenutno na forumu
 

Ukupno su 916 korisnika na forumu :: 30 registrovanih, 9 sakrivenih i 877 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Apok, babaroga, Battlehammer, ccoogg123, Denaya, DPera, GandorCC, Georgius, ivica976, Koridor, lucko1, milimoj, MilosKop, nemkea71, Neutral-M, Nikolaa11, Nobunaga, Rogan33, sevenino, Shinobi, Srki94, Sumadija34, suton, vathra, vlvl, W123, YU-UKI, šumar bk2, 79693