Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klauzula WHERE w SQL
Forum PHP.pl > Forum > PHP
Zbłąkany
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 ?
SongoQ
Zapytanie bez nawiasow - nie. Nieraz to jest wymaganie dla warunkow grupowych.
A co z tamim czyms jak IS NUL, IS NOT NULL, IN, NOI IN, podzapytania wywolania funkcji itd?

Zastanow sie jak to rozwiazac.
Zbłąkany
Bez takich dodatków, bo to skomplikowałoby sprawe w składni. I nadal nie mam pomysłu jak sie pozbyć zagnieżdżonych wyrażeń, chyba żeby warunki były w takiej postaci:
  1. WHERE warunek1
  2. warunek2
  3. warunek3

czyli warunki byłyby oddzielone znakiem nowej linii, a to już jakiś postęp smile.gif ,bo trochę łatwiej takie coś sparsować biggrin.gif i wtedy nawet jak mi ktoś zagnieździłby warunek to, aby faktycznie był to koniec danego warunku to dokładnie na końcu danego stringu musiałby się znajdować jakiś z góry określony ciąg znaków, ale jak słusznie zauważyłeś bez nawiasów nie da rady. Czyli forma musi pozostać czysto SQL-owska:
  1. WHERE warunek1 AND warunek2 OR warunek3 AND warunek4

A jak rozwiązać sprawę nawiasów?
PS. Tak mnie teraz naszło, a gdyby tak warunki logiczne: AND i OR dawać w osobnych liniach, a także warunki muszą się zaczynać i kończyć w liniach?
SongoQ
Ja bym to tak rozwiazal spawdzasz czy jest WHERE jesli jest to sprawdzasz czy istatniej wartunek(i). Dla nawiasow spawdzasz czy jest nawias otwierajacy i czy jest nawias zamykajacy przy czym nawiasy musza obejmowac warunki.

Przepatrz sobie tidy lub parser xml tam podeszli troche w stylu stosu, moze Cie to naprowadzi na wlasciwy tor.
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-2025 Invision Power Services, Inc.