Poslao: 27 Nov 2013 17:09
|
offline
- m4rk0
- 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.
|
|
|
Poslao: 27 Nov 2013 23:38
|
offline
- m4rk0
- 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 ?
|
|
|
|
Poslao: 28 Nov 2013 01:24
|
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
|
|
|
|
|
Poslao: 01 Dec 2013 21:42
|
offline
- m4rk0
- 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.
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
|
|
|
|
Poslao: 05 Dec 2013 02:43
|
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
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
|
|
|
|
Poslao: 07 Dec 2013 16:23
|
offline
- E.L.I.T.E.
- Legendarni građanin
- 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 Koristim PDO i čini mi se dosta lakšim nego mysqli.
konekcija.php
<?php
try{
$konektor = new PDO("mysql:host=mysql4.000webhost.com;dbname:...;","...","...");
}catch(Exception $greska){
die("GRESKA : " . $greska->getMessage());
}
?>
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()
));
}
}
?>
|
|
|
|
Poslao: 07 Dec 2013 18:03
|
offline
- 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.
|
|
|
|
Poslao: 25 Dec 2013 17:05
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
Napisano: 07 Dec 2013 19:32
Pa nije gotovo _iKaC, treba da se doda još stvari
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 ?
|
|
|
|