Antworten auf deine Fragen:
Neues Thema erstellen

Volltextsuche in PHP für MySQL (Werte und Implode)

Ben78

Nicht mehr ganz neu hier

Hi psd-tutorials-Leutz,

ich bin's mal wieder und freu mich schon auf Antworten von Euch, die mir weiterhelfen können.

Also folgendes, ich bin gerade dabei eine Volltextsuche in PHP für meine Website zu basteln. Und noch mal für alle, ich bin immer noch ein absoluter Anfänger in stuff PHP...ich bin jedem Dankbar, der mir das so erklären kann, dass es sogar der dümmste Esel ( wie z. B. ich in Sachen PHP ) verstehen kann...BIG THX @ All

In meinem Skript (PHP) für die Volltextssuche findet sich folgender Abschnitt:

Code:
$locData = array();
foreach ($inWords as $locKey => $locVal)
  {
      if (strlen($locVal) > 32)

Jetzt weiss ich nicht, wie ich für $inWords die Werte herbekommen soll. Ich weiss nur folgendes aber kann mir nichts darunter vorstellen:

"in $inWords sind alle Wörter des Datensatzes vorhanden".

Ich bin gerade auch dabei herauszufinden, wie und welche Daten ich per implode in das Array einfügen kann bzw. muss. Und ist es richtig, dass die Daten dann zwischen die beiden Klammern gehören
Code:
$locData = array(D A T E N);
?
Kann mir aber nicht vorstellen, dass damit die CSV Produktdatensätze gemeint sind oder?...die stecken doch alle in der MySQL Tabelle, wenn mich nicht alles täuscht?!?
 
Zuletzt bearbeitet:

G

goobar

Guest

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Hallo,

gibt es schon ein Konzept, wie die benötigten Daten in die mysql Tabelle kommen?
Vielleicht solltest du erstmal einen Projektplan aufstellen, was alles zu tun bzw. zu beachten ist.

Also, wie kommst du an die ganzen Daten, wie werden die dann in dein Datenmodell(was du auch noch benötigst) eingepflegt, und wie bekommst du sie wieder raus. Mir scheint, als ob du einfach mal losprogrammiert hast, oder?
Wenn nicht, dann entschuldige ich mich gleich an der Stelle.

Also lieber erstmal etwas theoretisch rangehen, ein paar skizzen oder Diagramme machen. Für Funktionen bei php.net vorbei schauen. Die Funktion explode() sollte interessant sein. Diese macht aus einem String, also deinem Text, einen Array(dessen Daten dann in die Datenbank geschrieben werden können).

Eine Volltextseite ist für einen Anfänger ein sehr ergeiziges Projekt... vielleicht zu ergeizig?
 

lachender_engel

Aktives Mitglied

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

"in $inWords sind alle Wörter des Datensatzes vorhanden".
Ich finde Deine Erklärung verwirrend.

Wenn Du eine Volltextdatensuche in der Datenbank machen willst geht das so:

Code:
SELECT xyz FROM tabelle WHERE suchfeld LIKE $suchword
und wenn Du über mehrere Felder suchen willst, schreibst Du

Code:
SELECT xyz FROM tabelle WHERE suchfeld1 LIKE $suchword OR suchfeld2 LIKE $suchword...
Eben ganz banal.

Oder was genau meinst Du?
 

Ben78

Nicht mehr ganz neu hier

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Erst mal vielen Dank!

wenn ich meine Frage(n) zu verwirrend gestellt habe, dann liegt das daran, dass in Sachen PHP noch ein schrecklicher Anfänger bin.

Ich habe eine MySQL Datenbank mit einer Tabelle in der Produktdatensätze gespeichert sind. Am Ende sollen ca. 500.000 Datensätze in die Tabelle. Damit diese nicht lahmgelegt wird, sollte man hiervon absehen, habe ich mir sagen lassen:

Code:
$sql = "select * from test where Bezeichnung like '%" . $suchwort . "%' or Beschreibung like '%" . $suchwort . "%' or Marke like '%" . $suchwort . "%'";

Stattdessen soll ja auf die Variante der Volltextsuche gegriffen werden. Damit zum einen auch die Suchabfrage nicht zu lange dauert.

Hier mal mein Script.

PHP:
<?php
error_reporting(E_ALL);

// Zum Aufbau der Verbindung zur Datenbank
define ( 'MYSQL_HOST', '' );
define ( 'MYSQL_BENUTZER', '' );
define ( 'MYSQL_KENNWORT', '' );
define ( 'MYSQL_DATENBANK', '' );

$db_link = mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);

