Seite 1 von 2

Volltextsuche php mysql

Verfasst: 04.02.2010, 03:49
von ben78
CLOSED

Verfasst:
von
Content Erstellung von ABAKUS Internet Marketing
Ihre Vorteile:
  • einzigartige Texte
  • suchmaschinenoptimierte Inhalte
  • eine sinnvolle Content-Strategie
  • Beratung und Umsetzung
Jetzt anfragen: 0511 / 300325-0

Verfasst: 04.02.2010, 04:15
von net(t)worker
setz das ; ne Zeile höher... ;-)

Code: Alles auswählen

...
...
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{ 
...
...

Verfasst: 04.02.2010, 04:24
von ben78
@net(t)worker...Vielen und Großen Dank. Jetzt bekomme ich mein Tabelle zu sehen.

Habe jetzt aber folgendes Problem. Mir werden nur passende Suchergebnisse angezeigt, wenn ich mit Verwendung des Sprungmenüs nach einer Marke suche. Wenn ich was in das Textfeld eingebe, wird nicht danach gesucht. Es erscheint trotzdem nur das, was im Sprungmenü ausgewählt ist.

Verfasst:
von

Verfasst: 04.02.2010, 10:20
von Mork vom Ork
ben78 hat geschrieben:Mir werden nur passende Suchergebnisse angezeigt, wenn ich mit Verwendung des Sprungmenüs nach einer Marke suche. Wenn ich was in das Textfeld eingebe, wird nicht danach gesucht. Es erscheint trotzdem nur das, was im Sprungmenü ausgewählt ist.
Schau in deinen Code:

Code: Alles auswählen

$suchwort = mysql_real_escape_string($_POST['suche']); 

$sql = "SELECT * FROM test WHERE MATCH(Bezeichnung, Beschreibung, Marke) AGAINST('" . $suchwort . "')";
Nach wie vielen Feldern suchst du da? Nach einem, "suche". Nicht nach zweien.

Code: Alles auswählen

<input type="text" name="suche" value="Produktfinder" /> 
<select name="suche">
Und hier spiele mal Browser und überlege dir, was du machst, wenn du zwei ausgefüllte Eingabefelder siehst, die denselben Namen haben. Wie übermittelst du die Daten an den Server, so dass der Server weiß, wo welches Datum herkommt?

Verfasst: 06.02.2010, 04:11
von ben78
Meine Suma verfügt über ein Feld für die Texteingabe und ein Sprungmenü zum auswählen von Marken. Der User kann einen Suchbegriff eintippen und wenn vom User gewünscht, im Sprungmenü eine Marke zum Suchbegriff auswählen. Er soll natürlich auch nur nach Marken oder eigenem Suchbegriff suchen können.


Dazu habe ich jetzt folgenden Code in meinem PHP-Skript:

Code: Alles auswählen

&#91;b&#93;LINE 40&#58;&#91;/b&#93; $suchwort = mysql_real_escape_string&#40;$_POST&#91;'suche'&#93;&#41;;

&#91;b&#93;LINE 46&#58;&#91;/b&#93; $sql = "SELECT * FROM test WHERE MATCH&#40;Bezeichnung, Beschreibung, Marke&#41; AGAINST&#40;'" . $suchwort . "'&#41; AND MATCH Marke AGAINST &#40;'" . $marke . "'&#41;";

$db_erg = mysql_query&#40; $sql &#41;;
if &#40; ! $db_erg &#41;
&#91;b&#93;LINE 53&#58;&#91;/b&#93; if &#40;$marke&#41; $sql = $sql." AND Marke = $marke";

&#123;
die&#40;'Ungültige Abfrage&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;
Beim Testen erscheinen immer folgende Fehlermeldungen:

Notice: Undefined index: suche in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search-fulltext1.php on line 40

Notice: Undefined variable: marke in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search-fulltext1.php on line 46

Notice: Undefined variable: marke in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search-fulltext1.php on line 53
Ungültige Abfrage: Can't find FULLTEXT index matching the column list


P. s.: Die Formularfelder für die Eingaben sind nicht mehr in reinem HTML gehalten, sondern mit PHP.

Verfasst: 06.02.2010, 13:12
von Mork vom Ork
ben78 hat geschrieben:$suchwort = mysql_real_escape_string($_POST['suche']);

Notice: Undefined index: suche in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search-fulltext1.php on line 40
Dann wurde das Feld suche nicht vom Formular übermittelt. Du kannst mit phpinfo(INFO_VARIABLES) schauen, was PHP dir alles an Variablen zur Verfügung stellt.

Da es vorkommen kann, dass eines der Felder nicht ausgefüllt wurde, prüfe mit isset($_POST['suche']), ob die Variable existiert, bevor du auf sie zugreifst.
$sql = "SELECT * FROM test WHERE MATCH(Bezeichnung, Beschreibung, Marke) AGAINST('" . $suchwort . "') AND MATCH Marke AGAINST ('" . $marke . "')";

Notice: Undefined variable: marke in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search-fulltext1.php on line 46
Du hast die Variable $marke nirgends gefüllt. Um $suchwort kümmerst du dich ja in eingangs genannter Zeile, für $marke musst du das Gleiche machen.
Ungültige Abfrage: Can't find FULLTEXT index matching the column list
Du hast keinen Index, der zu den angefragten Spalten Bezeichnung, Beschreibung und Marke passt.

Verfasst: 06.02.2010, 13:51
von mgutt
Hier zwei passende Funktionen, um isset() zu prüfen:

Code: Alles auswählen

function _get&#40;$var, $else=false, $force=false&#41; &#123;
	if &#40;!$force&#41; &#123;
		return isset&#40;$_GET&#91;$var&#93;&#41; ? $_GET&#91;$var&#93; &#58; $else;
	&#125;
	else &#123;
		$force = array_flip&#40;$force&#41;;
		return isset&#40;$_GET&#91;$var&#93;&#41; && isset&#40;$force&#91;$_GET&#91;$var&#93;&#93;&#41; ? $_GET&#91;$var&#93; &#58; $else;
	&#125;
&#125;
function _post&#40;$var, $else=false, $force=false&#41; &#123;
	if &#40;!$force&#41; &#123;
		return isset&#40;$_POST&#91;$var&#93;&#41; ? $_POST&#91;$var&#93; &#58; $else;
	&#125;
	else &#123;
		$force = array_flip&#40;$force&#41;;
		return isset&#40;$_POST&#91;$var&#93;&#41; && isset&#40;$force&#91;$_POST&#91;$var&#93;&#93;&#41; ? $_POST&#91;$var&#93; &#58; $else;
	&#125;
&#125;
Anwendungsbeispiel:

Code: Alles auswählen

$suche = _post&#40;'suche'&#41;;
$marke = _post&#40;'marke'&#41;;
Optionale Anwendung:
Falls z.B. keine Marke übermittelt wurde und du in dem Fall eine Marke haben willst, kannst Du z.B. auch sowas machen:

Code: Alles auswählen

$marke = _post&#40;'marke', 'Sony'&#41;;
Falls Du nicht möchtest, dass jemand fehlerhafte Marken übermittelt, so kannst Du das bei Bedarf eingrenzen:

Code: Alles auswählen

$marke = _post&#40;'marke', 'Sony', array&#40;'Sony', 'Toshiba', 'Panasonic'&#41;&#41;;
Weiteres zum Thema:
Ich empfehle Dir weiterhin mysql_real_escape_string() immer innerhalb der SQL-Abfrage einzusetzen. Wenn man sich das einmal angewöhnt hat, vergisst man es nicht und es kommt nicht zu Problemen, wenn Du die Variable mal in einer Bedingung escapest, die dann versehentlich nicht greift.

z.B. sowas:

Code: Alles auswählen

$submit = _post&#40;'submit'&#41;;
$suche = _post&#40;'suche'&#41;;
$marke = _post&#40;'marke'&#41;;
// formular abgesendet
if &#40;$submit&#41; &#123;
	$suche = mysql_real_escape_string&#40;$suche&#41;;
&#125;
// suchbegriff vorhanden
if &#40;$suche&#41; &#123;
	$sql = "SELECT * FROM table WHERE suche = '$suche'";
&#125;
In dem Fall könnte ein Angreifer den Submit-Button unterdrücken und damit würde mysql_real_escape_string() nicht greifen. Wie im Beispiel wird es Dir vermutlich nicht passieren, aber bei mehreren verschachtelten Bedingungen kann man leicht was übersehen und schon hat man den Salat.

Und was soll das da:

Code: Alles auswählen

if &#40; $db_link &#41; 
&#123; 
echo 'Verbindung erfolgreich&#58; '; 
echo $db_link; 
&#125; 

else 
&#123; 
    
// hier sollte dann später dem Programmierer eine 
// E-Mail mit dem Problem zukommen gelassen werden 
die&#40;'keine Verbindung möglich&#58; ' . mysql_error&#40;&#41;&#41;; 
&#125; 
Du hast die Verbindung oben im Script erstellt und nachdem Du bereits die Abfrage machst prüfst Du ob die Datenbankverbindung besteht?!

Verfasst: 07.02.2010, 03:53
von ben78
DANKE Leutz!

Jetzt habe ich folgenden Code im Skript. Schaut das jetzt besser aus? ich lese mich auf diversen Seiten dumm und dämlich, komme aber nicht weiter.

Code: Alles auswählen

$suchwort = mysql_real_escape_string&#40;$_POST&#91;'suche'&#93;&#41;;
$marke = mysql_real_escape_string&#40;$_POST&#91;'hersteller'&#93;&#41;;
 
$sql = "SELECT * FROM test WHERE MATCH&#40;Bezeichnung, Beschreibung, Marke&#41; AGAINST&#40;'" . $suchwort . "'&#41; AND MATCH Marke AGAINST &#40;'" . $marke . "'&#41;";
 
if &#40;$marke&#41; $sql = $sql." AND Marke = $marke";
 
 
$db_erg = mysql_query&#40; $sql &#41;;
Dazu folgendes Skript mit den Formularfeldern.

Code: Alles auswählen

$sql = "SELECT DISTINCT Marke FROM test ORDER BY Marke";

if &#40;$db_erg = mysql_query&#40; $sql &#41;&#41;
&#123;
 echo '<form action="./mysql/search-fulltext1.php" method="post">';
 echo '<div id="search-mysql">';
 echo '<input type="text" name="suche" size="20" ';
 echo "onfocus=\"if &#40;this.value =='Produktfinder'&#41; &#123; this.value=''&#125;\" ";
 echo "onblur=\"if &#40;value == ''&#41; &#123;value='Produktfinder'&#125;\" value=\"Produktfinder\" />";
 echo '<select name="hersteller">';
 echo '<option value="">Marke</option>';
 while &#40;$row = mysql_fetch_array&#40; $db_erg&#41;&#41;
 &#123;
  echo '<option value="' . $row&#91;"Marke"&#93; . '">' . $row&#91;"Marke"&#93; . '</option>'; 
 &#125;
 echo '</select>';
 echo '<input type="submit" value="GO">';
 echo '</div></FORM>'
Wenn ich aus dem Sprungmenü eine Marke auswähle und dabei das Textfeld für die Sucheingabe frei lasse, dann auf GO klicke, kommt folgende Fehlermeldung:

Ungültige Abfrage: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'adidas' at line 1 Was ist denn da Syntax-technisch falsch? ich schaue schon die ganze zeit drauf... - Als Anfänger versteht sich -...und komme aber nicht drauf.

LINE 1 =

Code: Alles auswählen

$sql = "SELECT * FROM test WHERE MATCH&#40;Bezeichnung, Beschreibung, Marke&#41; AGAINST&#40;'" . $suchwort . "'&#41; AND MATCH Marke AGAINST &#40;'" . $marke . "'&#41;";
...UND

Wenn ich in das Suchfeld ein Suchbegriff eingebe und das Sprungmenü unberührt lasse, erscheint nach klicken auf GO komischer Weise folgende Meldung, obwohl ich...

Code: Alles auswählen

ALTER TABLE test ADD FULLTEXT &#40;Bezeichnung, Beschreibung, Marke&#41;;
...bereits ausgeführt habe.

Ungültige Abfrage: Can't find FULLTEXT index matching the column list

Was mache ich diesmal wieder falsch???

Ich vergammle schon so seit ca. 9 Std. lesend und testend vor mich hin. Ich bin Fix und Foxi...I kann nimmer :o

Verfasst: 07.02.2010, 11:01
von mgutt
1.) Du prüfst immer noch nicht ob die Variable gesetzt ist:

