2016-05-20 11 views
0

Wenn ich eine Tabelle mit TextSuche Einträge bestimmten Text enthalten, mit Prepared-Anweisung

haben
create table my_table(
    id integer primary key, 
    para text 
); 

Ich möchte alle Einträge auszuwählen, die ein bestimmtes Feld

SELECT * FROM my_table WHERE text LIKE '%searchtext%'; 

So enthält es mir alle Felder geben das enthält "Suchtext". Gibt es irgendeine aggregierte Funktion/Prozedur wie contain(...) in postgresql, um dasselbe zu tun.

SELECT * FROM my_table WHERE contains(text, 'searchtext'); 

Ich mag das oben beschriebene Verhalten, weil ich vorbereitete Anweisung verwenden Parameter zu schaffen, in dem String z.B. WHERE text = ? dann stelle ich Parameter anstelle von ? zur Verfügung.

+0

'wo para wie concat ('%' zu verwenden, wäre wäre gewöhnt,?, '%') 'sollte funktionieren –

+0

@a_horse_with_no_name Tut mir leid. Ich hätte das erwähnen sollen. Ich verwende eine vorbereitete Aussage aus Sicherheitsgründen. Wenn ich Ihre Methode verwenden werde, kann auch jemand etwas wie 'abc%' oder '% def' (sql injection) weitergeben. – afzalex

+0

Das '?' ** ist ** der Parameter für das PreparedStatement. Es ist nicht anfällig für SQL-Injection –

Antwort

1

Platzhalter verwenden, mit einem Parameter in einem PreparedStatement, müssen Sie diesen Parameterwert mit den Platzhalter verketten:

SELECT * 
FROM my_table 
WHERE para LIKE concat('%', ?, '%'); 

Die oben ist nicht für SQL-Injection verwundbar. Auch wenn Sie abc%' OR '%def als Parameter übergeben hat, die Bedingung, die LIKE '%abc%'' OR ''%def'

Eine andere Möglichkeit strpos()

SELECT * 
FROM my_table 
WHERE strpos(para, ?) > 0; 
Verwandte Themen