PHP Plus/Minuszeichen verursache Probleme beim DB-Query

Status
Für weitere Antworten geschlossen.
D

dreivier

Gast
Moin

Bin hier auf ein seltsames Problem gestoßen.

Ich habe ein Suchformular mit dem ich die DB nach gesuchten Wörtern usw. durchsuche.
Nun bin ich komplett fertig damit, es funktioniert alles super ABER...

Nur durch Zufall habe ich ,,Bummerang+,, in die Suche eingegeben und schwupps, es gibt ein Problem
nach der Abarbeitung, und zwar..Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, bool given in...

..in ist $suche, diese bekomme ich so...$suche = $_POST['abgehts'];
Mache ich ein var_dump($suche); vor und nach der query ist der Inhalt ok und nicht leer. Irgendwie will mySQL strings mit Plus oder Minus am Ende nicht verarbeiten..

Dies passiert mit jedem Wort wenn ein Pluszeichen am Ende steht, steht das Pluszeichen am Anfang des Wortes oder zwischen zwei oder mehreren Wörtern ist alles ok, doch setzt man noch ein + ans Ende dann geht der String auch nicht mehr. Das gleich Problem mit dem Minuszeichen..alles anderen Zeichen gehen, nur diese beiden machen Probleme und ich weiß nicht warum.

Was könnte das sein?

P.S. Ich habe alle Filter rausgenommen um bei diesne den Fehler auszuschliessen darum das $_POST nackt auf die $suche!
 
Ich verstehe den Beitrag nicht so ganz, aber es klingt ein wenig danach, als wenn du zufällig festgestellt hast, dass deine Anwendung anfällig für SQL Injections ist.
 
Zuletzt bearbeitet: (typos)
  • Gefällt mir
Reaktionen: mental.dIseASe, Gothic74 und Madman1209
BeBur schrieb:
Ich verstehe den Beitrag nicht so ganz, aber es klingt ein wenig danach, als wenn du zufällig festgestellt hast, dass deine Anwendung anfällig für SQL Injections ist.
Aha, und diese Anwendung reagiert auch nur auf + und minus, und auch nur wenn es als letztes an einem String klebt, alle anderen Zeichen aber problelos durchgehen...schlechte Anwendung würde ich sagen oder? was gibt es für Alternativen ausser schlaue Sprüche?
Ergänzung ()

Madman1209 schrieb:
Hi,

wie wird denn die Query genau aufgebaut im Code?

VG,
Mad
Ganz normal, das funktioniert auch alles nur nicht wenn am ENDE des Suchstrings ein + oder minus steht, wäre was mit der query würden andere Zeichen auch Probleme machen zb ' oder * und und und...aber hier erzählt ja jemand es wäre ne Injection Abwehr lol
 
Hab's nicht ganz verstanden: Wolltest du jetzt Hilfe oder nicht?
 
  • Gefällt mir
Reaktionen: mental.dIseASe, bog und Gothic74
Nase schrieb:
Hab's nicht ganz verstanden: Wolltest du jetzt Hilfe oder nicht?
Was hast du nicht verstanden? ich versteh jetzt nicht was du nicht verstanden hast. Wie willst du helfen wenn du was nicht verstehst?
 
Wie wär's wenn du uns erklärst was DU unter ganz normal verstehst in Bezug darauf wie ein query zusammengebaut wird in deiner Anwendung.
 
  • Gefällt mir
Reaktionen: BeBur und Gothic74
Hi,

Ganz normal, das funktioniert auch alles nur nicht
was verstehst du unter "normal"? Und "alles funktioniert, aber..." bedeutet: es funktioniert eben nicht!

Schreib doch bitte mal konkret den Code hier, dann kann man schauen was wo schief läuft!

VG,
Mad
 
Oder alternativ den Link auf StackOverflow.com, wo Du den Code herauskopiert hast :-)
 
  • Gefällt mir
Reaktionen: mental.dIseASe, bog, BeBur und eine weitere Person
Fritz schrieb:
Code wäre schon hilfreich. Ich vermute mal, dass du eine Fulltext Suche machst und das "+" halt an falscher Stelle ist.
https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html

Code:
A leading or trailing plus sign indicates that this word must be present in each row that is returned. InnoDB only supports leading plus signs.
Das wird es wohl sein, muss mich jetzt nur reinlesen warum genau und wie ich das Problem löse weil meine query sieht so aus:

PHP:
$suchen = mysqli_real_escape_string($_connect, $suchen);
$query = mysqli_query($_connect, 'SELECT `pass` FROM `trucks` JOIN `drivers` USING (pass) WHERE MATCH(`tires`, `modell`, `tags`) AGAINST(\''.$suchen.'\' IN BOOLEAN MODE) + MATCH(`drivers`) AGAINST(\''.$suchen.'\' IN BOOLEAN MODE)');
$total = mysqli_num_rows($query);

Und ja, ist Fulltext...und InnoDB

Zitat von mysql.com
InnoDB full-text search does not support the use of a leading plus sign with wildcard ('+*'), a plus and minus sign combination ('+-'), or leading a plus and minus sign combination ('+-apple'). These invalid queries return a syntax error.

Danke @Fritz
 
Zuletzt bearbeitet von einem Moderator:
So solltest du keine Variablen übergeben, da du so deinen Programmcode anfällig gegenüber SQL-Injections machst. Der Inhalt der Variable $suchen wird Teil des SQL-Strings dann steht einem alles offen. Auch wenn die Anwendung nur für dich ist, gewöhn dir das gleich einfach an.

Ich würde ohnehin statt mysqli PDO mit prepared Statements empfehlen. Und wenn du in Zukunft Hilfe bei deinem Quelltext brauchst, dann poste bitte gleich den entsprechenden Quelltext mit.

Und dein + Zeichen musst du escapen.
 
  • Gefällt mir
Reaktionen: mental.dIseASe, GroMag, DefconDev und 2 andere
Mysqli kann auch prepared statements.
Persönlich würde ich wie vorgeschlagen den Code wegwerfen und als prepared statement neu schreiben.
 
  • Gefällt mir
Reaktionen: mental.dIseASe und BeBur
Status
Für weitere Antworten geschlossen.
Zurück
Oben