Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: QueryBuilder
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
skowron-line
Witam, proszę o ocenę querybuildera.
Klasa nie jest w pełni przetestowana, ale chętnie już teraz poczytam wasze uwagi, krytykę, pochwały.
Kod dostępny jest pod adresem http://skowronline.pl/qb/source.php a jutro postaram się wrzucić przykłady użycia.

Pozrawiam
wookieb
Testy jednostkowe będą?
nospor
Rzuciłem okiem tylko pobieżnie na to (chwilowo brak czasu) ale od razu rzuciło mi się w oczy konstrukcje jak ta:
"\nSET"

Czemu specjalnie dodajesz nowe linie do zapytan? Najlepiej jest unikać enterów w zapytaniach, a ty je spacjalnie wkładasz.
Czy to ma służyć tylko temu, by potem robiąc
echo $sql;
można było ładnie zobaczyć jak zapytanie wygląda?

Edit:
tu masz blad:
$direction_array = array('ASC, DESC');
powinno byc:
$direction_array = array('ASC', 'DESC');
skowron-line
Cytat
Testy jednostkowe będą?

Raczej nie, przynajmniej nie teraz.

@nospor wychwyciłem ten błąd wcześniej tylko nowej wersji nie wgrałem na serwer, a co do enterów to masz racje po to one są. Ale poprawie to, dzięki za uwagę.

EDIT:
zrobiłem up na nową wersję.
phpion
Ja albo jestem jakiś nawiedzony, albo nie wiem co - wszędzie widzę wpływy Kohany smile.gif nie wmówisz mi, że kohanowa klasa Database nie była źródłem natchnienia winksmiley.jpg

Kod przejrzałem i co mi się rzuciło w oczy:
Linia 71.
  1. public function select($columns = '')

Dobrze by było jako domyślną wartość podstawiać '*', a nie ''.

Linia 73.
  1. if(is_object($columns) OR trim($columns) == '*')

Czy to przypadkiem nie wywali błędu gdy $column będzie tablicą? trim() na tablicy?

Linia 389.
  1. public function limit($limit, $offset = '')

Domyślną wartością dla $offset ładniej by wyglądał NULL, a nie pusty ciąg.

Metody execute(), count(), first() tworzą nowe obiekty QueryResults wykonując za każdym razem zapytanie. Czyli by je wykonać i pobrać liczbę rekordów trzeba 2x wykonać to samo zapytanie.

Brak linii bo się numerowanie skończyło biggrin.gif :
  1. public function __toString()
  2. {
  3. return (string) $this->expression;
  4. }

Nie rzutuj zwracanej wartości na stringa. Zwróć dokładnie to, co dostałeś. Wstawiasz inta to zwróć inta, a nie string (WHERE id = 1 jest DUŻO szybsze od WHERE id = '1').

* Teraz zauważyłem: numerowanie linii się rozjeżdża z racji różnicy wielkości czcionek :/
skowron-line
Cytat
Ja albo jestem jakiś nawiedzony, albo nie wiem co - wszędzie widzę wpływy Kohany
To może się skończyć pobytem w miejscu odosobnienia smile.gif
Cytat
smile.gif nie wmówisz mi, że kohanowa klasa Database nie była źródłem natchnienia
Nie ma zamiaru wmawiać, nie powiem zaglądałem do Kohany ale również do Zend -a i innych FW.
Cytat
Czy to przypadkiem nie wywali błędu gdy $column będzie tablicą? trim() na tablicy?
nie.

Cytat
Domyślną wartością dla $offset ładniej by wyglądał NULL, a nie pusty ciąg.
Oczywiście poprawię to.

Cytat
Metody execute(), count(), first() tworzą nowe obiekty QueryResults wykonując za każdym razem zapytanie. Czyli by je wykonać i pobrać liczbę rekordów trzeba 2x wykonać to samo zapytanie.
Wiele rzeczy wymaga poprawy i ponownego przemyślenia, i to są właśnie te rzeczy pisałem to tak na szybko bo potrzebne mi to było "na wczoraj" stąd też takie babole.


Może coś warto dopisać, coś poprawić questionmark.gif (na pewno do poprawy jest cały where)
Crozin
Cytat
Domyślną wartością dla $offset ładniej by wyglądał NULL, a nie pusty ciąg.
Raczej zero, nie null. Dodatkowo upraszcza to kod, bo nie trzeba przewidywać dwóch sytuacji (z i bez OFFSET).

Niestety jak większość QB i ten spisze się co najwyżej przy najprostszych zapytaniach.
wookieb
Cytat
  1. protected function query_compile()


Kompilujesz zapytanie czy je składasz? Bo to cholerna różnica.

Dlaczego protected? Jak chcę pobrać treść zapytania to muszę przekonwertować na stringa :/

Nie mamy klasy QueryResults więc wiele metod nie będzie działać.
Dlaczego QueryBuilder zawiera metody do wykonywania zapytania?
Jak działa u Ciebie wykonywanie "count" ?

Cytat
Czy to przypadkiem nie wywali błędu gdy $column będzie tablicą? trim() na tablicy?

Oczywiście, że wywali
  1. $columns = array('test', 'ziom');
  2. var_dump(is_object($columns) OR trim($columns) == '*');

Notice: Array to string conversion
skowron-line
Cytat
Kompilujesz zapytanie czy je składasz? Bo to cholerna różnica.
No różnica, różnica.
Cytat
Nie mamy klasy QueryResults więc wiele metod nie będzie działać.

Bo to paździerz i nie warto było tego tu wrzucać.
Cytat
Dlaczego QueryBuilder zawiera metody do wykonywania zapytania?
Zawiera metody które tworzą obiekt QueryResults i tam jest wykonywane zapytanie.
wookieb
No ale dlaczego? Skoro klasa ma budować zapytania a nie je wykonywać...
skowron-line
Cytat(wookieb @ 21.10.2010, 09:19:24 ) *
No ale dlaczego? Skoro klasa ma budować zapytania a nie je wykonywać...

Prawda klasa ma budować zapytania. Jak uważasz że powinno to być rozwiązane.
wookieb
Tzn, że nie ma mieć nic wspólnego z ich wykonywaniem. Wywal te metody i pobieraj wyniki tylko za pomocą QueryResults.
Nadal nie powiedziałeś jak robisz tego counta.
skowron-line
  1. $qb = new QueryBuilder;
  2. //(..)
  3. $results = new QueryResults;
  4. $results->execute($qb);

Nie wpychać w metody QB.

Z count to zwykły num_rows.
wookieb
No i tak jest ok.

A masz jakąś metodą do transformowania zapytania na takie zliczające wszystkie rekordy?
skowron-line
Cytat(wookieb @ 21.10.2010, 10:05:10 ) *
No i tak jest ok.

Na 100% to poprawie, przy wprowadzaniu następnych zmian, napisz co jeszcze wymaga zmiany.
Cytat
A masz jakąś metodą do transformowania zapytania na takie zliczające wszystkie rekordy?
tzn questionmark.gif robiące COUNT ? takich brak jak na razie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.