Filtrowanie danych z MySQL i generowanie JSON

0

Hej. Życie zmusiło mnie do PHP :)
A serio to dopiero zaczynam i za bardzo nie wiem jak szukać rozwiązania mojego problemu.
Mam bazę MySQL, jedna tabela z kolumnami: id, tytuł, autor, rok
Mój skrypt wygląda tak:

<?php 
	$connection = mysqli_connect("***","***","***","***") or die("Error " . mysqli_error($connection));
	$rok = $_GET["rok"];
	$query = "Select * from artykuly where rok = ($rok)";
	$result = mysqli_query($connection,$query);
	while ($row = mysqli_fetch_assoc($result)) {
		$array[] = $row;	
	}
	header('Content-Type:Application/json');
	echo json_encode($array);
  
 ?>

Po wpisaniu w przeglądarkę np nazwa.serwer.pl/test/index.php?rok=2018
wyświetla :
[{"id":"29","tytul":"aaa","autor":"bbb","rok":"2018"},{"id":"30","tytul":"aaa","autor":"bbb","rok":"2018"},{"id":"31","tytul":"aaa","autor":"ccc","rok":"2018"}]

Chciałbym aby wynik dodatkowo przefiltrować po autorze ale nie mam pojęcia jak to zrobić.
Reasumując :) co zmienić w skrypcie (pewnie trzeba dodać drugą zmienną i zmienić coś w $query) i jak utworzyć adres url aby wyświetlił się wynik dla artykułów napisanych w 2018 przez bbb?
[{"id":"29","tytul":"aaa","autor":"bbb","rok":"2018"},{"id":"30","tytul":"aaa","autor":"bbb","rok":"2018"}]

2

Dobrze kombinujesz - do łączenia warunków w zapytaniu masz AND - https://www.w3schools.com/sql/sql_and_or.asp

Do wywołania skryptu dodajesz drugą zmienną - bedzie to wyglądać tak: nazwa.serwer.pl/test/index.php?rok=2018&autor=zenon
Następnie - analogicznie do $rok, wyciągasz zmienną $autor z tablicy $_GET.
Później - zgodnie z linkiem podanym powyżej - dodajesz do zapytania SQL drugi warunek.

I jeszcze taka uwaga (wprawdzie nie dotyczy to ściśle tego, o co pytasz) - bezpośrednie pobieranie danych z tablic $_POST lub GET jest bardzo niebezpieczne - ktoś może tam wstawić jakiś złośliwy kod, który się wykona na bazie. Nazywa się to SQL injection - https://pl.wikipedia.org/wiki/SQL_injection

0

ok robie coś takiego"

<?php 
    $connection = mysqli_connect("***","***","***","***") or die("Error " . mysqli_error($connection));
    $rok = $_GET["rok"];
    $autor = $_GET["autor"];
    $query = "Select * from artykuly where rok = ($rok) AND autor = ($autor)";
    $result = mysqli_query($connection,$query);
    while ($row = mysqli_fetch_assoc($result)) {
        $array[] = $row;    
    }
    header('Content-Type:Application/json');
    echo json_encode($array);
 
 ?>

i pytanie za milion :) jak ma wglądać url w tym przypadku?

1

Np tak

nazwa.serwer.pl/test/index.php?rok=2018&autor=Test

Dodatkowo zabezpiecz kod przed pustymi wartościami zmiennych oraz przed wstrzykiwaniem SQL.

0

Właśnie brakowało mi tego "&" w urlu bo gdzieś tam ze studiów pamiętałem trochę SQLa :)
Wszystko działa, serdecznie dziękuję :)

0

Tylko pytanie - po co robisz ten projekt?
Na użytek własny? W ramach jakiegoś zaliczenia albo jako jakiś "eksperyment", czy ma to być ogólnie dostępne?

Bo jeśli ma ta aplikacja być wystawiana na "widok publiczny" i różni ludzie mają do niej mieć dostęp, to pamiętaj o tym, co Chory Samiec oraz ja Ci pisaliśmy - musisz to zabezpieczyć. Obecnie w pół minuty można Ci całą bazę skasować (oraz pewnie porobić inne, równie niefajne rzeczy).

0

Na razie się uczę PHP.
Docelowo chcę tego użyć w aplikacji dla Androida.
Wygenerowanego przez skrypt JSONa bedzie pobierała aplikacja i wyświetlała dane.
Mógłbym sobie przefiltrować dane JSON w aplikacji ale po co ściągać niepotrzebne dane skoro można pobrać tylko te potrzebne. Stąd mój "pomysł".
Przykładowo w aplikacji zrobię EditTexty autor i rok, przypisze do nich zmienne np mRok i mAutor i a nastepnie dodam do url:
String mUrl = "nazwa.serwer.pl/test/index.php?rok=" + mRok + "&=" + mAutor;
Taki mam plan ;)

Użytkownik nie będzie znał adresu serwera a dane będą dodawane przez stronę www.

0

Rozumiem. Ale i tak zakładanie, że nikt nie będzie znał adresu, więc nie trzeba niczego zabezpieczać jest trochę naiwne.
Prawdopodobnie masz rację i nikt nie będzie kombinował. Ale ryzyko jest zawsze. Są ludzie, którzy dla sportu robią takie rzeczy - nasłuchują, jak się dana aplikacja komunikuje, podsłuchują treść pakietów itp. Niemniej - w dobrym tonie/zgodnie z przyjętymi zasadami jest filtrować przychodzące dane, zanim się je przerzuci do SQL'a.
Możesz to pominąć, ale pamiętaj, że zostałeś pouczony o potencjalnych konsekwencjach ;)

0

Nie no, jasne ale na tym etapie chcę uzyskać funkcjonalność. Jeśli wszystko będzie działało zgodnie z założeniami zadbam o bezpieczeństwo :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1