Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Rozbudowane porownywanie ciagu znakow
Forum PHP.pl > Forum > Przedszkole
Ciosek
Witam.


Chcialbym porownac ciagi znakow z jednej kolumny do zmiennej. Zeby nie było zbyt prosto ciagii maja pewne "fragmenty" ktore chcialbym porownac.

Przyklad:

  1. $zmienna1 = A 23
  2. $zmienna2 = A23A
  3. $zmienna3 = A 23B
  4.  
  5. $zmienna4 = AL 23
  6. $zmienna5 = A23A
  7. $zmienna6 = AL 23B
  8.  


Format zmiennych:
- na poczatku jest 1 lub 2 litery
- nastepnie czasem jest spacja czasem jej nie ma
- nastepnie 2 cyfry
- na koncu nie ma nic lub jest litera A B lub V

Zmienne znajduja sie w MySQL



Teraz chcialbym w jakis sposob zrobic zapytanie do bazy aby przypasowalo $zmienna1 do $zmienna2 i $zmienna3 gdyz:
- nie interesuja mnie spacje w zmiennych
- nie interesuje mnie literka na koncu (bez roznicy czy ona jest czy jej nie ma)
- interesuje mnie tylko w $zmienna1 ciag 'A23' i w 2 kolejnych tez tylko ta czesc

Probowalem na rozne sposoby jednak troche malo mam wiedzy odnosnie MySQL (w wiekszosci uzywam tylko SELECT, WHERE, ORDER itp), szukalem w google informacji i kombinowalem z REPLACE LIKE ale albo nie znam do konca mozliwosci tych funkcji albo nie do konca rozwijazuja moj problem.

Ostatnie proby wygladaly tak:
  1. $wynik = mysql_query("SELECT * FROM tabelka WHERE REPLACE (kolumna2, ' ', '') = REPLACE ('$zmienna', ' ', '') ")

problem jednak w tym jest taki ze zostaje ta literka na koncu - chcialem dodac funkcje IN do WHERE ale nie wyszlo mi.


Ma ktos moze pomysl jak sie za to zabrac?


PS: Troche moglem nakrecic wiec jesli cos byloby nie jasne to piszcie, postaram sie dokladniej opisac wszelkie niejasnosci.
Crozin
Generalnie dobrze kombinujesz - musisz najpierw doprowadzić zarówno wartość z kolumny w bazie danych jak i wartość $zmienna do ich znormalizowanych form, tj. same wielkie litery*, usunięte białe znaki, usunięta ostatnia litera

  1. $var = 'AL 23V';
  2. $var = strtoupper(preg_replace('#([a-z]{1,2})\\s*(\\d{2})#i', '\\1\\2', $zmienna)); // AL23
  3. $len = strlen($var);
  1. SELECT ... FROM ... WHERE LEFT(UPPER(REPLACE(col_name, ' ', '')), :len) = :var


* jeżeli masz pewność że nie będzie rozbieżności w wielkości znaków albo gdy metodę porównywanie znaków (COLLATION) w bazie danych masz ustawioną na case-insenstive (utf8_*_ci) możesz pominąć ten krok.
Ciosek
Crozin: wielkosc liter jest ta sama wiec ta czesc nie bedzie konieczna - dzieki ze podales opcje gdyby byla roznica

mam jednak jedno pytanie:

  1. $var = 'AL 23V';
  2. $var = strtoupper(preg_replace('#([a-z]{1,2})\\s*(\\d{2})#i', '\\1\\2', $var)); / AL23V


Z racji ze kompletnie nie znam sie na wyrazeniach regularnych wnioskuje ze jest to wyrazenie usuwajace spacje i ostatnia litere jesli takowa jest?

Trzeba w tym wyrazeniu cos modyfikowac bo wedlug teog co napisales powinno ono dawac wynik AL23 a u mnie jednak daje AL23V i nie wiem za bardzo gdzie robie blad.

Reszta jest jasna
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.