Code: Alles auswählen

$suchwort = mysql_real_escape_string&#40;$_POST&#91;'suche'&#93;&#41;;
Hier fehlt die Prüfung auf isset().

2.) Fulltext-Indexe funktionieren nur so wie sie gesetzt wurden. Wenn Du einen Fulltext-Index auf drei Spalten setzt, kannst Du nicht eine der Spalten separat abfragen, außer Du setzt für diese dritte Spalte einen eigenen Fulltext-Index. Hier fragst Du aber separat die eine Spalte ab:

Code: Alles auswählen

AND MATCH Marke AGAINST &#40;'" . $marke . "'&#41;"
3.) Bei der Bedingung nach $marke hast Du $marke in der SQL-Abfrage nicht in Anführungszeichen gesetzt. Ohne Anführungszeichen akzeptiert SQL aber keine Strings, sondern z.B. nur Zahlen oder Boolean:

Falsch:

Code: Alles auswählen

if &#40;$marke&#41; $sql = $sql." AND Marke = $marke"; 
Richtig:

Code: Alles auswählen

if &#40;$marke&#41; $sql = $sql." AND Marke = '$marke'"; 

4.) Die "AND MATCH Marke"-Bedingung der Marke macht keinen Sinn. Du hast ja bereits davor in allen drei Spalten gesucht.

