[PHP] Problem mit Suchfunktion

STL

Well-known member
ID: 216039
L
21 Mai 2006
336
13
Ich stehe mal wieder vor einem Problem, diesmal vor einem ohne Fehlermeldung. Und zwar versuche ich mittels PHP eine Tabelle in einer MySQL-Datenbank zu durchsuchen. Dabei sollen die Spalten Titel und Beschreibung durchsucht werden. Soweit komme ich zurecht. Damit, falls mehrere Suchbegriffe eingegeben werden, nach jedem Suchbegriff einzeln gesucht wird lasse ich den übermittelten String in ein Array übertragen und jetzt wird es schwierig: Mit einer foreach() Funktion möchte ich zu jedem einzelnen Wert im Array die jeweiligen Spalten durchsuchen lassen. Wenn ich nun aber zwei Suchbegriffe eingebe und einer von diesen in der Spalte 'Titel' und der andere in der Spalte 'Beschreibung' gefunden wird, wird das Ergebnis doppelt ausgegeben. Wenn der erste Suchbegriff gar nicht gefunden werden kann, der zweite aber, wird erst "Keine Einträge gefunden" ausgegeben und im Anschluss der gefundene Datensatz. Wie kann ich das verhindern, dass ein Datensatz doppelt ausgegeben wird oder, wenn mindestens ein Suchbegriff richtig war, trotzdem noch die Error-msg ausgegeben wird?

Hier mal der Code:
PHP:
<?php
    }
    else {

    $keyword = empty($_GET['keyword']) ? die ("ERROR: Kein Suchbegriff eingegeben! <a href='index.php'>Zurück</a>") : mysql_escape_string($_GET['keyword']);
    $arrkey = explode(' ', $keyword);

    //Variablen bestimmen
    
    $host = "localhost";
        $user = "stl";
        $pass = "******";
     $db = "stl"; 

    // open connection
        $connection = mysql_connect($host, $user, $pass) or die ("Verbindung zur Datenbank kann nicht hergestellt werden!");
    
        // select database
        mysql_select_db($db) or die ("Datenbank kann nicht ausgewählt werden!");
    
    foreach($arrkey as $key) {
    $select= "SELECT DISTINCT Titel, Beschreibung FROM eintragen WHERE Titel LIKE '%$key%' OR Beschreibung LIKE '%$key%'";
    $query= mysql_query($select);
    if (mysql_num_rows($query) > 0) {
    while($row=mysql_fetch_array($query))
    {
    echo $row[Titel];
    echo $row[Beschreibung];
    }
    }
    
    
    
    else {
    echo "Keine Einträge gefunden!";
    }
    }

    // free result set memory
    mysql_free_result($query);

    // close connection
    mysql_close($connection);
    
    }

    
    ?>
 
Du könntest einmal nache allen Begriffen auf einmal suchen (... Titel like '%$key1%' or Title like '%$key2%' or ...).

Die andere Möglichkeit, du setzt eine boolean-Variable (anfangs false) jedes mal auf true, wenn eine Suche Treffer lieferte. Am Ende weißt du dann, ob "Keine Einträge gefunden!" zutrifft oder nicht.
 
Okay, das mit der boolean variable ist gut, aber wie kann ich nach allen begriffen auf einmal suchen, wenn ich nicht weiß, wieviele Begriffe der User eingegeben hat? (sorry, das ist erst mein 5ter tag als PHPler ;) )
 
Okay, das mit der boolean variable ist gut, aber wie kann ich nach allen begriffen auf einmal suchen, wenn ich nicht weiß, wieviele Begriffe der User eingegeben hat? (sorry, das ist erst mein 5ter tag als PHPler ;) )

Du kannst dir ja z.B. den restlichen Query-String dynamisch erzeugen (foreach-Schleife, jeden einzelnen Suchbegriff durchlaufen, Titel = '%WERT_AKTUELL%', Beschreibung = '%WERT_AKTUELL%' an den dyn. String anhängen, am Anfang kein OR hinhängen, ansonsten schon).

Hier mal in Code (allerdings nur für Titel) ausgedrückt:

PHP:
<?php
// getesteter Code
function create_query_string($elements) {
  $query_string = '';
  foreach($elements AS $key => $element) {
    $query_string .= ($key != 0) ? " OR titel = '%".$element."%'" : "titel = '%".$element."%'";
   }
   return $query_string;
}

echo create_query_string(array('test','foo','phun'));

/* Ergebnis:
titel = '%test%' OR titel = '%foo%' OR titel = '%phun%' 
*/
?>
 
args... auf jedenfall so machen wie johnson es vorschlägt. das was du da machst ist glaub ich fast schon der schlechteste weg den man gehen könnte...
 
hm okay, danke, ich werd mir die Sache mal genauer ansehen, im Moment fehlt mirnoch das nötige know-how um das auf Anhieb zu verstehen, aber trotzdem schönen dank!