Verwenden des Platzhalters "Gefällt mir" in der vorbereiteten Anweisung

176

Ich verwende vorbereitete Anweisungen, um MySQL-Datenbankabfragen auszuführen. Und ich möchte eine Suchfunktion implementieren, die auf einer Art Schlüsselwort basiert.

Dafür muss ich ein LIKESchlüsselwort verwenden, so viel ich weiß. Und ich habe auch schon vorbereitete Anweisungen verwendet, aber ich weiß nicht, wie ich sie verwenden soll, LIKEweil aus dem folgenden Code, wo würde ich die hinzufügen 'keyword%'?

Kann ich es direkt im pstmt.setString(1, notes)as (1, notes+"%")oder so verwenden. Ich sehe viele Beiträge dazu im Web, aber nirgendwo eine gute Antwort.

PreparedStatement pstmt = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes);
ResultSet rs = pstmt.executeQuery();
ssn
quelle

Antworten:

281

Sie müssen es im Wert selbst festlegen, nicht in der SQL-Zeichenfolge der vorbereiteten Anweisung.

Dies sollte also für eine Präfixübereinstimmung reichen:

notes = notes
    .replace("!", "!!")
    .replace("%", "!%")
    .replace("_", "!_")
    .replace("[", "![");
PreparedStatement pstmt = con.prepareStatement(
        "SELECT * FROM analysis WHERE notes LIKE ? ESCAPE '!'");
pstmt.setString(1, notes + "%");

oder ein Suffix-Match:

pstmt.setString(1, "%" + notes);

oder ein globales Match:

pstmt.setString(1, "%" + notes + "%");
BalusC
quelle
18
+1 Das OP könnte es in SQL "einstellen" - wie von ... LIKE '%' || ? || '%'oder ähnlich - aber das ist viel weniger flexibel.
Pilcrow
Wie mache ich das im NON-CASE SENSITIVE-Modus? :)
Alpha Gabriel V. Timbol
2
Nicht zwischen Groß- und Kleinschreibung unterscheiden kann weiterhin verwendet WHERE UPPER(?) LIKE UPPER(?)werdenpstmt.setString(2, "%" + notes + "%")
Zig
1
@Alain: Danke. Ich frage mich nur, ob dies für alle RDBMS gilt, die der Welt bekannt sind. Vielleicht '%' || ? || '%'war es doch besser, wie im 1. Kommentar erwähnt? Ich habe momentan keine Gelegenheit zu experimentieren.
BalusC
2
@BalusC Dies gilt für MSSQL, Postgres und MySQL in meinen Tests. Der String, der zu einem Parameter gemacht wird, wird selbst als eine Mischung aus Daten und Steueranweisungen interpretiert. Die SQL-Verkettung erfolgt vor der Interpretation und bewahrt die Sicherheitsanfälligkeit. Das IEEE-Zentrum für sicheres Design fordert, Daten- und Steueranweisungen strikt zu trennen und Steueranweisungen, die von nicht vertrauenswürdigen Quellen empfangen werden, niemals zu verarbeiten .
Alain O'Dea
28

Code es so:

PreparedStatement pstmt = con.prepareStatement(
    "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes + "%");`

Stellen Sie sicher, dass Sie die unten stehenden Anführungszeichen NICHT einfügen, da sie eine Ausnahme verursachen.

pstmt.setString(1,"'%"+ notes + "%'");
Der Hochzeitswolf
quelle
1
Obwohl es so klingt, als würde jemand nicht auf diese Annahme stoßen, ist sie tatsächlich sehr gültig, insbesondere wenn Sie mit Oracle arbeiten. Vielen Dank für den Hinweis!
Asgs
5

Wir können dies einfach tun, indem wir die CONCATE SQL-Funktion verwenden.

PreparedStatement pstmt = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like CONCAT( '%',?,'%')";
pstmt.setString(1, notes);
ResultSet rs = pstmt.executeQuery();

Das ist perfekt für meinen Fall.

Basharat Ali
quelle
4
PreparedStatement ps = cn.prepareStatement("Select * from Users where User_FirstName LIKE ?");
ps.setString(1, name + '%');

Probieren Sie es aus.

Faiz
quelle
1
String fname = "Sam\u0025";

PreparedStatement ps= conn.prepareStatement("SELECT * FROM Users WHERE User_FirstName LIKE ? ");

ps.setString(1, fname);
Ram Kumar
quelle
2
Könnten Sie die Antwort näher erläutern, anstatt nur die Antwort zu geben? Siehe: stackoverflow.com/help/how-to-answer
Edwin
-12
String query="select * from test1 where "+selected+" like '%"+SelectedStr+"%';";


PreparedStatement preparedStatement=con.prepareStatement(query);


// where seleced and SelectedStr are String Variables in my program
Mahesh Dhote
quelle
Es ist unsicher. Bitte verwenden Sie eine parametrisierte vorbereitete Erklärung.
Durgesh Kumar