PHP warstwy abstrakcji

Witam,

dostałem zadanie na studiach o treści:

Przygotuj abstrakcyjny interfejs dla bazy danych, który będzie rozszerzeniem przyklad.php. Modyfikacja powinna polegać na tym, że zamiast funkcji query mają się pojawić funkcje query dla zapytań typu select oraz execute dla zapytań typu insert, update i delete. Obie funkcje mają sprawdzić, czy przekazane do nich zapytania są odpowiednie do przeznaczenia danej funkcji. Dodatkowo funkcja query ma zwracać obiekty klasy Resource, a funkcja Execute liczbę wierszy, na którą wykonanie zapytania miało wpływ (affected rows)

Jeśli dobrze rozumiem to trzeba zrobić podobnie jak w języku C++ przeciążenie funkcji. Np:
function query(zapytanie SELECT) {}
function query(zapytanie UPDATE) {}

Nie wiem czy dobrze zrozumiałem to polecenie, dlatego zwracam się do Was, jak prawidłowo powinno wyglądać rozwiązanie tego zadania. Będę bardzo wdzięczny za naprowadzenie mnie na rozwiązanie oraz jeżeli myśle poprawnie to jak zaimplementować w PHP ww przeciążenia

Zadanie jest bez sensu i ma chyba zrobić tylko wodę z mózgu bo na pewno niczego nie nauczy. A na pewno niczego związanego z dobrymi praktykami.

W PHP nie masz możliwości przeciążania funkcji/metod.

Musisz zrobić funckje np.: querySelect, queryDetele, queryInsert itd. Które tylko będą przyjmowały zapytanie konkretnego typu.
Czyli właściwie robisz w tej funkcji ifa którym sprawdzasz czy zapytanie jest dobre, jak tak to wywołujesz jak do tej pory query i masz zrobione zadanie ;d. Dosłownie 5 minut roboty.

Generalnie nie podaję gotowych rozwiązań zadań, bo mają one czegoś uczyć, ale to jest wyjątkowo głupie i dodatkowo kod który masz jako przykład zawiera masę błędów i złych praktyk, więc lepiej będzie jak się ich nie nauczysz.

Masz całkowitą rację. Początkowo zastanawiałem się o co w ogóle w nim chodzi, ale dzięki Tobie już wiem.

Zrobiłem już większą część tego zadania, ale mam problem z dodawaniem do bazy danych. Zawsze gdy wykonuję polecenie INSERT to w bazie pojawiają się zdublowane dane. Już 4 raz śledzę kod i nie mam pojęcia dlaczego tak się dzieje. Mógłbyś zerknąć, bo może czegoś nie dostrzegam?

Zadanie

Mogę się mylić bo tak jest napisane dziwnie zadanie, ale moim zdaniem powinieneś mieć wiele funkcji query i je wywoływać z odpowiednim zapytanie, coś takiego:

public function queryInsert($q)
    {
        if(stristr($q, 'INSERT'))
        {
            $ins = $this->_connection->query($q);
            $ins->execute();
        }
    }

Poza tym robisz często przerost formy nad treścią:

function remove()
{
    $remove = $_GET['rem'];
    $db = new database();
    $db->connect();
 
    if($db->query("SELECT Lp FROM Dane WHERE Lp = $remove") != "")
    {
        $db->query("DELETE FROM Dane WHERE Lp = $remove");
        updateLp($remove);
    }
}

Nie musisz sprawdzać czy w tabeli są dane o Lp do usunięcia, od razu możesz robić remove, jak ich nie ma to nic nie usunie.

Moim zdaniem to stristr($q, 'UPDATE') nie jest najlepsza metoda w tym przypadku na sprawdzanie rodzaju zapytania. Jeśli chodzi o podwójne dodawanie do bazy to co podajesz w $name = $_GET["name"];?

Jeszcze raz zerknąłem w kod, problem może być taki, że wysyłasz dane do dodania GETem i przez to formularz przekierowuje Cię do index.php?name=asdas i gdy robisz kolejną akcję możesz dalej zostać na tej stronie i wykonać znów dodawanie, lub odświeżając stronę znów dodajesz dane. Proponuję zmienić na POST, tym bardziej, że tak łatwiej będzie Ci wysłać więcej danych do dodania.