Pisząc generowanie stron w PHP, często piszę zestaw plików zaśmiecony zapytaniami do bazy danych. Na przykład mogę mieć zapytanie o pobranie niektórych danych dotyczących posta bezpośrednio z bazy danych w celu wyświetlenia na stronie, na przykład:
$statement = $db->prepare('SELECT * FROM posts WHERE id=:id');
$statement->bindValue(':id', $id, PDO::PARAM_INT);
$statement->execute();
$post = $statement->fetch(PDO::FETCH_ASSOC);
$content = $post['content']
// do something with the content
Te szybkie, jednorazowe zapytania są zwykle małe, ale czasami kończę na dużych fragmentach kodu interakcji z bazą danych, które zaczynają wyglądać dość niechlujnie.
W niektórych przypadkach rozwiązałem ten problem, tworząc prostą bibliotekę funkcji do obsługi moich pokrewnych zapytań db, skracając ten blok kodu do prostej:
$content = post_get_content($id);
I to świetnie. A przynajmniej dopóki nie będę musiał zrobić czegoś innego. Może muszę pobrać pięć najnowszych postów, aby wyświetlić je na liście. Cóż, zawsze mogę dodać inną funkcję:
$recent_posts = post_get_recent(5);
foreach ($recent_posts as $post) { ... }
Ale to kończy się na SELECT *
zapytaniu, którego zwykle tak naprawdę nie potrzebuję, ale często jest zbyt skomplikowane, aby można je było dość abstrakcyjnie. W końcu mam albo ogromną bibliotekę funkcji interakcji z bazą danych dla każdego pojedynczego przypadku użycia, albo szereg niechlujnych zapytań w kodzie każdej strony. I nawet gdy zbuduję te biblioteki, będę musiał wykonać jedno małe połączenie, którego wcześniej nie używałem, i nagle muszę napisać kolejną wysoce wyspecjalizowaną funkcję do wykonania tej pracy.
Jasne, mógłbym użyć funkcji do ogólnych przypadków użycia i zapytań do konkretnych interakcji, ale jak tylko zacznę pisać surowe zapytania, zacznę wracać do bezpośredniego dostępu do wszystkiego. Albo to, albo się lenię i zacznę robić rzeczy w pętlach PHP, które tak naprawdę powinny być zrobione bezpośrednio w zapytaniach MySQL.
Chciałbym zapytać osoby bardziej doświadczone w pisaniu aplikacji internetowych: czy zwiększenie łatwości konserwacji jest warte dodatkowych linii kodu i możliwych nieefektywności, które mogą wprowadzić abstrakcje? Czy po prostu użycie ciągów bezpośrednich zapytań jest akceptowalną metodą do obsługi interakcji z bazą danych?
select