Združeanje 2 tabel

Pozdravljeni,

poskusil sem že veliko načinov za združevanje vendar mi nikakor ne uspe. Iskanje sicer deluje, če se išče samo po eni tabeli. Ker pa želim iskati po temah in odgovorih istočasno pa mi ne uspe nastaviti.

$forumteme = 1 tabela za iskanje - (teme LIKE '%$isci%')
$forum
odgovori = 2 tabela - za iskanje (sporocilo LIKE '%$isci%')

Uporabljam pa sledečo kodo:

$forumtemapreveriiskanje = mysqlquery("SELECT * FROM $forumteme Where (teme LIKE '%$isci%') ORDER BY ID DESC LIMIT ".(int)($sprehajaj-$rezultatovnastrani).", ".(int)$rezultatovna_strani);

Sem poskusil tudi na ta način vendar mi kljub temu ni uspelo...

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;

18 odgovorov

Roll your own PDO PHP Class

vzemi si čas in si preberi celotni zgornji tutorial. Lepo je razloženo kako in zakaj + na koncu sam sebi sestaviš uporaben class za delo s podatki.

Skozi tutorial je tudi razloženo kako se s PDOjem izogneš SQL injectionu (metoda prepare())

mysql_ ukazi (mysqlconnect, mysqlquery, ...) so deprecated, kar pomeni, da njihova uporaba ni priporočljiva. Na žalost je veliko vodičev narejeno še po stari metodi in jih noben ne bo popravljal. Zadeva potem pripelje do takih primerov, kot ga imamo tukaj (:

Če potengemo črto, bo bolje, da uporabiš PDO oz. mysqli.

3

Hvala sikmajnd

Vodič sem si prebral vendar imam dva vprašanja. Ker mi bolje leži mysqli bi vas prosil, če mi lahko prosim poveste ali sem zadel z sql injection. Kot sem videl tudi na tej strani: http://www.php.net/manual/en/function.mysql-real-escape-string.php da se sql injection reši z ukazom mysqlrealescape_string? Ali je mogoče še kakšen ukaz. Ali mogoče kdo ve kako bi lahko to tudi testiral če deluje.

Se opravičuje ker toliko sprašujem vendar bi se zelo rad naučil in da dobim potrdila tudi od vas.

Hvala

mysqlrealescapestring spada med mysql deprecated ukaze. Če boš uporabljal mysqli, potem je ukaz za escapanje mysqlirealescape_string (pazi na i na koncu).

V tem primeru lahko uporabiš nekako takole:

$password = mysqli_real_escape_string($_POST['password']);

Glede na to, da si se odločil, da boš uporabljal mysqli, bi ti vseeno priporočal, da vzameš en class, ki ima že vključene vse potrebne metode. Recimo: PHP mysqli class

Zadeva ima kar precej plusov: manj možnosti napak, escapanje stringov je že urejeno, vse skupaj je dosti bolj berljivo, ...

1

Najboljše bi bilo, da si ogledaš kakšen abstraction layer za komunikacijo z bazami. Kakšen PDO bi bil verjetno zate čisto primeren in za tvoje potrebe povsem zadosten.

1

Hvala za veliko pomoč. Samo še to bi vprašal potem pa na delo :). Ali je potrebno zaščiti samo $POST in $GET ali je potrebno zaščititi tudi javo script ( preko jave nimam nič posebnega, kar bi bilo povezano z mysql ). Saj preko programa NETsparker dobim nasledno napako '"--></style></scRipt><scRipt>alert(0x002336)</scRipt> (important)

@Vini Ta isto sem mu že jaz priporočal, pa se je odločil, da se bo držal mysqli-ja (:

@Klopar javascript se uporablja samo za validacijo, ki je prijaznejša uporabnika. Prikazovanje napak prez osveževanja - validacija obveznih polj, prikaz "moči" gesla, pravilnost emaila, .. To validacijo je tudi precej lahko obiti in se ne gre zanašati nanjo. Server side validacija all the way.

1

Hvala sikmajnd. Preden pa nadaljujem z delom bi vas še vprašal ali bi tale koda bila dovolj za prijavo in ali delam prav SQL inject, saj sem videl da je več primerov...

//POVEZAVA Z MYSQLI
mysqliselectdb($povezavamysql,"$prijavatabela");

$uporabniskoime = stripslashes($uporabniskoime);

// Kodiraj geslo
$kodirano_geslo = md5($geslo);

$uporabniskoime = $povezavamysql->realescapestring($uporabniskoime);
$kodirano
geslo = $povezavamysql->realescapestring($kodiranogeslo);

$preveriuporabnikeizbaze = "SELECT * FROM $prijavatabela WHERE uporabniskoime='$uporabniskoime' and geslo='$kodiranogeslo'";
$izpisi
stevilovrstic = $povezavamysql->query($preveriuporabnikeiz_baze);