Forum
Tipps
News
Menu-Icon

In einem String nach Teilstring suchen

Hallo, ich habe mir gerade eine kleine Suchfunktion über ein Array erstellt. Das ganze sieht so aus:

begriffe.php

Zitat
<?php
include "such_index.php";
?>

<form method="post" action="begriffe.php">
  <input type="text" size="15" name="suche">
  <input type="submit" name="Button" value="Suchen">
</form>

<?php
if($_POST['suche'] == "") {
} else {
    $begriff = $_POST['suche'];
    $begriff = strtolower($begriff);
    $ergebnis = $begriffe[$begriff];
    if(isset($begriff) AND isset($begriffe[$begriff])) {
      echo $ergebnis;
    } else {
      echo "<h3>Fehler</h3>Der von Ihnen eingegebene Suchbegriff ist in der Datenbank leider nicht vorhanden!";
    }
}
?>


Die Includete such_index.php sieht folgendermaßen aus:

Zitat
<?php
    $begriffe = array();
      $begriffe['currywurst'] = "<h3>Currywurst</h3>;
?>


Die suche reagiert so wie ich es erwartet habe! Allerdings möchte ich ganz gerne auch wenn ich (wie in meinem Beispiel) z.B. "curry" eingebe auch, dass die Currywurst angezeigt wird, wie kann ich das möglichst einfach realisieren?

Für eine kompetente Hilfestellung bin ich dankbar ;-)

Antworten zu In einem String nach Teilstring suchen:

Ich suche jetzt nicht nach der Möglichkeit das Array um alle möglichen Varianten zu erweitern wie z.B."curry" und "wurst" sondern um eine Möglichkeit meine Variable $begriff mit dem Array $begriffe zu vergleichen und dann den naheliegendsten aufzurufen bzw. evt. eine liste einzublenden mit den möglichen Varianten!

Also das mit der Liste hört sich f. mich schon mal kompliziert an, aber das mit dem naheliegenden Ergebnis sollte (zummindest von der Logik) machbar sein, aber wie?!?!?

Aber ich bin für jeglichen Lösungsansatz dankbar!

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Eine etwas unkonventionelle Methode, wenn du mich fragst, Gerade die Aufbewahrung des Suchbegriffs im Key eines Arrays erschwert die Sache doch nur unnötig. Aber funktionieren würde es schon, wenn du einfach mal das  Begriffe-Array per foreach durchläufst und den Key mit dem Suchbegriff abgleichst. Das kann zur Not auch über String-Ähnlichkeitsfunktionen erfolgen, um auch ähnliche Begriffe zuzulassen (den Grad der Ähnlichkeit bestimmst du). Eine besonders performante Lösung ist das nicht, aber es sollte funktionieren ;)

greez 8)
JoSsiF

Wie könnte man denn das ganze performanter gestalten, lasse mich da ja gerne eines besseren belehren...

...sollte vielleicht noch dazu erwähnen, dass ich im mom. noch dabei bin die php zu lernen... Mein Lernmethode ist das analysieren von Beispielen, dass heisst, wenn jmd. ein überschaubares Beispiel hat, dann bitte reinsetzen, dass ich mir dessen Funktion mal anschauen kann und ggf. erweitern bzw. anpassen kann!

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi |

Über das Thema Suchfunktion haben sich schon ganz andere Leute den Kopf zerbrochen. Die Lösung führt häufig (eigentlich meistens) über einen Suchindex. Dabei können durchaus mehrere indizierte Begriffe auf dasselbe Objekt zeigen. Das kann diese einfache Zuordnung, wie sie in deinem Array vorkommt, nicht leisten. Allerdings verweist du ja auch nicht auf ein Objekt, sondern hast als Ergebnis mehr oder weniger nur einen String.

Die Frage ist jetzt, ob das nur zu Übungszwecken dienen soll, denn dann kannst du durchaus die vorgeschlagene Methode mit dem foreach() verwenden. Für eine ernsthafte Implementierung einer Suchfunktion wäre es wenig sinnvoll, das Rad neu zu erfinden. Da kann man auf etablierte Lösungen wie z.B. Zends Lucene-Portierung auf PHP zurückgreifen ;)

greez 8)
JoSsiF

Es soll später mal implemntiert werde auf meiner Seite, allerdings nicht als Suchfunktion f. meine Seite sonder eher als eine Art Wörterbuch f. Fachbegriffe (im mom. ca. 200)...

Liese sich das denn vernünftiger als MySQL-Datenbank verwalten, wenn ja, wie könnte man denn da eine Suchfunktion erstellen, hast du da vielleicht ein einfaches Beispielscript oder ein Tutorial für mich, was ich mir mal angucken kann? Wäre echt super...

