Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoć oko procedure

[es] :: MySQL :: Pomoć oko procedure

[ Pregleda: 1712 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Pomoć oko procedure01.07.2010. u 21:02 - pre 167 meseci
Napravio sam proceduru kojom proveravam logovanje korisnika ona ima sledeci oblik:

Code:
delimiter //
create procedure SP_LOGIN(korisnicko_ime varchar(15), lozinka varchar(15))
begin
select count(*)
from korisnik
where username=`korisnicko_ime` and password=`lozinka`;
end;
//
delimiter ;


Ovu proceduru pozivam iz php-a i ako postoji ovakav korisnik u bazi onda treba negde na ekranu da ispisem ime i prezime korisnika. Za tu svrhu mi treba još jedna procedura koja daje ime i prezime. Radio sam ranije procedure u Oraklu pa sam malo pozaboravljao stvari a u mysql sam početnik. Napravio sam proceduru ali iz nekog razloga neće pravilno da radi tj. ne daje mi ni jedan red za zadati parametar.
Evo kako izgleda procedura:

Code:
delimitter //

CREATE PROCEDURE SP_GET_IME_I_PREZIME(korisnicko_ime varchar(15))
BEGIN
SELECT Ime, Prezime
FROM KORISNIK
WHERE username='korisnicko_ime';
END

delimitter ;


Ne znam šta je problem sa ovom procedurom. Molim vas da me uputite kako da ovo odradim. Možda preko OUT parametra?


 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Pomoć oko procedure01.07.2010. u 21:43 - pre 167 meseci
da bi pokupio te izlazne vrednosti koje ispises sa select iz php-a moras da dodas fleg u konekciju ...

bitnije pitanje je - koja je poenta stored procedure koja izvrsava jedan jednostavni upit? zasto ti je "bolje" da iz php-a uradis

Code:

$res = mysql_query("call x('pera', 'sifra')");


a onda na sve to radis jos jedan call jos jedne procedure da ti pokupi ime i prezime ?!

pa da onda ta stored procedura cima upit umesto da uradis direktno

Code:

$res = mysql_query("select count(*) from korisnik where username='pera' and password='sifra'");


ili jos bolje
Code:

$res = mysql_query("select ime, prezime from korisnik where username='pera' and password='sifra'");
if (mysql_num_rows($res) != 1){
  //nema korisnika
} else {
 $row=mysql_fetch_assoc($res);
 echo $row['ime'].' '.$row['prezime'];
}
....


nemas nikakve potrebe za stored procedurama u tom slucaju samo bespotrebno komplikujes i usporavas stvar - biznis logika ti je u php-u, ne u bazi


da ne spominjem da cuvas password kao clear tekst u bazi sto nikako nije ok (koristi funkciju password()).
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Pomoć oko procedure02.07.2010. u 02:07 - pre 167 meseci
Odluka našeg tima je da radimo sve preko procedura. Mene mnogo interesuje da dobijem ime i prezime preko procedurue. Šta bi konkretno moglo da znači ovo?

Citat:
da bi pokupio te izlazne vrednosti koje ispises sa select iz php-a moras da dodas fleg u konekciju ...

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Pomoć oko procedure02.07.2010. u 02:42 - pre 167 meseci
baza:

Code:

mysql> select * from t5;
+----+-------+---------+
| id | ime   | prezime |
+----+-------+---------+
|  1 | pera  | peric   |
|  2 | zika  | zivotic |
|  3 | pera  | konj    |
|  4 | zoran | majmun  |
+----+-------+---------+
4 rows in set (0.00 sec)

mysql> show create procedure x\G
*************************** 1. row ***************************
           Procedure: x
            sql_mode:
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `x`(IN uid int)
BEGIN
select ime, prezime from t5 where id=uid;
END
character_set_client: latin1
collation_connection: latin1_swedish_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
mysql> call x(3);
+------+---------+
| ime  | prezime |
+------+---------+
| pera | konj    |
+------+---------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)


php:
Code:

[arhimed@gedora10 ~]$ cat njnj.php
<?php

$host = '127.0.0.1';
$user = 'root';
$password = '';
$db_name = 'test';

mysql_connect($host,$user,$password,false,65536) or die(mysql_error());
mysql_select_db('test');
mysql_query("SET NAMES 'utf8'");
$res = mysql_query("CALL x(3)");
while ($row=mysql_fetch_row($res)){
  echo $row[0].' '.$row[1]."\n";
}
mysql_free_result($res);
mysql_close();
?>
[arhimed@gedora10 ~]$ php njnj.php
pera konj
[arhimed@gedora10 ~]$
[/quote]

dakle kao sto vidis primer je pokupio sadrzaj koji je vratila fukncija (poseban fleg je ono 65536).

odluka tima je losa i gadno cete zazaliti zbog toga ali krajnja odluka je vasa... obrati paznju da mysql procedura ne moze da vrati "tabelu" - ovo sto se vidi u ovom primeru je generalno "fora", to sto ce "select" unutar procedure da odradi "ispis" i sto ce to onda klijent da "pokupi i izparsira" nikako nije "pravilan nacin"