mysql_set_charset('utf8',$db_link);

$db_sel = mysql_select_db( MYSQL_DATENBANK )
or die("Auswahl der Datenbank fehlgeschlagen");

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

$sql = "

SELECT ca_id AS st_doc_id, 
           st_id, 
           'article' AS st_type, 
           CONCAT(ca_title, ' ', ca_text, ' ', ca_category) AS search_data 
      FROM cms_article 
 LEFT JOIN search_time 
        ON st_doc_id = ca_id 
       AND FIND_IN_SET('article', st_type) 
     WHERE FIND_IN_SET('approved', ca_status) 
       AND (   st_id IS NULL 
            OR ca_date > st_date 
           ) 
  ORDER BY ca_date";
 

$locSearch[] = "=�=i";
  $locSearch[] = "=ä|�=i";
  $locSearch[] = "=ö|�=i";
  $locSearch[] = "=ü|�=i";
  $locSearch[] = "=á|à |â|�|�|�=i";
  $locSearch[] = "=ó|ò|ô|�|�|�=i";
  $locSearch[] = "=ú|ù|û|�|�|�=i";
  $locSearch[] = "=é|è|ê|�|�|�|ë=i";
  $locSearch[] = "=Ã|ì|î|Ã�|Ã�|Ã�|ï=i";
$locSearch[] = "=ñ=i";
 $locSearch[] = "=ç=i";
 $locSearch[] = "=([0-9/.,+-]*\s)=";
 $locSearch[] = "=([^A-Za-z])=";
 $locSearch[] = "= +=";
     
 $locReplace[] = "ss";
 $locReplace[] = "ae";
 $locReplace[] = "oe";
 $locReplace[] = "ue";
 $locReplace[] = "a";
 $locReplace[] = "o";
 $locReplace[] = "u";
 $locReplace[] = "e";
 $locReplace[] = "i";
 $locReplace[] = "n";
 $locReplace[] = "c";
 $locReplace[] = " ";
 $locReplace[] = " ";
 $locReplace[] = " ";
 
 $outString = trim(strtolower(stripslashes(strip_tags($inString))));
 $outString = preg_replace($locSearch, $locReplace, $outString );



// in $inStopwords ist ein numerisch indiziertes Array mit allen Stoppworten
  
  $locSearch[] = "=(\s[A-Za-z]{1,2})\s=";
  $locSearch[] = "= " . implode(" | ", $inStopwords) . " =i";
  $locSearch[] = "= +=";
  
  $locReplace[] = " ";
  $locReplace[] = " ";
  $locReplace[] = " ";
 
 $outString = " " . str_replace(" ", "  ", $inString) . " ";
 $outString = trim(preg_replace($locSearch, $locReplace, $outString));