Zur Erläuterung:
Das ich das mit nem Array gelöst habe war im mom. mehr oder weniger nur ne Variante, wie ich es selbst und ohne fremde Hilfe erstmal erstellen konnte, hab mir ein array mit 3 beispielen erstellt und dann eben die Abfrage dazu, nur später ist mir dann aufgefallen, dass ich (mit meinem Wissen) nur Abfragen machen kann, die identisch mit dem array sind!


Vielen Dank aufjedenfall schonmal bisher!

So, nun habe ich folgende lösung entwickelt, mich würde mal interessieren, was ihr von der Möglichkeit haltet:

Zitat
<form method="post" action="index.php?section=begriffe">
  <input type="text" size="15" name="suche">
  <input type="submit" name="Button" value="Suchen">
</form>


<?php
if($_POST['suche'] == "") {
} else {
    $suchbegriff = $_POST['suche'];
    $suchbegriff = strtolower($suchbegriff);

    include "sql_keys.php";
    echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"page.css\" />\n";

    @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die("Keine Verbindung zur Datenbank, Fehlermeldung: ".mysql_error()."<br>");
    mysql_select_db(MYSQL_DATABASE) OR die("Konnte Datenbank nicht benutzen! Fehlermeldung: ".mysql_error()."<br>");

    $sql = "SELECT
              Begriff,
              Erklaerung
            FROM
              woerterbuch
            WHERE
              (Begriff Like '%$suchbegriff%')
            ORDER BY
              Begriff;";

    $result = mysql_query($sql) OR die(mysql_error());

    if(mysql_num_rows($result)) {
      while($row = mysql_fetch_assoc($result)) {
        echo "<table width=\"100%\">";
        echo "  <tr id=begriff>";
        echo "    <td>".$row['Begriff']."</td>";
        echo "  </tr>";
        echo "  <tr id=erklaerung>";
        echo "    <td>".$row['Erklaerung']."</td>";
        echo "  </tr>";
        echo "<table><br>";
      }
    } else {
      "Es sind keine Begriffe gespeichert!";
    }
}
?>


Die CSS und die Datenbank-Tabelle sowie den Inhalte meiner sql_keys.php lasse ich an der Stelle mal weg, sind ja auch nicht ganz so entscheidend. Das eine Tabelle vorhanden sein muss, das ja klar, Wie die Zugangsdaten definiert werden sollte auch klar sein und CSS dient ja nur der Formatierung! Falls jmd. doch noch eine Datei sehen will... bescheid geben!

Aber v. den Pros's hätte ich ganz gerne mal eine kurze Bemerkung ob problem akzeptabel gelöst! Wie schon erwähnt sollen lediglich Wörter in die Tabelle, also eine suche via AND oder OR entfällt... (falls darauf eingegangen wird)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das sieht doch schon gut aus!

Da du eine 1:1-Beziehung zwischen Begriff und Erklärung hast, kannst du das ja auch locker in eine Tabelle packen, wie du es getan hast. Ich hoffe allerdings, du hast noch einen Primärschlüssel definiert, den du hier nur nicht abfragst ;)

Du könntest jetzt auf diese Art und Weise sehr schön ein Glossar automatisiert erstellen. Für Sucheingaben taugt die Sache auch schon bedingt, da du die Query mit LIKE absetzt. Mehr muss für den Anfang sicherlich nicht sein.

Professionell wäre später die Indizierung der Begriffe, um Suchanfragen wirklich effizient zu bearbeiten. Dabei meine ich in diesem begrenzten Umfang weniger die Geschwindigkeit, sondern vielmehr die Treffer-Effizienz. Dazu müssen die Begriffe bei der Indizierung einen Filter bzw. Analyzer passieren, der gewisse Modifikationen vornimmt (siehe z.B. das Thema "Stemming"). Dasselbe passiert auch mit den Suchbegriffen, sodass auch bei leichten Tippfehlern oder unvollständigen bzw. "übervollständigen" Eingaben trotzdem etwas gefunden wird.

greez 8)
JoSsiF

So dann bin ich ja erstmal "beruhigt" das es i.o. ist wie ich es nun habe! Ja, einen Primärschlüssel habe ich definiert ;-)...

Hab aber noch ein kleinen "Bug-Fix", und zwar aus der Zeile:

Zitat
if($_POST['suche'] == "") {

sollte man ein:

Zitat
if(empty($_POST['suche'])) {

machen, und zwar, alleine lief das Script wunderbar, als ich es jedoch bei mir in die Seite implementiert habe bekam ich eine Fehlermeldung (Notice) dass die Variable nicht deffiniert ist, deswegen ja auch eigentlich die IF Abfrage, aber irgendwie lief das dann bei mir auf der Seite nicht mehr... naja und nach ein wenig gegoogle und probieren hab ich dann die empty() funktion gefunden!

Achja, in dem letzten "else" Teil fehlt auch noch ein Echo seh ich gerade...

So, das mit dem "Stemming" hab ich mir mal angeguckt, aber wirklich schlau, bin ich daraus nicht geworden, ich denke dafür reicht mein rudimentäres Wissen noch nicht aus :-D... Werde mich damit aber gerne später noch einmal damit beschäftigen, vielleicht kennt ja auch jmd. ne seite, wo das vernünftig erklärt wird dann kann er mir den link gerne posten ;-)...

Vielen Dank f. die Hilfe JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nur noch als Anmerkung, statt

if(empty($_POST['suche'])) {

hättest du auch dies abfragen können, auch keine PHP-Meldung mehr:

if(!isset($_POST['suche']) || $_POST['suche'] == "") {

 

Vielen dank f. den Hinweis Nico, aber hat die isset-Funktion einen Vorteil gegenüber der empty-funktion? Wenn ja welche? Oder diente das nur der komplettierung dieses Threads? 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Das war nur als Komplettierung gedacht, manchmal ist es ja einfacher nur etwas hinzuzufügen, als alles (durch empty()) zu ersetzen. Einen Vorteil sehe ich sonst nicht.

Nun gut, das mit dem "ersetzen" anstatt "empty" hab ich noch nicht wirklich verstanden, aber ich werde es mal im Auge behalten ;-)

Nun nochmal zurück auf das Glossar, wie kann ich denn so ein Glossar erstellen, Ich würde mir das ganze so vorstellen, dass unter dem Suchfeld eine Liste steht mit allen in der Datenbank gespeicherten Begriffen...also z.B.

A
Ananas
Apfel

B
Banane
Birne

...

Rein von der Logik würde ich nun sagen, dass ich da 26 if abfragen Starten müsste in dem jeweils das erste Zeichen eines Strings ausgelesen wird un dann in z.B. in eine Tabelle eingelesen wird?! Das geht doch bestimmt auch einfacher, oder nicht?

Und wenn ich mir dann noch ein "Special" wünschen darf, ist es Möglich die einzelnen Begriffe als Link zu erstellen? So, dass ich, wenn man auf "Birne" klickt die Erklärung des Begriffs ausgegeben wird? Gehen würde es ja z,B. wenn man den Begriff in einer $_GET-Variable übergeben würde und dafür noch einen Zusatz-Script anstatt $_POST mit $_GET arbeiten würde oder Eleganter und Multifunktionaler per $_GET an ein Script sendet, welches die Seite wieder mit $_POST daten "füttert"... Das wären jetzt Lösungsansätze von mir, auch da wäre ich dankbar, wenn ihr mir kurz sagen könntet.

1. Möglichkeit 1
2. Möglichkeit 2
3. 1 + 2 sind ** Netiquette! **, weil das geht doch "so und so" viel einfacher!


Vielen Dank für Eure Hilfe!!!

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Aaaalso...

Die Sache mit dem Glossar ist eigentlich ganz einfach, die 26 if-Blöcke wären da wenig elegant. Folgende Vorgehensweise:

- DB-Query alphabetisch sortieren
- Loop bauen, in welchem du reihenweise das Resultset ausliest
- eine Variable definieren, die den Anfangsbuchstaben des vorherigen Begriffs speichert (könnte initial einfach leer sein)
- zu Beginn des Loops abfragen, ob neuer Anfangsbuchstabe gleich des letzten ist und entsprechend reagieren
- irgendwann danach die besagte Variable neu belegen

Zu dem 2. Problem: Hört sich alles etwas kompliziert an. Und da ich grad nicht weiß, mit welchen Skripts du generell arbeitest, möchte ich auch gar nicht so sehr strukturell auf das eingehen, was du machen willst. Mein Vorschlag wäre, eine Art Detailseite zu machen, wo die Begriffserklärung steht und ein Link zurück zum Glossar angeboten wird. Alternativ könnte man die Erklärung und das Glossar auch auf einer Seite einblenden.

In jedem Fall würde ich gar keinen Begriff übergeben, denn wozu hast du denn die ID des Begriffs? Einfach ID per GET anhängen und dann auslesen, entsprechende Query absetzen und Ergebnis anzeigen - fertig.

HTH

greez 8)
JoSsiF


« Suche phpBB2 Abzeichen-ModUnterlink öffnen bei Klick »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Android
Android bezeichnet sowohl ein Betriebssystem, als auch ein Unternehmen. Android ist ein Betriebssystem, das hauptsächlich für mobile Endgeräte wie Smartpho...

Datenbank
Eine Datenbank (DBS), im englischen database, ist eine strukturierte Datensammlung und fungiert wie ein "digitales Archiv". Datenbanken dienen der effizienten Aufbewahrun...

Grundstrich
Der Begriff des Grundstrichs im Bereich der Typografie, bezeichnet den senkrechten Strich der Buchstaben. Bei Schriftarten mit variabler Strichstärke, wie zum Beispi...