Stattdessen macht es meiner Ansicht nach so Sinn:

Code: Alles auswählen

$sql = "SELECT *
				FROM test
				WHERE MATCH&#40;Bezeichnung, Beschreibung, Marke&#41; AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";
if &#40;$marke&#41; &#123;
	$sql .=  " AND Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;
Ich habe nun also nur die Abfrage nach $suchwort und wenn zusätzlich $marke übermittelt wurde, dann wird eine zusätzliche Bedingung eingesetzt. Statt = habe ich LIKE mit Platzhaltern genutzt. Auf die Art würde bei der Eingabe von Adida auch Adidas gefunden werden. Wenn Du das nicht willst, dann lass die Platzhalter weg. LIKE solltest Du aber in dem Fall vor = bevorzugen weil LIKE je nach Zeichensatz bereits ähnliche Buchstaben erkennt. z.B. wird ä auch als ae gefunden.

Verfasst: 08.02.2010, 04:05
von ben78
@mgutt & Mork vom Ork Vilen Dank! Das hat mir wietergeholfen und ich habe wieder etwas dazu gelernt. Aber noch klappt's nicht ganz.


Ich habe mein Skript Euren Hinweisen entsprechend umgeschrieben. Ich hoffe, dass mir das weitest gehend gelungen ist. Ich hoffe ich gehe Euch mit der dummen Fragerei eines nervigen Anfängers nicht auf den Senkel.