// in $inWords sind alle Wörter des Datensatzes vorhanden
  // in $inStType ist der aktuelle Wert der Spalte 'st_type' enthalten
  // in $inStDocId ist der aktuelle Wert der Spalte 'st_doc_id' enthalten
 
  $locData = array();
  
  foreach ($inWords as $locKey => $locVal)
  {
      if (strlen($locVal) > 32)
     {
         $locVal = substr($locVal, 0, 32);
     }
     
     $locSwId = fetchWordId($locVal);  // holt Schlüssel bzw. speichert Wort neu in Datenbank
     
     if (isset($locData[$locSwId]))
     {
         $locData[$locSwId]["si_count"] = $locData[$locSwId]["si_count"] + 1;
     }
     else
     {
         $locData[$locSwId]["si_sw_id" ] = $locSwId;
         $locData[$locSwId]["si_type"  ] = $inStType;
        $locData[$locSwId]["si_doc_id"] = $inStDocId;
         $locData[$locSwId]["si_count" ] = 1;
     }
 }
 
sort($locData);
?>
 
Zuletzt bearbeitet:

DJWebdesign

The Only-One

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Hallo,
kann Deinem Code nicht wirklich folgen. Erscheint mir als viel zu umständlich.

Warum sollte die einfache Abfrage, wie Lachender Engel Sie beschrieben hat die Datenbank lahm legen?:hmpf:

Ich würde es genau so machen...

MfG

DJ
 

sharkandy

Noch nicht viel geschrieben

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Hallo Ben78,

Die Volltextsuche von MYSQL kann man hier auch gut einsetzen:

1.) einmalig einen Volltext-Index erstellen z.B. mit
CREATE FULLTEXT INDEX test_ftindex ON test (Bezeichnung, Beschreibung, Marke);

2.) Die Suche im SQL wie folgt:
$sql = "SELECT * FROM test WHERE MATCH(Bezeichnung, Beschreibung, Marke) AGAINST('" . $suchwort . "')"

Aber bitte die Bedingungen für Volltextsuche, Stoppwortlisten verwalten etc. im MySQL referenz Handbuch nachschlagen!

Gruß

Andreas
 

Ben78

Nicht mehr ganz neu hier

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

@sharkandy Very B I G THX!!!;)


Ich habe jetzt folgendes PHP Skript:


PHP:
<?PHP
Verbindung etc.
.
.
.
error_reporting(E_ALL);



$db_link = mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);

$db_sel = mysql_select_db( MYSQL_DATENBANK )
or die("Auswahl der Datenbank fehlgeschlagen");

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

$sql = "SELECT * FROM beauty WHERE MATCH(Bezeichnung, Beschreibung, Marke) AGAINST('" . $suchwort . "')";

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

die('Ungültige Abfrage: ' . mysql_error());
}
$anzahl = mysql_num_rows($db_erg);
echo "Suchergebnisse: $anzahl";

echo '<table border="1" style="border-collapse:collapse">';
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))

{
echo "<tr class='tabelle'>";
echo "<td class='bild'><img src='". htmlspecialchars($zeile['Abbildung']) . "' /></td>";
echo "<td class='title'>". $zeile['Bezeichnung'] . "</td>";
echo "<td class='body'>". $zeile['Beschreibung'] . "</td>";
echo "<td class='marke'>". $zeile['Marke'] . "</td>";
echo "<td class='preis'>". $zeile['Preis'] . " &euro;</td>";
echo "<td class='bestellen'><a href='". htmlspecialchars($zeile['Anbieter']) . " title='zur Bestellung'>Schicken lassen</a></td>";

echo "</tr>";
}
echo "</table>";
mysql_free_result( $db_erg );

if ( $db_link )
{
echo 'Verbindung erfolgreich: ';
echo $db_link;
}

else
{
	
// hier sollte dann später dem Programmierer eine
// E-Mail mit dem Problem zukommen gelassen werden
die('keine Verbindung möglich: ' . mysql_error());
}
mysql_close($db_link );
?>

Hierzu folgender HTML-Code:
HTML:
<form action="./mysql/search-fulltext1.php" method="post">
						<div id="search-mysql">
							<input type="text" name="suche" size="20" onfocus="if (this.value =='Produktfinder') { this.value=''}" onblur="if (value == '') {value='Produktfinder'}" value="Produktfinder" />
							<input type="submit" value="GO">
							<select name="suche"> <option value="" SELECTED >Marke</option><option>Cartier</option><option>Ralph Lauren</option><option>Christian Dior</option></select>
							<input type="submit" value="GO">
						</div>
					</FORM>


