Witam
Chciałbym dorzucić mój problem do tego tematu.
Napisałem klasę, która w konstruktorze tworzy połączenie z bazą danych oraz zawiera metody insertQuery, selectQuery itd, które przygotowują zapytanie do bazy, wykonywane prywatną metodą doQuery. Wszystko chodziło pięknie, ale był problem, kiedy przyszło zagnieździć zapytanie do bazy w zapytaniu. Już tłumaczę:
Załóżmy, że mamy dwie tabele.
<?php
Tabela news:
ID int
title varchar(255)
text text
authorID
?>
<?php
Tabela administrators:
ID int
name varchar(40)
pass char(32)
?>
Tworzę sobie egzemplarz obiektu do obsługi bazy
<?php
$sql = new mySql(HOST
, USER
, PASS
, NAME
) ?>
Wyszukuję newsy w bazie:
<?php
$sql->selectQuery('title, time, authorID', 'news');
while($news = $sql->fetchResults())
{
//wyświetlam news
//tutaj musze wykonać coś takiego:
mysql_query('SELECT name FROM administrators WHERE id='.$news['authorID']);
}
?>
Tyle, że nie po to pisałem klasę, żeby używać mysql_query(). To jedna sprawa, druga jest taka, że jeśli zamiast mysql_query() użyję znów $sql->selectQuery to zmieni mi to zapytanie używane do przewijania wyników w linijce while($news=$sql->fetchResults(). Muszę więc tworzyć dodatkowy obiekt (a to jest drugie połączenie z bazą danych - coś, czego trzeba unikać).
Sprawę rozwiązałem tak, że wydzieliłem kod połączenia z bazą danych do klasy mySqlConnect, a zapytania do klasy mySqlQueries. Tworzę jedno połączenie z bazą, a potem odpowiednio do potrzeb tworzę obiekty odpowiadające za przygotowanie zapytań do bazy:
<?php
$sql = new mySqlConnect(HOST, USER, PASS, DBNAME);
$query_news = new mySqlQueries($sql->handler);
$query_author = new mySqlQueries($sql->handler);
$query_news->selectQuery('id, title, text, authorID', 'news');
while($news = $query_news->fetchResults())
{
//wyświetlanie newsa...
$query_author->selectQuery('name', 'administrators', 'id='.$news['authorID']);
$admin = $query_author->fetchResults();
//wyświetlenie nazwy autora newsa
}
$query_news->__destruct();
$query_author->__destruct();
?>
Tak to działa u mnie... tylko, że coś mi mówi, że to nie jest dobre podejście... Czy ktoś podejmie się oceny takiego rozwiązania i ewnetualnie wskaże mi bardziej właściwą drogę?
Pozdrawiam
Tarcil
PS. Przepraszam, jeżeli wciąłem się w złym temacie.