Wie kann ich eine Variable mit mysqli an eine WHERE-Klausel übergeben?

8

Ich habe derzeit ein kleines Suchformular mit nur zwei Elementen: einer Texteingabe namens search und einer Auswahlbox mit dem Namen param . Die in diesem Feld ausgewählte Option sollte als Parameter verwendet werden, um auszuwählen, welche Tabellenspalte in meiner Datenbank abgerufen werden soll.

Mit mysql_ functions könnte so etwas gemacht werden:

%Vor%

Aber ich kann es nicht mit der mysqli_ -Syntax arbeiten. Ich versuche vorbereitete Aussagen zu verwenden, aber das Beste, was ich bis jetzt getan habe, ist dies:

%Vor%

Aber nur ein paar else if s zu verwenden, scheint sehr repetitiv und unproduktiv zu sein, besonders wenn ich viele Spalten habe.

Das erste, was ich ausprobiert habe, war die Parameterbindung - ... WHERE ? LIKE ... und $prep->bind_param('ss', $param, $search) -, aber es hat nicht funktioniert (und ich weiß immer noch nicht warum).

Gibt es einen Weg, es intelligenter zu machen?

    
Renato 24.07.2013, 22:35
quelle

3 Antworten

3

Wenn Sie für jeden Parameter denselben SQL-Code verwenden, erstellen Sie einfach einen Hash der möglichen Parameter: (CGI param name => table column name)

%Vor%

Aus Sicherheitsgründen ist es viel besser, da Sie vor SQL-Injection geschützt sind.

Nimm dann den Spaltennamen aus dem Hash und lege ihn in die Abfrage - und du wirst das if-s:

los %Vor%

Wie @Akam sagte, brauchen Sie CONCAT ("%",?, "%") in der Abfrage nicht - es ist besser, den Wert mit Prozenten gleich voraus zu binden.

    
user4035 24.07.2013, 22:43
quelle
2

Laut diesem Beispiel im PHP-Handbuch

Ссылка

Sie scheinen am besten die '%' zu der String-Variablen hinzuzufügen, die Sie binden - und nicht in der Abfrage, z. in Ihrem Beispiel:

%Vor%

Habe es nicht getestet, aber es scheint eine vernünftige Lösung zu sein.

    
Arthur Nicoll 24.07.2013 22:53
quelle
1

Sie können keine Platzhalter für Spaltennamen verwenden, daher müssen Sie die Spaltennamen normal verketten. Anstatt mit mysqli nur zu entkommen, weil Sie eine begrenzte Anzahl von Spalten haben, würde ich eine While-Liste vorschlagen:

%Vor%

Beachten Sie auch das Entfernen der concat -Anweisung und das Verketten in PHP. Dies ist wichtig für vorbereitete Anweisungen, da es, sobald es den Server erreicht hat, es nicht wirklich kombiniert (also den Schutz vorbereiteter Anweisungen), so dass es nicht richtig funktioniert, wenn die Platzhalter mit der Zeichenfolge $search gesendet werden.

    
John V. 24.07.2013 23:07
quelle

Tags und Links