Mein Ziel ist eine einfache Volltext suche bei der der User anhand eines beliebigen Suchbegriffes im Textfeld und obligatorisch eine Marke aus dem Sprungmenü auswählen und danach suchen kann. z.B. Textfeld: "Sportschuhe" Sprungmenü: "adidas"(obligatorisch). Das probiere ich jetzt schon trotz des vielen Lesens in diversen Seiten seit ca. 2 Wochen...Das kann doch nicht so schwer sein! Mich würde auch interessieren, wie ich mittels PHP die Spalte "Marke" aus Meiner MySQL-Tabelle ins Sprungmenü hauen kann?!?
 
Zuletzt bearbeitet:

sharkandy

Noch nicht viel geschrieben

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Ich denke du sochst als Ersatz für deine HTML Datei ein PHP-Skript wie folgendes:
PHP:
<?php
Verbindung etc.
.
.
.
error_reporting(E_ALL);
// Zum Aufbau der Verbindung zur Datenbank
.
.
.
.
$db_link = mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
$db_sel = mysql_select_db( MYSQL_DATENBANK )
or die("Auswahl der Datenbank fehlgeschlagen");
$sql = "SELECT Marke FROM beauty ORDER BY Marke";
if ($db_erg = mysql_query( $sql ))
{
 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 (this.value =='Produktfinder') { this.value=''}\" ";
 echo "onblur=\"if (value == '') {value='Produktfinder'}\" value=\"Produktfinder\" />";
 echo '<input type="submit" value="GO">';
 echo '<select name="suche">';
 echo '<option value="">Marke</option>';
 while ($row = mysql_fetch_array( $db_erg))
 {
  echo '<option value="' . $row["Marke"] . '">' . $row["Marke"] . '</option>'; 
 }
 echo '</select>';
 echo '<input type="submit" value="GO">';
 echo '</div></FORM>';
}
else
{
 die('Ungültige Abfrage: ' . mysql_error());
}
?>
 
Zuletzt bearbeitet:

lachender_engel

Aktives Mitglied

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

@sharkandy: Doll, die Volltextsuche kannte ich ja noch gar nicht - Super wie die klappt ;-)

@Ben78: Verstehe ich es richtig, dass Du dem User zwei Selektionen geben willst:
1. Eine Marke
2. Ein Suchwort

Wenn eine Marke ausgewählt ist soll das Suchwort nur in der Bezeichnung und Beschreibung der Felder ausgewählt werden, die der Marke entsprechen.
Wenn keine Marke ausgewählt ist dann soll das Suchwort in Bezeichnung, Beschreibung und Marke aller Datensätze gesucht werden.

Ist das so richtig?

Wenn ja, dann kannst Du es auch so programmieren.

Du gibst an
PHP:
$sql = "SELECT * FROM beauty WHERE MATCH(Bezeichnung, Beschreibung, Marke) AGAINST('" . $suchwort . "')";
Du fragst ab, ob das Selectfeld der Marke ausgewählt ist.
Wenn das zutrifft machst du noch ein
PHP:
$sql = $sql." AND Marke = $marke"

Damit wird die Suche um die WHERE-Bedingung der Marke erweitert,

Ok?
 
Zuletzt bearbeitet:

saila

Moderatorle

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

HI,

um hier mal mit den Begrifflichkeiten aufzuräumen. Eine Volltextsuche erfolgt per "MATCH" und "AGAINST". Eine Suche per LIKE ist eine reine Textsuche und somit keine VOLLTEXT-SUCHE!

Um eine Volltextsuche zu ermöglichen, müssen bestimmte Voraussetzungen in dem betreffenden Datenbanktabelle/Feld erfüllt sein.

