Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne][SQL][PHP]Regex a wyszukiwarka
Forum PHP.pl > Forum > Przedszkole
Van Pytel
Jak mozna stworzyc wyszukiwarke w ktorej mozna wpisywac jakies wyrazenie regularne, a potem wyszukac w bazie?

Przyklad:
Mam strone a na niej wyszukiwarke, ktora szuka userow. Wpisuje w wyszukiwarce .arek
W mysql wyszuka i dostane rekordy:
Marek Darek itp.

Jak to mozna wykonac? Tak aby bylo zabezpieczone przed jakimis atakami np SQL injection. I mozna bylo korzystac z normalnych slow i regex?

Niestety slabo znam sie na regex i nie mam pojecia jak to wykonac.

Dzieki za odpowiedz.
konrados
A czemu nie użyć sql keyword : "LIKE" ?

http://www.htmlite.com/mysql011.php

a w ogóle to masz też słowo REGEXP, np:

  1. SELECT name FROM tableName WHERE name REGEXP '^A'


A przed sql injection się zabezpieczysz tak jak zwykle - escapując cydzysłowia
Van Pytel
No tak, tylko regex tez bym musial jakos zabezpieczyc. Bo mozna stworzyc regex tak aby obejsc i zaatakowac.
konrados
Jeśli użyjesz go do funk. select i zamienisz wszelkie ' na \' a " na \" to nie wiem jakby można to było zaatakować.

Ale może ktoś mądrzejszy się wypowie?
Crozin
Można by napisać takie wyrażenie, które zabije bazę danych.
konrados
@Crozin
Chodzi Ci o to, że byłoby strasznie czasochłonne czy coś poważniejszego?
Crozin
A to nie jest wystarczająco poważne?
konrados
No nie aż tak jak jakiś sql injection smile.gif

A dałoby się zapisać taki killer-expression w np. 10 znakach? Bo jak nie, to zabezpieczeniem mogłoby być ograniczenie stringa do 10. No chyba, że się da...
bmL
Pewnie się da. Ale gdyby tak już nie zastanawiając się jakie znaki tak na prawdę musimy ograniczyć zrobić:
  1. $search = preg_replace('/\\\/', '', $search); // usuwamy backslashe
  2. $search = preg_replace('/[^a-zA-Z\s]/', '\\\${0}', $search); backslashujemy wszystko co nie jest literami ani spacjami

?
Van Pytel
@bmL ale tez trzeba pamietac o polskich literach (ż ć ś itd). A tez sa czasem w nickach spacje lub podkreslenia.
bmL
W sumie racja ale tak na prawdę: RAGEXP 'Wózek napędowy' == RAGEXP '(.*)W\ózek nap\ędowy(.*)' == RAGEXP '(.*)\W\ó\z\e\k \n\a\p\ę\d\o\w\y(.*)'. No i np. jak napisze sobie $search = '(.*)' to wyszukane będzie RAGEXP '(.*)\(\.\*\)(.*)\'.
Popraw mnie jeżeli się mylę, ale tak powinno być jakoś nie mam ochoty sprawdzać tongue.gif
Van Pytel
Ja slabo sie znam na regex wiec malo w tej kwestii moge sie wypowiedziec, dlatego zrobilem ten temat, jak to ugryzc. Najgorzej zaczac, a potem jakos leci.
tehaha
ale czy na pewno takie coś byłoby przydatne, no bo ilu użytkowników zna wyrażenia regularne? wydaje mi się, że lepiej stworzyć jakiś uproszczony system np.
#Darek zostanie zamienione na WHERE user_name LIKE %Darek
#Darek# -> WHERE user_name LIKE %Darek%
(Darek|Arek) -> WHERE user_name = 'Darek' OR user_name = 'Arek'
itp.

znając życie to nawet z takim czymś połowa użytkowników już by sobie nie radziła
Van Pytel
Trzeba byc innowacyjny biggrin.gif
A zawsze czegos czlowiek nauczyc sie.
Poradnik mozna userom napisac.
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.