Mein Skript sieht jetzt so aus:

Code: Alles auswählen

// Vriablen Definieren
$suchwort = mysql_real_escape_string&#40;$_POST&#91;'suche'&#93;&#41;;
$marke = mysql_real_escape_string&#40;$_POST&#91;'hersteller'&#93;&#41;;

// Abfrage
$sql = "SELECT * FROM test WHERE MATCH &#40;Bezeichnung, Beschreibung, Marke&#41; AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";
if &#40;$marke&#41;
&#123; 
$sql .=  " AND Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'"; 
&#125;

$db_erg = mysql_query&#40; $sql &#41;;
if &#40; ! $db_erg &#41;
&#123;
die&#40;'Ungültige Abfrage&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;

$anzahl = mysql_num_rows&#40;$db_erg&#41;;
echo "Suchergebnisse&#58; $anzahl";
Via ALTER TABLE test ADD FULLTEXT (marke) habe ich in meiner MySQL-Tabelle einen Fulltext-Index für die Spalte Marke erstellt. Und einen ALTER TABLE test ADD FULLTEXT (Bezeichnung, Beschreibung, Marke) für die Spalten Bezeichnung, Beschreibung und Marke.

Wenn ich jetzt einen Suchbegriff ins Textfeld eintippe und dabei aus dem Sprungmenü eine Marke auswähle, erhalte ich die Meldung, dass 0 Ergebnisse gefunden wurden.

Den selben Schrott habe ich auch, wenn ich NICHTS ins Textfeld getippt habe und mir nur eine Marke aus dem Sprungmenü raussuche.

Tippe ich was ins Textfeld und lasse dabei das Sprungmenü "Marke" unberührt, funtzt die Such einwandfrei.

