Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klauzula WHERE w SQL, przepis na parser
Zbłąkany
post
Post #1


Administrator serwera


Grupa: Developerzy
Postów: 521
Pomógł: 13
Dołączył: 2.04.2004
Skąd: 52°24' N 16°56' E

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


Zastanawiam się, jak byście rozwiązali sprawę tworzenia składni dla klauzuli WHERE i w jaki sposób takową składnię sparsować??
Ja wpadłem na taką składnię:
  1. WHERE colname='content', colname='content', colname='content'

gdzie przecinek oznacza domyślnie operator logiczny AND i coś takiego:
  1. WHERE +(colname='content') +(colname='content') -(colname='content')

gdzie '+' oznacza AND, a '-' oznacza OR. No i jeszcze trzeba doliczyć operatory porównania: '=', '!=', '<', '>', '<=', '>=' i może jakieś wyrażenia regularne proste, np. '%', '^', '$', gdzie '%' oznacza, że nie liczy się umiejscowienie treści w wartości kolumny, '^' oznacza, że treść musi się znaleźć na początku wartości kolumny, a '$' oznacza, że treść musi się znaleźć na końcu wartości kolumny.
Możnaby też nie używać nawiasów i zastosować same AND i OR w jawnej postaci, ale to by trochę utrudniło sprawę parsowania.
A odnośnie parsowania, to głównym problemem jest dokładne określenie stringu jako treści, bo może być przecież taka sytuacja: colname='content' i za content podstawiamy, np. "jakaś_treść' colname='content'". No i jeszcze sposób w jaki wyciągniemy wszystkie dane: zdecydowanie najłatwiej z czegoś takiego:
  1. <?php
  2.  
  3. $where = &#092;"+(coname='content') -(colname='content') +(colname='content')\";
  4. preg_match_all('/+('[.Ss ]+') /', $where, $andmatches);
  5. preg_match_all('/-('[.Ss ]+') /', $where, $ormatches);
  6.  
  7. ?>

No i oczywiście trzeba ustandaryzować w jakiś sposób znaki nowego wiersza i linii: czyli musimy wszystkie takowe znaki zamienić na jeden rodzaj, np.
  1. <?php
  2.  
  3. $query = str_replace(array(&#092;"nr\", \"r\"), \"n\", $query);
  4.  
  5. ?>

no i potem je jakoś wyeliminować, za pomocą jakiegoś bardzo rzadko spotykanego zestawu znaków lub znaku, np.
  1. <?php
  2.  
  3. $query = str_replace(&#092;"n\", \"??//n\", $query);
  4.  
  5. ?>

Może ktoś ma jakieś ciekawe rozwiązanie i się nim zechce podzielić, lub też potrafi sparsować zapytanie bez nawiasów z jawnymi operatorami logicznymi: AND i OR ?


--------------------
Środowisko: Gentoo 2008.0 | Apache | PHP5 | PostgreSQL | MySQL | Postfix
Workstation: Gentoo 2008.0 | Firefox
Thomas Alva Edison: "Aby coś wynaleźć wystarczy odrobina wyobraźni i sterta złomu ..."
Odpowiedź na każde pytanie typu "Jak ...": "Nie da się, to nie PostgreSQL"
Go to the top of the page
+Quote Post

Posty w temacie


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 Aktualny czas: 21.08.2025 - 12:35