Czy gdybyś miał piętnaście pól do wypełnienia, nadal wszędzie kopiowałbyś ten sam kod htmlentities
?
Poza tym w dalszym ciągu to jest tylko obejście problemu, a nie jego naprawienie - poczytaj o bindowaniu danych w PDO.
Co do modelu anemicznego, zastanawiam się, czy funkcji odpowiadających za walidację nie przenieść właśnie do klasy jako metody
Tak, wydziel tam.
pojawia się pytanie: na ile bezpieczna jest w tym momencie całość i czy można to jeszcze usprawnić?
Tak, zastosuj ORM ;-)
Albo przynajmniej wydziel odrębną warstwę dostępu do danych, cobyś nie musiał ręcznie klepać każdego zapytania (hasła kluczowe: data access object
, table gateway pattern
, orm
, mvc
).
Na przykład utwórz sobie obiekt UserTable
(czy tam UserDAO
, czy też jakakolwiek tam nazwa powoduje u Ciebie erek, ehm - zdania wśród programistów są podzielone), w którym to dopiero będzie istnieć metoda createUser
wykonująca zapytania - dzięki temu nie będziesz musiał klepać zapytań w Twoich a'la serwisach.
Luźny przykład, aby pokazać o czym myślę:
<?php
class UserDao
extends GenericDao {
/**
* @param string $login
* @param string $password
* @return int|null
*/
public function createUser($login, $password) {
$stmt = $this->db->prepare('INSERT INTO `users` (login, password) VALUES (:login, :password)');
$stmt->bindValue('login', $login);
$stmt->bindValue('password', $password);
if ($stmt->execute()) {
return $this->db->lastInsertedId();
} else {
return null;
}
}
}
/* ----- gdzieś dalej w kodzie ----- */
if ($validateFlag) {
$result = $connection->query('...');
// ...
$userDao = new UserDao();
if (!$userDao->createUser($user->getLogin(), $user->getPassword()) {
throw new Exception('Nie udało się utworzyć użytkownika, szory.');
}
echo 'Cieszmy się i weselmy!';
}
Zauważ, że zmierzamy do rozbijania problemu na coraz mniejsze części - w mojej wersji na pierwszy rzut oka widać, co się dzieje, i jest - na oko - milion osiemset sześćdziesiąt trzy razy łatwiejsza do debugowania, ponieważ można skupić się na tym, co dany fragment kodu robi (widać, że tworzy użytkownika), a nie jak to w danym momencie się dzieje (wykonywane jest zapytanie).
Polecam poczytać właśnie o tym, jak poszczególne frameworki rozwiązują problem mapowania tabel na obiekty, zanim zabierzesz się za pisanie czegoś większego - zaoszczędzisz sobie wielu kłopotów :-)
PS dlaczego w Twoim zapytaniu jest groupId
, lecz już metoda brzmi getGroupType
? Wszystko powinno mieć wspólne nazewnictwo - zmniejsza to szansę na pomylenie metod oraz kolizję nazw.
PPS bardziej haxi0rskie byłoby dodatkowo nie tworzenie ręcznie zapytania w ogóle, tylko napisanie sobie klasy która potrafi robić to sama - ale to zostawiam Ci jako zadanie ;-)