Also bevor man hier von einer Volltextsuche labert und somit falsches Wissen/Infos liefert, erst selbst korrekt informieren!

Ein Tutorial zu einer Volltextsuche bezogen auf MySql ist hier zu finden:
 

Ben78

Nicht mehr ganz neu hier

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

@sharkandy VERY BIG THX ;)
Vielen Dank für das tolle Skript. Nur ein kleines Problem. Und zwar:
Im Sprungmenü werden alle Marken so oft angezeigt, soft ein Produkt der Marke entspricht. Also z. B. 6 x Schuhe von Adidas in der MySQL-Tabelle und Folge: 6 X Adidas im Sprungmenü untereinander.


@lachender_engel ebenfalls VERY BIG THX ;)
Ja, dass hast Du richtig aufgefasst, was meine SUMA angeht.
Kannst Du mir noch kurz verraten, an welcher Stelle im Skript ich den zweiten Codeschnippsel einfügen muss.
PHP:
$sql = $sql." AND Marke = $marke"

Nochmal vielen Dank an alle Leutz...Tolles Forum...das beste bis jetzt;)
 
Zuletzt bearbeitet:

lachender_engel

Aktives Mitglied

Also bevor man hier von einer Volltextsuche labert und somit falsches Wissen/Infos liefert, erst selbst korrekt informieren

Sage mal, was bist Du den für Einer? Hat Dich die Klugscheißerei eingeholt?
Die Menscheit ist froh, dass DU " korrekt informiert" bist!

"Eine Volltextrecherche ist das Auffinden von Texten in einer Vielzahl gleicher oder verschiedenartiger Daten." Nicht mehr und nicht weniger.

und...

"Im Kontext von Datenbanken bedeutet Volltextsuche, dass zusätzlich zu einer sonst etwa genutzten SQL-Abfrage, die eine Kenntnis der Feldstruktur voraussetzt, auch Feld-unabhängig gesucht werden kann."

"Kann" nicht "muss"!

Die Art, wie eine solche Suche umgesetzt wird ist vielfälltig.
Toll, wenn in diesem Forum Menschen mit Wissen glänzen, ihre Mitmenschen daran teilhaben lassen und sinnvolle Beiträge schreiben:

Eine Volltextsuche erfolgt per "MATCH" und "AGAINST".

Aber so eine Aussage ist Quatsch!

Eine Suche per LIKE ist eine reine Textsuche und somit keine VOLLTEXT-SUCHE!

Es ist nicht die beste und eleganteste Methode, aber auch mit LIKE bleibt es eine Volltextsuche!

Danke für Deinen Beitrag und den Hinweis auf MATCH und AGAINST - habe ich bisher so auch nicht gewusst.
Aber den Rest Deines Beitrages kannst Du echt knicken!

Kannst Du mir noch kurz verraten, an welcher Stelle im Skript ich den zweiten Codeschnippsel einfügen muss.
PHP:
$sql = $sql." AND Marke = $marke"
Nochmal vielen Dank an alle Leutz...Tolles Forum...das beste bis jetzt;)

Du baust das nach dem setzen der Variablen $sql=... ein und fragst ab

PHP:
if ($marke) $sql = $sql." AND Marke = $marke";[php]

Also dann, wenn das Select-Feld Marke einen Wert hat, hängst Du den AND-Tag an die WHERE Abfrage dran, sonst nicht.
 
Zuletzt bearbeitet von einem Moderator:

sharkandy

Noch nicht viel geschrieben

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

@Ben78: Wenn du die Marke nicht mehrfach sondern jede nur einmal haben möchtest muss du den Select abwandeln zu einem

SELECT DISTINCT Marke FROM ....

Andreas
 

Ben78

Nicht mehr ganz neu hier

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

@sharkandy
Funktioniert bestens...Vielen Dank!!!:)

@lachender_engel