Womit kann denn das jetzt bitte zu tun haben? Wie kann ich das Prob. lösen?

Verfasst: 08.02.2010, 09:39
von mgutt
Das (die isset()-Geschichte):

Code: Alles auswählen

// Vriablen Definieren
$suchwort = mysql_real_escape_string&#40;$_POST&#91;'suche'&#93;&#41;;
$marke = mysql_real_escape_string&#40;$_POST&#91;'hersteller'&#93;&#41;;
sollte so:

Code: Alles auswählen

// vars
$suchwort = isset&#40;$_POST&#91;'suche'&#93;&#41; ? trim&#40;$_POST&#91;'suche'&#93;&#41; &#58; '';
$marke = isset&#40;$_POST&#91;'hersteller'&#93;&#41; ? trim&#40;$_POST&#91;'hersteller'&#93;&#41; &#58; '';
Erst wird mit isset() geprüft ob das post-Element gesetzt wurde und wenn ja, dann werden mit trim() Leerzeichen vor und nach dem String entfernt. Wenn nein, dann wird die Variable mit einem leerem String gefüllt.

Das ganze ist identisch zu:

Code: Alles auswählen

// vars
if &#40;isset&#40;$_POST&#91;'suche'&#93;&#41;&#41; &#123;
   $suchwort =  trim&#40;$_POST&#91;'suche'&#93;&#41;;
else &#123;
   $suchwort =  '';
&#125;
if &#40;isset&#40;$_POST&#91;'hersteller'&#93;&#41;&#41; &#123;
   $marke =  trim&#40;$_POST&#91;'hersteller'&#93;&#41;;
else &#123;
   $marke =  '';
&#125;
Spart also im Grunde nur Schreiberei.
Via ALTER TABLE test ADD FULLTEXT (marke) habe ich in meiner MySQL-Tabelle einen Fulltext-Index für die Spalte Marke erstellt.
Den kannst Du wieder löschen. Bei LIKE ist kein FULLTEXT Index notwendig. Nur bei MATCH ist dieser nötig und da fragst Du bekanntlich nur die drei Spalten ab.
0 Ergebnisse gefunden
Zum Debugging empfehle ich Dir einfach mal die Abfrage per echo ausgeben zu lassen. Also so:

Code: Alles auswählen

if &#40;$marke&#41; &#123; 
   $sql .=  " AND Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'"; 
&#125;
echo $sql;
Dann weißt Du zumindest schon mal wie die Abfrage im Ergebnis aussieht, je nachdem welche Option du ausgewählt hast. Die kannst Du dann parallel in phpmyadmin testen und optimieren. Ich vermute mal, dass Du dann selber herausfindest was da falsch läuft.

Gruß

Verfasst: 08.02.2010, 22:54
von ben78
@mgutt Vielen Dank!!!

Das mit isset() habe ich trotz des vielen Lesens wie z. B. im "Handbuch" immer wieder ausprobiert und es hat nie gefunzt. Und jetzt...so wie Du es mir gepostet hast, scheint mein isset() zu passen.
// vars
$suchwort = isset($_POST['suche']) ? trim($_POST['suche']) : '';
$marke = isset($_POST['hersteller']) ? trim($_POST['hersteller']) : '';
...und auch vielen Dank für diesen Tipp:
Den kannst Du wieder löschen. Bei LIKE ist kein FULLTEXT Index notwendig. Nur bei MATCH ist dieser nötig und da fragst Du bekanntlich nur die drei Spalten ab.
Das Feld Marke ist ein Sprungmenü, aus dem man sich für seine Suche eine Marke auswählen kann und kein Textfeld wo der User wie bei meiner Match-Abfrage was eintippen kann.

Dann erstelle ich also nur einmal einen Fulltext_index für die drei Spalten, die per Match abgefragt werden. Also für die Suche wo der User was eintippen kann und für das Sprungmenü (Marke auswählen) mache ich die Abfrage per LIKE. Ist eh nur eine Spalte aus der Tabelle.


Zum Debugging empfehle ich Dir einfach mal die Abfrage per echo ausgeben zu lassen. Also so:

Code: Alles auswählen

:
if ($marke) { 
   $sql .=  " AND Marke LIKE '%" . mysql_real_escape_string($marke) . "%'"; 
} 
[b]echo $sql;[/b][/quote]

