Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Templatowanie zapytań SQL w php
sniver
post
Post #1





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

Ostrzeżenie: (0%)
-----


Zazwyczaj gdy spotykam kody różnego pokroju w PHP to czesto warstwa logiczna od wyglądu jest oddzielona.
Pal licho jeśli obsługa np. mysql'a jest w jakiś przystępny sposób zrobiona i do tego ktoś wykorzystał np. pdo i "przygotowywanie zapytań".

Ale często spotykam się też z kodami gdzie zapytanie jest przygotowywane strukturalnie i dość często przy nieco bardziej złożonych mam problemy z ich rozszyfrowaniem (IMG:style_emoticons/default/blinksmiley.gif)

Powstaje więc pytanie czy: warto oddzielić tę warstwę (jeśli taka istnieje) bazy danych - czyli to gdzie te duperele są obsługiwane i wypisać zapytania tak by znajdowały się w oddzielnym pliku i stworzyć coś na wzór smarty?

Dla przykładu zapytanie
  1. SELECT
  2. `nazwa`,
  3. `opis`,
  4. `zdjecie`
  5. FROM
  6. `jakasTabela`
  7. {IF $id}
  8. WHERE
  9. `id` = {$id}
  10. {else}
  11. ORDER BY `id` DESC
  12. LIMIT 0, 30
  13. {/IF}


i np. taki kod w php który to przetworzy i wyciągnie zapytanie np. z xml:

  1.  
  2. $zapytanieOdczytaneZPlikuXML = ...;
  3.  
  4. $dbPattern = new ParserSQL;
  5. $dbPattern->assign('id', 123);
  6.  
  7. $dbPattern->parse( $zapytanieOdczytaneZPlikuXML );
  8.  
  9. // Wypisujemy te zapytanie na ekran
  10. var_dump( $dbPattern->model );
  11.  
  12. //..dalsza część skryptu...
  13.  


Pytanie czy warto czy nie warto?
Co ważne czy tak przygotowane zapytania były by wygodne w "obróbce", zmianach?
Czy przeciętny PHPMaster wiedział by o co w tym chodzi?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Zyx
post
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Już na wejściu robicie ten sam błąd, co twórcy 98,9% systemów szablonów dla warstwy widoku: udostępniacie ograniczony pozdbiór języka PHP, który będzie do wyrzucenia po napotkaniu pierwszego trudniejszego problemu. Ani to nie będzie przez to bardziej czytelne, ani łatwiejsze w użyciu. Mnożone są niepotrzebnie byty: zapytań SQL w serwisie może być bardzo dużo, nie tworzą one aż tak samodzielnej całości. Z punktu widzenia czytelności kodu lepszym rozwiązaniem jest, aby były one generowane mniej więcej w miejscu wywołania, a nie trzymane gdzieś w zupełnie innym katalogu. Nie wiem, najprawdopodobniej da się stworzyć coś fajnego dla zapytań opartego na szablonach mniej więcej na wzór OPT, by to faktycznie w czymś pomagało, ale w takim kształcie szkoda zachodu. Już obiektowy query builder jest bardziej przydatny, bo przynajmniej operuje się na zapytaniu jak na obiekcie i można go przekazać do jakiegoś innego elementu, by ten go czymś jeszcze obudował... proponuję znaleźć choć jedną funkcjonalną różnicę między poniższymi kodami:

  1. class Model
  2. {
  3. public function pobierzListe($dane)
  4. {
  5. $query = 'SELECT * FROM costam';
  6. if(warunek1)
  7. {
  8. $query .= ' INNER JOIN cos_innego ON costam ';
  9. }
  10.  
  11. if(warunek2)
  12. {
  13. $query .= 'WHERE a = b';
  14. }
  15. return $this->execAndReturn($query);
  16. } // end pobierzListe();
  17. } // end Model;


Od:

Kod
SELECT * FROM costam
{if warunek1}
INNER JOIN cos_innego ON costam
{/if}
{if warunek2}
WHERE a = b
{/if}

+ klasa opakowująca.

Przykład nieco trudniejszy: warunków może być "n", w tym także 0 - wtedy "WHERE" nie powinno być generowane. Taka uproszczona składnia już w tym miejscu albo leży, albo dostajemy gigantycznego ifa z konkatenacją np. 50 warunków, które później są szczegółowo powtarzane.

Ten post edytował Zyx 19.11.2009, 16:38:38
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 9.10.2025 - 19:35