PDA

Prikaži potpunu verziju : PHP link


sava88
27.4.2009, 1:18
Tek sam poceo da ucim php, treba mi mala pomoc.
Ok napravio sam bazu i tabelu, to nije problem, znam kako da selektujem tj. da prikazem zeljeni sadrzaj iz tabela, ali problem mi je, kako da linkujem stvari iz tabele npr. imam ime pera, prezime markovic i ja sad treba da linkom zeleci peru dobijem ispis markovic,nadam se da me razume neko... kad kliknem na link pera on isprintuje njegovo prezime... hwala unapred...

EclipsE
27.4.2009, 15:05
Pa pretpostavimo da tabelu dobijash ovako nekako:

$result = mysql_query("SELECT * FROM korisnici");

if (mysql_num_rows($result))
{
while ($arr = mysql_fetch_array($result))
{
echo "{$arr['ime']}<br />";
}
}
else
echo "Ne postoji ni jedan korisnik.";

Linkovacesh po id-u (primarnom kljuchu), dakle zamenish liniju za ispisivanje ovako.

echo "<a href='vidikorisnika.php?id={$arr['id']}'>{$arr['ime']}</a>";

I time cesh dobiti link koji vodi na vidikorisnika.php?id=KLJUC kada se klikne na ime korisnika. U vidikorisnika.php ide ovako nesto:

$id = mysql_real_escape_string($_GET['id']);

$result = mysql_query("SELECT * FROM korisnici WHERE id = '$id'");

if (mysql_num_rows($result))
{
$arr = mysql_fetch_array($result);
echo "Ime zeljenog korisnika je {$arr['ime']} a njegovo prezime {$arr['prezime']}";
}
else
echo "Nema korisnika sa sifrom $id";


U principu, ti strani vidikorisnika.php prosledjujes kljuc, po kome ce se traziti samo korisnik sa tim kljucem i ispisati njegovo prezime ( mysql_query("SELECT * FROM korisnici WHERE id = '$id'"); ).

holodoc
27.4.2009, 15:32
Ako smem da se nadovežem na Eclipse-ovo rešenje :)

S obzirom da se u daljem kodu koriste samo asocijativni ključevi (keys) za ispis rezultata nema potrebe da se koristi mysql_fetch_array koji po defaultu kreira niz i sa numeričkim i sa asocijativnim ključevima ($arr[0] je isto što i $arr['ime']) već bi ovde bio efikasniji samo mysql_fetch_assoc koji dobavlja samo asocijativni niz ($arr['ime']). Kod većih upita ovo može itekako da utiče na performanse.

Zatim, primarni ključ u koloni sa korisnicima bi najverovatnije bio autoinkrementirajući ceo broj (INT AUTOINCREMENT) pa bi po meni kod trebao da izgleda ovako
$result = mysql_query("SELECT * FROM korisnici WHERE id=".mysql_real_escape_string((int) $_GET['id']);
Ovde sam uklonio dodatnu promenjljivu jer nepotrebno zauzima memoriju i uklonio jednostruke navodnike zato što se u bazi referencira kolona koja je tipa broj. Dodatno sam zbog sigurnosti izvršio cast-ovanje id-a koji je očigledno broj da bi se dodatno osigurao kod.

Dakle gore Eclipse-ov kod će raditi ok ali ovo je eto čisto malo optimizovano ;)

Usput... Za ozbiljniju sigurnost brinu se po engleski prepared statemnets i stored procedures pa koga više interesuje neka se pozabavi malo tom tematikom ;)

EclipsE
27.4.2009, 15:38
Ma meni je navika da pishem mysql_fetch_array :) Inache, konachno da mogu da ispravim holodoca! Zashto mysql_real_escape_string kada si vec castovo u int? :P
Obzirom na to da ako si imao 5' OR 1 = 1 -- castovanjem u int dobijesh 5 i nema potrebe za escape-om :)

holodoc
27.4.2009, 17:39
Inache, konachno da mogu da ispravim holodoca! Zashto mysql_real_escape_string kada si vec castovo u int? :P
Obzirom na to da ako si imao 5' OR 1 = 1 -- castovanjem u int dobijesh 5 i nema potrebe za escape-om :)
I kakav upit dobiješ kada id ima vrednost 5' OR 1 = 1? :)
Tvoj upit u tom slučaju izgleda ovako:
"SELECT * FROM korisnici WHERE id=5"
i to je u redu jel tako?