Ein [b]echo $sql;[/b] hatte ich auch schon drinnen. Das zeigt mir dann die Querys an.
Ich erhalte als echo $sql;:
[b]SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('Produktfinder') AND Marke = '%Treck%'Suchergebnisse: 0[/b]

Es passt ja eigentlich alles in der Query. Das einzige was nicht passt ist das blöde Sprungmenü für die Marken. Immer wenn ich mir aus dem Sprungmenü eine Marke wie z. B. "Treck" auswähle - ob ich nun einen Suchbegriff wie z. B. Bergschuhe in das Textfeld getippt habe oder nicht -, spielt dabei keine Rolle -, erhalte ich permanent 0 Ergebnisse.

Wenn ich allerdings nur Bergschuhe in das Suchfeld eintippe und das Sprungmenü (Marke auswählen) unberührt lasse, funzt alles wie gewünscht. Aber eben nur dann, wenn keine Marke aus dem Sprungmenü ausgewählt wurde und wenn doch, dann halt eben immer 0 Ergebnisse

Verfasst: 08.02.2010, 23:04
von ben78
Jetzt konnte ich das Problem Dank den Tipps von mgutt um einiges aushebeln.

Jetzt kann ich zeitgleich nach einer Marke aus dem Sprungmenü und einem beliebigem Suchbegriff im Eingabefeld Suchen.

Das einzige Problem was ich jetzt noch habe ist das Wort in meiner AGAINST-Klammer "Produktfinder". Ich möchte, dass der User das Wort "Produktfinder" im Eingabefeld lesen kann aber bei der Such nicht berücksichtigt wird. Also wenn er nur nach einer Marke aus dem Sprungmenü suchen möchte. Deswegen erhalte ich höchstwahrscheinlich immer 0 Suchergebnisse, wenn ich das Textfeld bei der Suche unberührt lasse und nur nach einer Marke aus dem Sprungmenü suchen will, denn die SUMA sucht ja dann auch nach dem Wort "Produktfinder".

So sieht der Abschnitt des Codes für das Texteingabefeld aus:

Code: Alles auswählen

echo '<form action="./mysql/search-fulltext1.php" method="post">';
 echo '<div id="search-mysql">';
 echo '<input type="text" name="suche" size="20" ';
 echo "onfocus=\"if &#40;this.value =='Produktfinder'&#41; &#123; this.value=''&#125;\" ";
 echo "onblur=\"if &#40;value == ''&#41; &#123;value='Produktfinder'&#125;\" value=\"Produktfinder\" />";...
Wäre hierfür die Verwendung einer Stoppwortliste das richtige oder kann man das auch anders lösen?

Verfasst: 09.02.2010, 11:11
von ben78
Ich habe jetzt mal meine Querey zerteilt. Aber das bringt bei unberührtem Texteingabefeld bei der der Suche trotzdem die selbe Query mit dem Wort "Produktfinder" in der Against-Klammer. Also folgende:
SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('Produktfinder') AND Marke LIKE '%Adidas%'

Zerteilung der Querey sieht so aus:

Code: Alles auswählen

// Querey
$sql = "SELECT * FROM beauty WHERE";

if &#40;$suchwort&#41; $sql .= " MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";

if &#40;$marke&#41; 
&#123;
if &#40;$suchwort&#41; $sql .= " AND";
$sql .=  " Marke = '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;

// if sucheingabe
$db_erg = mysql_query&#40; $sql &#41;;
if &#40; ! $db_erg &#41;
und nicht die gewünschte Querey wie folgt, wenn nur aus dem Sprungmenü eine Marke für die Suche ausgewählt wurde und dabei das Texteingabefeld unberührt bleibt:
SELECT * FROM test WHERE Marke LIKE '%Adidas%'

War das überhaupt der richtige Ansatz???

Verfasst: 09.02.2010, 12:05
von Synonym
Na dann prüfe doch einfach vor den ganzen Abfragen ob $suchwort = Produktfinder ist. Und wenn ja, dann setze die Variable zurück, so dass if ($suchwort) nicht mehr greift.

oder erweitere die if-Bedingung, damit die das mit berücksichtigt, ala "if ($suchwort AND $suchwort != 'Produktfinder')"

oder gleich bei der Übernahme
$suchwort = (isset($_POST['suche']) AND $_POST['suche'] != 'Produktfinder') ? trim($_POST['suche']) : '';