ich habe jetzt folgenden Code in meinem PHP Skript und komme einfach nicht darauf, was ich hier falsch mache.

PHP:
[b]LINE 40:[/b] $suchwort = mysql_real_escape_string($_POST['suche']);

[b]LINE 46:[/b] $sql = "SELECT * FROM test WHERE MATCH(Bezeichnung, Beschreibung, Marke) AGAINST('" . $suchwort . "') AND MATCH Marke AGAINST ('" . $marke . "')";

$db_erg = mysql_query( $sql );
if ( ! $db_erg )
[b]LINE 53:[/b] if ($marke) $sql = $sql." AND Marke = $marke";

{
die('Ungültige Abfrage: ' . mysql_error());
}

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
 

lachender_engel

Aktives Mitglied

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Ben, Du solltest schon ein wenig die Weiten des Internets und Google nutzen...

Also, zwei Dinge:

PHP:
[b]LINE 40:[/b] $suchwort = mysql_real_escape_string($_POST['suche']);
 
[b]LINE 46:[/b] $sql = "SELECT * FROM test WHERE MATCH(Bezeichnung, Beschreibung, Marke) AGAINST('" . $suchwort . "') AND MATCH Marke AGAINST ('" . $marke . "')";
 
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
[b]LINE 53:[/b] if ($marke) $sql = $sql." AND Marke = $marke";
 
{
die('Ungültige Abfrage: ' . mysql_error());
}

Bringt nicht das Ergebnis, das Du willst - denn Du musst die SQL-Query erweitern BEVOR Du sie absetzt.

PHP:
[b]LINE 40:[/b] $suchwort = mysql_real_escape_string($_POST['suche']);
 
[b]LINE 46:[/b] $sql = "SELECT * FROM test WHERE MATCH(Bezeichnung, Beschreibung, Marke) AGAINST('" . $suchwort . "') AND MATCH Marke AGAINST ('" . $marke . "')";
 
if ($marke) $sql = $sql." AND Marke = $marke";
 
echo $sql;
 
$db_erg = mysql_query( $sql );

Ich habe Dir die Abfrage geändert und mal ein Echo hinzugefügt - dann siehst Du, wie die Query aussieht.

Und diese Medlung:
Ungültige Abfrage: Can't find FULLTEXT index matching the column list
hat damit nichts zu tun. Sie kommt, wenn Du den FULLTEXT nicht über alle Spalten indiziert hast:
Code:
ALTER TABLE links ADD FULLTEXT (Bezeichnung, Beschreibung, Marke);
Ohne Indizierung auch keinen FULLTEXT.
 

sharkandy

Noch nicht viel geschrieben

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Hallo ben78,

1.) Ich habe deinem Wunsch aus der PN entsprochen und den Quelltext angepasst ...
2.) Die Notice, die du erhälst zum "Undefined Index", kommt von der $_POST['suche'].
Wenn das Skript aufgerufen wird, aber im Formular das Feld suche nicht definiert ist, bekommst du diese Warnung. Das kannst du umgehen, indem du error_reporting nicht auf E_ALL sondern auf (E_ALL &~E_NOTICE) setzt. Allerdings verlierst du dann auch bei der Entwicklung hilfreiche Hinweise auf potentielle Probleme. Daher würde ich eher sicherstellen, dass du nur auf Felder zugreifst, die auch gesetzt sind (z.B. über eine Abfrage
if (isset($_POST['suche'])) .....

Gruß

Andreas
 

Ben78

Nicht mehr ganz neu hier

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

@sharkandy & lachender_engel Vilen Dank! Eure Tipps haben mir wietergeholfen und ich habe wieder etwas dazu gelernt. Aber noch klappt's nicht ganz.


Ich habe mein Skript nun etwas umgeschrieben und komme meinem Ziel langsam näher. In Sachen Sicherheit und Funktionalität, versteht sich. Ich hoffe, dass mir das weitest gehend gelungen ist. Und hoffentlich gehe ich Euch mit der dummen Fragerei eines nervigen Anfängers nicht auf den Senkel. Ich bin auch wirklich fleißig am Lesen, was diverse Seiten angeht. Nur schnall ich's noch nicht so ganz.

Mein Skript sieht jetzt so aus:
PHP:
// Vriablen Definieren
$suchwort = mysql_real_escape_string($_POST['suche']);
$marke = mysql_real_escape_string($_POST['hersteller']);

// Abfrage
$sql = "SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('" . mysql_real_escape_string($suchwort) . "')";
if ($marke)
{ 
$sql .=  " AND Marke = '%" . mysql_real_escape_string($marke) . "%'"; 
}

$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}

