Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> wyrażenie pobierające nazwy tabel z zapytania
nospor
post 2.09.2011, 12:29:40
Post #1





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6296
Dołączył: 27.12.2004




Muszę wybrać nazwy tabel z dowolnego zapytania.
Interesuje mnie każda nazwa tabeli czy to jest w podzapytaniu czy w zapytaniu głównym w join czy w czym kolwiek innym
Tabele jak to tabele mogą mieć różne postacie
tabela
baza.tabela
`tabela`
`baza`.`tabela`
mogą być po FROM, po JOIN po FROM z przecinkami i kupa różnych kombinacji.

Męczę teraz to wyrażenie ale może ktoś już musiał kiedyś robić coś podobnego i może się wiedzą podzielić?
A może jakieś podpowiedzi? Zastanawiam się w ogóle, czy da się to jednym wyrażeniem pobrać, czy nie trzeba będzie zrobić ich więcej.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
tolomei
post 2.09.2011, 12:44:21
Post #2





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

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


Zerknij sobie tutaj: http://www.phpclasses.org/package/5007-PHP...amatically.html
Nie używałem - tylko wyszperałem.

Pozdro


PS. Także tutaj coś jest: http://riceball.com/d/content/sql-expressi...ser-and-builder

Ten post edytował tolomei 2.09.2011, 12:52:18


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
luckyps
post 2.09.2011, 12:58:57
Post #3





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


A może spróbować w ten sposób:

Wybrać z bazy danych nazwy wszystkich tabel i sprawdzić, które znajdują sie w zapytaniu...
Go to the top of the page
+Quote Post
Fifi209
post 2.09.2011, 13:49:46
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


A jeżeli w zapytaniu użyje aliasu?


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
luckyps
post 2.09.2011, 14:15:52
Post #5





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


Cytat(Fifi209 @ 2.09.2011, 14:49:46 ) *
A jeżeli w zapytaniu użyje aliasu?

No i co z tego questionmark.gif
Go to the top of the page
+Quote Post
gac3k
post 2.09.2011, 14:36:06
Post #6





Grupa: Zarejestrowani
Postów: 90
Pomógł: 8
Dołączył: 28.07.2009

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


a w jakimś orm-ie, nie ma gotowego rozwiązania żeby je ewentualnie podpatrzeć i zaimplementować? Propel, Doctrine? Zdaje mi się że domyślny ORM Kohany też będzie pomocny.

Ten post edytował gac3k 2.09.2011, 14:43:28
Go to the top of the page
+Quote Post
nospor
post 5.09.2011, 13:22:18
Post #7





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6296
Dołączył: 27.12.2004




Cytat
Wybrać z bazy danych nazwy wszystkich tabel i sprawdzić, które znajdują sie w zapytaniu...
A jeśli w zapytaniu będą takie tabele, których nie mam w bazie? Je też chcę wyłapać.

@tolomei dzięki za linka, przejrzę i dam znać co z tego wynikło.

Jakieś inne sugestie?

@tolomei pierwszy link radzi sobie nawet ładnie z prostymi zapytaniami. Niestety gdy pojawia się podzapytanie to się wywala
drugi link zaś nie zawiera wszystkich kodów. Niby autor wspomina, że udostępni całość gdzieś później ale nigdzie nie udało mi się całej paczki zlokalizować.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
webdice
post 5.09.2011, 13:58:12
Post #8


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




EDIT: Mała poprawka co do kodu na FB.

  1. preg_match_all( '#(FROM|LEFT\sJOIN|RIGHT\sJOIN|INNER\sJOIN|CROSS\sJOIN|INTO)\s?(`?([^\s`]+)`?\.)?`?([^`\(\)\s]+)#i', $query, $result );


Nie wiem do czego to potrzebujesz, ale przyszło mi do głowy jeszcze jedno rozwiązanie. Mianowicie EXPLAIN, z tym że pokazuje aliasy zamiast nazw tabel.

EDIT: Jeszcze drobne poprawki, bo ludzie różnie zapisują zapytania.
Go to the top of the page
+Quote Post
nospor
post 5.09.2011, 18:34:11
Post #9





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6296
Dołączył: 27.12.2004




$q = 'select * from `tab1`,tab2';
Najprostrze zapytanie i już nie działa na tym wyrażeniu. Obawiam się, że jednym wyrażeniem regularnym tego się nie uda zrobić.

Co do explain to nie mogę tego użyc bo:
1) explain działa tylko na tabelach, które są w bazie. Ja w zapytaniu mogę mieć tabele, których nie będzie.
2) docelowo operować będę na różnych bazach, nie tylko mysql


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
hwao
post 6.09.2011, 08:51:47
Post #10


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




@nospor tylko tokenizowanie SQL'a, albo parę wyrażeń reg. Ciężko napisać wyrażenie które obejmie wszystkie warunki.
Ewentualnie możesz zobaczyć czy baza danych nie ma kwerendy która zwróci wszystkie tabele które zostały użyte w poprzedniej kwerendzie

Ewentualnie jeżeli to będzie na różnych typach baz danych to łap to w orm'ie (o ile chcesz użyć tego 'przy pisani aplikacji');
Powód edycji: [hwao]:
Go to the top of the page
+Quote Post
nospor
post 6.09.2011, 09:23:25
Post #11





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6296
Dołączył: 27.12.2004




A czy jakiś spec od orm jest w stanie powiedzieć czy jest tam parsowanie podanego zapytania?
W tej chwili męczę analizę zapytania przez tokeny i się nie wyrobię w poznawanie jeszcze ORMa, a może ktoś zna odpowiedź na to pytanie?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
destroyerr
post 6.09.2011, 10:32:10
Post #12





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Doctrine2 powinno Ci ułatwić robotę. Mógłbyś sobie nadpisać Parser, tak żeby nie był związany z EntityManagerem, tzn. żeby nie szukał w nim Twoich tabel. Prostsze rozwiązanie to wykorzystanie Lexera i wyciągnięcie wszystkiego samemu. Mały przykład:
  1. use Doctrine\ORM\Query\Lexer;
  2.  
  3. $tables = array();
  4. $token = true;
  5. $lexer = new Lexer('SELECT * FROM articles');
  6. while($token)
  7. {
  8. $token = $lexer->moveNext();
  9. switch($lexer->token['type'])
  10. {
  11. case Lexer::T_FROM:
  12. do
  13. {
  14. $lexer->moveNext();
  15. $tables[] = $lexer->token['value'];
  16. if($lexer->isNextToken(Lexer::T_AS))
  17. {
  18. $lexer->moveNext();
  19. }
  20. //skip alias
  21. $lexer->moveNext();
  22. }
  23. while($lexer->isNextToken(Lexer::T_COMMA) && $lexer->moveNext());
  24. break;
  25. }
  26. }
Go to the top of the page
+Quote Post
nospor
post 8.09.2011, 09:24:13
Post #13





Grupa: Moderatorzy
Postów: 36 457
Pomógł: 6296
Dołączył: 27.12.2004




Ostatecznie podzieliłem sql na tokeny a potem analizowałem to ustrojstwo. Żeby nie podzapytania to sprawa byłaby nawet banalna, niestety podzapytania trochę skomplikowały sprawę.

Jak dopracuję kod to może wstawię.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 23:47