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();

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 + "%");

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 + "%'");

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.


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

Probieren Sie es aus.


1
String fname = "Sam\u0025";

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

ps.setString(1, fname);

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

Es ist unsicher. Bitte verwenden Sie eine parametrisierte vorbereitete Erklärung.
Durgesh Kumar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.