mogli bi da koristite nesto tipa get_ime() i get_prezime() koje bi napravili kao funkcije - to bi imalo malo vise smisla, ili da koristite OUT varijable u proceduri (pokupite ih sa select @imevarijable - na primer: 

mysql:
Code:

mysql> show create procedure y\G
*************************** 1. row ***************************
           Procedure: y
            sql_mode:
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `y`(IN uid int, OUT n char(10), OUT p char(10))
BEGIN
select ime into n from t5 where id=uid;
select prezime into p from t5 where id=uid;
END
character_set_client: latin1
collation_connection: latin1_swedish_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)

mysql>


i php:
Code:

[arhimed@gedora10 ~]$ cat njnj1.php
<?php

$host = '127.0.0.1';
$user = 'root';
$password = '';
$db_name = 'test';

mysql_connect($host,$user,$password,false,65536) or die(mysql_error());
mysql_select_db('test');
mysql_query("SET NAMES 'utf8'");
mysql_query("CALL y(3, @ime, @prezime)");
$res = mysql_query("SELECT @ime, @prezime");
while ($row=mysql_fetch_row($res)){
  echo $row[0].' '.$row[1]."\n";
}
mysql_free_result($res);
mysql_close();
?>
[arhimed@gedora10 ~]$ php njnj1.php
pera konj
[arhimed@gedora10 ~]$


ovaj drugi nacin je "pravilan"

 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.static.isp.telekom.rs.

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: Pomoć oko procedure02.07.2010. u 07:34 - pre 167 meseci
Više od jednog programera, odlučujete nakon sastanka da koristite samo stored procedure za krajnje jednostavne upite (jer je to enterprisey) a te procedure onda koristite za CLEARTEXT PASSWORD???

Mogu misliti kako će vam ostatak koda izgleda kad se brinete o sitnicama a pravite ogromne greške sa strane.
"Common sense is not so common." - Voltaire
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
*.dynamic.isp.telekom.rs.

Sajt: biske.rs


+39 Profil

icon Re: Pomoć oko procedure02.07.2010. u 11:16 - pre 167 meseci
Nismo se dogovarali za svaku sitnicu nego rekoh da smo u principu rekli da logika ide u bazu u procedure i triggere a ne u php aplikaciju.
E sad pošto nisam dobro upućen možete li da mi pojasnite neke stvari? Naime, interesuje me da li se ovim mojim pristupom gubi na performansama da li je razlika bitna? Ako smo već odlučili da radimo upite preko procedura da li da radimo sve upite na taj način ili da nešto radimo preko procedura a nešto preko php-a? Da li ima sa ovim pristupom nekih problema u vezi sa bezbednošću baze?

EDIT: Naravno da ću čuvati password šifrovano kao md5(password) ili sha1(password).
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Pomoć oko procedure02.07.2010. u 11:22 - pre 167 meseci
Pa logika je valjda da ako je prijava dobra, otvoriš novu sesiju, upišeš audit log, ažuriraš vreme poslednje posete i šta već radiš u tom slučaju. Nije logika aplikacije pročitaj korisničko ime, to je interfejs ka podacima koji ti SQL već nudi sam po sebi.

Sa druge strane za ovako "trivijalnu logiku" ne vidim razlog zašto ne bi ona bila implementirana van baze podataka, posebno što verovatno nema veze sa modelom podataka već načinom prijave korisnika. Neka druga aplikacija će to možda drugačije da uredi, a da radi sa istim modelom.

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Pomoć oko procedure02.07.2010. u 11:30 - pre 167 meseci
ivane, da bi "kompletnu" biznis logiku prebacio na bazu treba ti da baza podrzava nesto poput oraklovog plSQL-a... to na mysql-u mozes da zaboravis, imas samo SQL standardne procedure i funkcije. Implementacija biznis logike kroz to se svodi na primer koji si pokazao, dakle neces da povuces podatak direktno nego ces da ti ga povuce procedura na isti nacin kao da si ga ti povukao direktno - to na zalost znaci gubljenje vremena (i u programiranju i u izvrsavanju, dakle da, perfomanse ce isto da kostaju ovde)... ako hoces da ti biznis logika bude u bazi, uzmi neki drugi rdbms

trigeri su druga prica, koristenje trigera pozdravljam (i dalje ne za implementaciju biznis logike, nego za konzistentnost podataka - sto vrlo cesto ukljucuje i biz logiku ali to je sad druga prica)
 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.static.isp.telekom.rs.

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: Pomoć oko procedure05.07.2010. u 09:18 - pre 167 meseci
Ako snimiš samo kao md5('password') nisi mnogo postigao jer je još uvek moguće uraditi jednostavan Rainbow Tables napad. Ako te zanima, Free Rainbow Tables je samo jedan od sajtova odakle se one mogu skinuti.

Najbolje koristi crypt funkciju koja koristi random salt za svaku lozinku. Ako se ovako radi napadač bi morao da pravi posebnu rainbow tabelu za svakog korisnika. Što je sporije od običnog brute force.
"Common sense is not so common." - Voltaire
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Pomoć oko procedure05.07.2010. u 09:27 - pre 167 meseci
password() je uglavnom dovoljno dobar (osim ako neko nije ostavio old-password opciju na serveru, onda je patetican), crypt je funkcija izvan mysql-a. moze da se koristi iz mysql-a neka od mnogih funkcija na tu temu: http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html

no odosmo od teme i od foruma .. upute za programiranje, koncept aplikacije, arhitekturu, php hintovi .. moze tamo na php forumu ..
 
Odgovor na temu

[es] :: MySQL :: Pomoć oko procedure

[ Pregleda: 1712 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.