A šta dobiješ ako id dobije vrednost mama+tata?

Bez kastovanja u int dobio bi sledeći neispravan upit:
"SELECT * FROM korisnici WHERE id=mama+tata"
dok eksplicitno kastovanje u ceo broj ovde ima za cilj da takav izraz uvek pretvori u
"SELECT * FROM korisnici WHERE id=0" koji je potpuno validan samo neće vratiti rezultat ;)

Nadam se da si primetio iz prethodnog posta da sam uklonio jednostruke apostrofe oko vrednosti za id tako da se sada id u SQL upitu smatra brojem ;)

Mnogo bolja i čak sigurnija varijanta od raznih escapeovanja su pripremljeni upiti (prepared statements). Napisao sam kod koji radi apsolutno isto što i ovaj iznad korišćenjem pripremljenih upita ;)
<?php
define('DB_HOST', 'localhost'); //hostname na kome se nalazi MySQL server
define('DB_USERNAME', 'username'); //korisnicko ime na MySQL serveru
define('DB_PASSWORD', 'lozinka'); //lozinka za korisnika
define('DB_NAME', 'table'); //naziv tabele u kojoj se nalaze podaci

$conn = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD); //nova konekcija sa savremenijom mysqli ekstenzijom
$conn->select_db(DB_NAME); //izbor baze
$stmt = $conn->prepare("SELECT ime, prezime FROM korisnici WHERE id = ?"); //priprema upita
$stmt->bind_param("i", $_GET['id']); //vezivanje parametra za pripremljeni materijal
$stmt->execute(); //izvrsenje upita
$stmt->bind_result($ime, $prezime); //vezivanje rezultata za promenjljive

/*
* Petlja iscitava sve rezultate upita
*/
while($stmt->fetch()) {
printf("%s %s\n", htmlentities(ucfirst($ime), ENT_QUOTES, 'utf-8'), htmlentities(ucfirst($col2), ENT_QUOTES, 'utf-8'));
}
?>

EclipsE
27.4.2009, 17:53
Nisam ja rekao da se ne castuje u int, vec da nema potrebe za escapeovanjem ulaza koji je vec castovan u int :D

holodoc
27.4.2009, 18:10
Nisam ja rekao da se ne castuje u int, vec da nema potrebe za escapeovanjem ulaza koji je vec castovan u int :D
Ima potrebe itekako ima potrebe ;)

Ovo od primera sa apostrofima koje si koristio za "čačkanje" sajta na "injektibilnost" su zaista najprostiji primeri pokušaja napada. Daleko ozbiljniji tipovi napada su napadi koji koriste različite vrste propusta u enkoding sistemima među kojima su najpopularniji napadi sekvencama dalekoistočnih karaktera koji se "injektuju" u zahteve za stranicama. Ovo je poprilično interesantna priča i jedan interesantan članak imaš recimo ovde (http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string) mada je net punih ovakvih članaka.

Generalno pravilo glasi. Sve od parametara upita što dolazi od strane posetioca treba provući kroz mysql_real_escape string bio to broj ili string a usput se treba pobrinuti da server baze dobije upravo onaj tip podataka koji je naveden u relaciji tabele. Dakle ukoliko se zahteva string idu jednostruki navodnici a ukoliko se zahteva broj navodnika nema.

sava88
27.4.2009, 19:25
Ok, hwala probacu nesto... znaci moram da isprogramiram stranicu vdikorisnika.php da ubaci ono sto se trazi iz linka sa neke druge stranice ili odredjene... Imam instaliran wamp server tako da cu da probam odmah.. hwala... probacu i ako ne uspem obraticu se ponovo... pozzz

holodoc
27.4.2009, 19:42
Ok, hwala probacu nesto... znaci moram da isprogramiram stranicu vdikorisnika.php da ubaci ono sto se trazi iz linka sa neke druge stranice ili odredjene... Imam instaliran wamp server tako da cu da probam odmah.. hwala... probacu i ako ne uspem obraticu se ponovo... pozzz
Slobodno iskoristi Eclipse-ovo rešenje a nakon toga baci pogled na moje postove da vidiš kako možeš da kod još malo poboljšaš sa stanovišta sigurnosti pre svega ;)