$anzahl = mysql_num_rows($db_erg);
echo "Suchergebnisse: $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?
 

sharkandy

Noch nicht viel geschrieben

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Ben78,

hast du mal spasseshalber vor dem ausführen des Query ein

echo "<hr>$sql<hr>";

gemacht um das erzeugte SQL Statement anzusehen ... die Frage wäre wie es konkret bei Einfügen der Marke aussieht.

Gruß

Andreas
 

lachender_engel

Aktives Mitglied

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Ich glaube das liegt an dem mysql_real_escape_string.

Ändere Dein Skrip so:

PHP:
// Abfrage
$sql = "SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('" . mysql_real_escape_string($suchwort) . "')";
if ($marke)
{ 
$sql .=  " AND Marke = '%" . mysql_real_escape_string($marke) . "%'"; 
}
 
echo $sql;
 
$db_erg = mysql_query( $sql );

und dann so:

PHP:
// Abfrage
$sql = "SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('" . mysql_real_escape_string($suchwort) . "')";
if ($marke)
{ 
$sql .=  " AND Marke = '%" . $marke . "%'"; 
}
 
echo $sql;
 
$db_erg = mysql_query( $sql );

Poste dann mal, beide Querys bzw. Du siehst dann vielleicht schon, was falsch ist.
 

Ben78

Nicht mehr ganz neu hier

AW: Volltextsuche in PHP für MySQL (Werte und Implode)

Ja, ein echo $sql;, hatte ich schon drinnen. Das zeigt mir dann die Querys an.

Nachdem ich jetzt beide Querys wie, lachender_engel sie gepostet hat, ausgeführt habe, erscheint in beiden Fällen folgende, identische Meldung via echo $sql;:

SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('Produktfinder') AND Marke = '%Adidas%'Suchergebnisse: 0

...ob nun mit oder ohne
PHP:
mysql_real_escape_string

Könnte es vielleicht daran liegen, dass sich in der "Against" Klammer AGAINST('Produktfinder') das Wort "Produktfinder" befindet und die Suma nach "Produktfinder" sucht und deshalb 0 Suchergebnisse aus der Tabelle Liefert?

...aber das kann es meiner Meinung nach auch nicht sein. Weil selbige Fehlermeldung wie oben in Fett dann auch erscheint, wenn ich jetzt sagen wir mal "Sportschuhe" ins Textfeld eintippe und mir gleichzeitig aus dem Sprungmenü eine Marke wie z. B. Adidas auswähle. Natürlich schaut die Against Klammer dann so aus: AGAINST('Sportschuhe').

Wenn ich jetzt das Sprungemenü (Marke auswählen) unberührt lasse und für meine Suche nur Sportschuhe in das Textfeld eintippe und die Marke quasi egal ist, erhalte ich folgendes echo $sql;:

SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('sportschuhe')Suchergebnisse: 114

Tabelle wird dann wie gewünscht angezeigt und alles ist halbwegs perfekt. Aber nur wenn eben, das Sprungmenü (Marke auswählen) unberührt bleibt.
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.615
Beiträge
1.538.352
Mitglieder
67.527
Neuestes Mitglied
Christian Eidelloth
Oben