sava88
27.4.2009, 19:54
e ovako imam tabelu persons, ime database proba
u tabeli imam
personID FirstName LastName Age
1 ime1 prezime1 1
2 ime2 prezime1 2
3 ime3 prezime2 3 itd...

ovako mi stampa direktno na strani prezime i ime...
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Nije konektovano: ' . mysql_error());
}
mysql_select_db("proba", $con);
$result = mysql_query("SELECT * FROM Persons");
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'] . " " . $row['LastName'];
echo "<br />";
}
mysql_close($con);
?>
ako moze neko molim vas da mi odradi taj kod za stanicu sa koje se poziva npr personID 2 i da na osnovu toga odstampa na stranici prikaz.php ime2 prezime2 i godine2, ako nije problem pls. Unapred hwala

EclipsE
27.4.2009, 20:03
Mislim da bi mogao sam to da odradis... inache nikad neces nauchiti :)

sava88
27.4.2009, 20:12
Znam to brate, mogu da ti napisem sta sam probao ali mi stalno izbacuje greske, treba neko malo da me pogura, a ja cu to svremenom nauciti, inace mnogo bi mi dosla vasa pomoc ako uspem ovo sto hocu necu da zaboravim na vas... imam neke planove da napravim wap sajt sa karakteristikama mobilnih telefona, e sad da radim u htmlu, treba mi sto godina i 2000 stranica sto je mukotrpno i pretesko, ovako bih napravio databazu i povlacio bih sve sto mi treba iz nje. Ajd ako neko moze da mi to odradi uplaticu mu kredit na mob samo neka mi napise kod i ako radi ja cu da mu uplatim kred... moj mail doomaxy (at ) gmail (dot) com, pa ce da se dogovorimo,ne trazim ja to dzabe da mi odradi neko, a bilo bi mnogo dobro ako neko hoce da mi odradi to i dzabaka... :) pozz

holodoc
27.4.2009, 20:17
Postavi kod koji si koristio pa ćeš dobiti instrukcije gde potencijalno grešiš. Ovako em niko na forumu neće ništa naučiti em ćeš ti pomisliti da su organizovanje projekta i rad na projektu ista stvar pa ćeš ti izgubiti ;)

sava88
27.4.2009, 20:39
Napravio sam kod otprilike koji treba da bude stranica nokia.php na kojoj treba da se prikaze ono sto trazim, naravno koristio sam gore pomenutu tabelu persons i databazu nokia:

<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Nije konektovano: ' . mysql_error());
}

$id = mysql_real_escape_string($_GET['id']);

mysql_select_db("nokia", $con);
$result = mysql_query("SELECT * FROM persons WHERE personID = '$id'");

if (mysql_num_rows($result))
{
$arr = mysql_fetch_array($result);
echo "Ime zeljenog korisnika je {$arr['FirstName']} a njegovo prezime {$arr['LastName']}";
}
else
echo "Nema korisnika sa sifrom $id";
mysql_close($con);
?>

E sad sam napravio stranicu nokiaindex.php sa koje se poziva nokia.php
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("nokia", $con);
echo "<a href='nokia.php?id={$arr['1']}'>{$arr['FirstName']}</a>";
?>

E sad mi javlja gresku: Notice: Undefined variable: arr in C:\wamp\www\nokiaindex.php on line 9... sta je problem...

holodoc
27.4.2009, 20:59
Au bre sve si ti ovo izmešao :)

Grešku ti prijavljuje zato što pokušavaš da koristiš promenjljivu $arr koja ne postoji u drugom fajlu a koju si definisao u prvom fajlu. Da bi mogao da koristiš istu tu promenjljivu moraš i u drugom fajlu da napraviš upit ka bazi i rezultate upita smestiš u promenjljivu $arr kako si to uradio u prvom slučaju.

sava88
27.4.2009, 21:46
Hvala u svakom slucaju... moracu jos da ucim ipak ne studiram informatiku i ne mogu ovo da znam... probacu nesto da naucim, a onda cu valjda da shvatim malo logiku svega ovoga.... citao sam malo neke php skolice ali to su neke osnove nema bas konkretnih primera... pozzz