Seite 1 von 2

PHP Suchfiunktion

Verfasst: 25.01.2010, 00:31
von ben78
Hi Abakusler,

ich habe folgendes Script:

Code: Alles auswählen

<?php
...
?>
Ich möchte jetzt eine Suchfunktion einbauen. Also so, dass man in einem Suchfeld ein Suchbegriff eingeben kann, wonach dann die die MySQL-DB durchsucht wird.

Wenn jemand z. B. Schuhe eingibt, dann sollen alle Datensätze aus der MySQL-Tabelle die irgendwas mit dem Begriff Schuhe zu tun haben in bestehender HTML-Tabelle ausgespuckt werden.

PLEASE CAN SomeBody HELP??? Ich hocke schon seit zwei Tage und Nächte da. :o

Schonmal THX im Voraus!!!

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: 25.01.2010, 00:50
von nerd
Suchen? wo denn? in Bezeichnung, Beschreibung, Marke oder Anbieter? Grundsaetzlich geht das mit "where Bezeichnung LIKE '%".$keyword."%' "; allerdings solltest du ggf. fulltext search auf diesen spalten setzen, sonst wirds eventuell zu langsam, je nachdem wie deine db aussieht...
deine css styles direkt in den code gehackt wird dich spaeter auch noch beissen, mach lieber sowas wie
<td class="text">bescheibung 1</td>
<td class="preis">123.45</td>

Verfasst: 25.01.2010, 01:57
von ben78
Ich habe jetzt folgende Zeile:

Code: Alles auswählen

$sql = "SELECT * FROM `tabelle` WHERE `Bezeichnung` LIKE \'Schuhe\' AND `Beschreibung` LIKE \'Schuhe\' AND `Marke` LIKE \'Schuhe\' AND `Anbieter` LIKE \'Schuhe\' LIMIT 0, 30 "; $db_erg = mysql_query&#40; $sql &#41;;
if &#40; ! $db_erg &#41;
anstelle von folgender Zeile:

Code: Alles auswählen

$sql = "SELECT * FROM `tabelle` WHERE `Bezeichnung` LIKE \'%".$keyword."%'\' AND `Beschreibung` LIKE \'%".$keyword."%'\' AND `Marke` LIKE \'%".$keyword."%'\' AND `Anbieter` LIKE \'%".$keyword."%'\' LIMIT 0, 30 "; $db_erg = mysql_query&#40; $sql &#41;;
if &#40; ! $db_erg &#41;
Eingefügt.

Ich bekomme immer als Fehlermeldung folgendes:

Notice: Undefined variable: keyword in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search.php on line 25

und

Notice: Undefined variable: keyword in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search.php on line 25
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 '\'%%'\' AND `Beschreibung` LIKE \'%%'\' AND `Marke` LIKE \'%%'\' AND `Anbieter` ' at line 1

Verfasst:
von

Verfasst: 25.01.2010, 02:24
von nerd
ohje - weisst du ueberhaupt was du tust oder kopierst du dir den kram nur irgendwo zusammen? $keyword musst du schon selbst definieren, deine quotes sind falsch gesetzt in der neuen abfrage, es muss "OR" statt "AND" sein und dein table heisst ganz sicher nicht "tabelle".
frage mal lieber den der dir das script verkauft hat.

Verfasst: 25.01.2010, 02:53
von ben78
Script ist nicht gekauft. Sondern selbst zusammengebastellt. Schon seit ca. äähhhmmm einer Woche?... :bad-words: ...Bin halt noch ganz frisch in PHP & MySQL.

Das meine Tabelle nicht tabelle heißt ist mir schon klar.

Habe jetzt folgende Zeile im Script:

Code: Alles auswählen

$sql = "SELECT * FROM `test`.`schuhe` WHERE &#40;`ID` LIKE \'%$_POST&#91;'searchquery'&#93;%\' OR `Abbildung` LIKE \'%$_POST&#91;'searchquery'&#93;%\' OR `Bezeichnung` LIKE \'%$_POST&#91;'searchquery'&#93;%\' OR `Beschreibung` LIKE \'%$_POST&#91;'searchquery'&#93;%\' OR `Marke` LIKE \'%$_POST&#91;'searchquery'&#93;%\' OR `Preis` LIKE \'%$_POST&#91;'searchquery'&#93;%\' OR `Anbieter` LIKE \'%$_POST&#91;'searchquery'&#93;%\'&#41;"; $db_erg = mysql_query&#40; $sql &#41;;
if &#40; ! $db_erg &#41;
...und bekomme nun folgende Fehlermeldung:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search.php on line 25

F R A G E:

Wie und wo kann ich denn $keyword selbst definieren?

Verfasst: 25.01.2010, 03:29
von nerd
$keyword = mysql_real_escape_string($_POST['searchquery']);

$sql = "SELECT * FROM schuhe WHERE `Bezeichnung` LIKE '%".$keyword."%' OR `Beschreibung` LIKE '%".$keyword."%' OR `Marke` LIKE '%".$keyword."%' OR `Anbieter` LIKE '%".$keyword."%'";


ich gehe mal davon aus das der suchbegriff nie im feld "preis", "Abbildung" oder "ID" enthalten ist.

Verfasst: 25.01.2010, 03:50
von Kassandra70
also normalerweise hast du ein schickes kleines Formular mit einem Feld in der der User das Suchwort eingegeben kann. So wie die Google Startseite ;-)

Dann drückt der User auf Absenden und die Anfrage mit dem Suchwort wird an das in <form method=post…> vorgegebene Ziel gesendet und da wird das dann in deine Abfrage im idealfall überprüft, dann wenn ok eingesetzt und ausgewertet. Wobei das Ziel durchaus auch auf der gleichen Seite sein kann ...

Warum du überall \ einsetzt ist mir allerdings etwas unklar. Die werden wohl eher für deine Fehlermeldung sorgen. Und warum du das Suchwort vor der Anfrage nicht einfach einmal per POST holst und dabei auch gleich überprüfst nach den langen Vorträgen, die du hier schon über Sicherheit gehört hast, ist mir auch ein Rätsel….

Und wenn du über x Felder nach Schuhen suchen mußt, dann hast du dir beim Anlegen deiner Datenbank zu wenig Gedanken über die zukünftige Struktur derselben gemacht. ... Ich täte, wenn ich mit dieser DB weiterarbeiten müßte, mir schleunigst entweder noch ein Flag-Feld setzen, wo ich Schuhe einmal ankreuzen kann, dann brauch ich nur das durchsuchen, oder, wenn ich zukünftig nicht nur Schuhe sondern auch Handtaschen selektieren möchte, würde ich das in eine extra Tabelle hauen und die vorhandenen Datensätze überarbeiten.

Du hättest vielleicht an einer Witzedatenbank üben sollen, dann hätten wir hier wenigstens ein biskin was zu lachen ;-)

Verfasst: 25.01.2010, 04:43
von ben78
:D AAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHahahfaaaaaaaaaaaaaaaaaa

jetzt It works es.........VIELEN DANK LEUTZ!!!!! :multi:

Verfasst: 25.01.2010, 04:54
von ben78
@Kassandra70

Schaut das jetzt besser aus? Zumindest läuft's jetzt auf'm Apache...

Code: Alles auswählen

$suchwort = mysql_real_escape_string&#40;$_POST&#91;'suche'&#93;&#41;;

$sql = "SELECT 
 * 
 FROM `test`.`schuhe` 
 WHERE &#40;
  `Bezeichnung` LIKE '%".$suchwort."%' OR 
  `Beschreibung` LIKE '%".$suchwort."%' OR 
  `Marke` LIKE '%".$suchwort."%' &#41;"; 

$db_erg = mysql_query&#40; $sql &#41;;
if &#40; ! $db_erg &#41; 
&#123;
...und hier mein HTML

Code: Alles auswählen

<form action="./mysql/search.php" method="post">
<input type="text" name="suche" size="30" onfocus="if &#40;this.value =='Produktfinder'&#41; &#123; this.value=''&#125;" onblur="if &#40;value == ''&#41; &#123;value='Produktfinder'&#125;" value="Produktfinder" />
<input type="submit" value="GO">
</form>

Verfasst: 25.01.2010, 10:08
von Mork vom Ork
ben78 hat geschrieben:Schaut das jetzt besser aus?
Nö ;>

Code: Alles auswählen

$sql = "SELECT 
 * 
 FROM `test`.`schuhe` 
 WHERE &#40;
  `Bezeichnung` LIKE '%".$suchwort."%' OR 
  `Beschreibung` LIKE '%".$suchwort."%' OR 
  `Marke` LIKE '%".$suchwort."%' &#41;";
Was sollen die ganzen Akzente da, hattest du Schluckauf? Brüllen musst du eigentlich auch nicht, dafür tut etwas Luftholen um PHP-Operatoren herum immer ganz gut:

Code: Alles auswählen

$sql = "select * from test.schuhe where Bezeichnung like '%" . $suchwort . "%' or Beschreibung like '%" . $suchwort . "%' or Marke like '%" . $suchwort . "%'";
Aber mal abgesehen von der Schönheit: Textsuchen mit einem Platzhalter am Anfang sind immer sehr schlecht, das ist das Schlechteste, was du bei MySQL bekommen kannst. Egal, ob ein Index auf der Spalte liegt oder nicht, die Datenbank muss immer sämtliche Zeilen durchsuchen - und das kann dauern. Wenn du nur drei Paar Schuhe verkaufst, ist das natürlich wurscht, bei dreihundert wird's mit Sicherheit gut messbar, bei dreitausend merkbar.

Nach einer Woche PHP und SQL wäre das zweifelsohne zu viel verlangt, aber falls dir die Sucherei irgendwann zu lange dauert, befasse dich mit N-Grammen. Dabei werden die zu durchsuchenden Texte in kleine Bruchstücke à drei oder vier Zeichen zerlegt (Text = "Beispiel" > N-Gramme = "Bei", "eis", "isp", "spi", "pie", "iel"), in einer separaten Tabelle gespeichert (zwei Spalten ngramm und text, jeweils "Bei" > "Beispiel", "eis" > "Beispiel", etc.) und diese statt des Originals durchsucht, die Anzahl der Vorkommen aufaddiert und danach sortiert (select text,count(*) as n from textindex where ngram="Bei" or ngram="eis" or ngram="isp" [etc.] group by text order by n desc, die Suche nach"Beispiel" käme auf sechs Vorkommen, das vertippte "Beipiel" immerhin noch auf drei, "Beisitzer" auf hingegen nur eines).

Das hat nicht nur den Vorteil, dass die Datenbank einen Index nutzen kann und somit sehr schnell ist, du merzt auch noch Schreibfehler aus und lieferst der Eingabe sehr ähnliche Ergebnisse. Falls du dich mal gefragt hast, wie Amazon & Co. so schnell ihre Vorschläge herbeizaubern: Jetzt weisst du es, zumindest ansatzweise :)

Verfasst: 25.01.2010, 18:06
von ben78
THX @ ALL...ihr seid der Wahnsinn...vielen Dank Leutz...vor allem @ Mork vom Ork, Kassandra70 & nerd :wink: :idea: :wink:

Verfasst: 25.01.2010, 18:15
von net(t)worker
:o

omg....

eine Query mit mehreren LIKE über or verknüpft... sehr effektiv um den DB Server auf Dauer in die Knie zu zwingen....

nutz die eingebaute volltextsuche von mysql, dafür isse schließlich da... https://dev.mysql.com/doc/refman/5.1/de ... earch.html

Verfasst: 25.01.2010, 18:27
von w3news
Mork vom Ork hat geschrieben:Was sollen die ganzen Akzente da, hattest du Schluckauf?
Sieht mir so aus, als ob er das aus phpmyadmin rauskopiert hat...

Verfasst: 25.01.2010, 21:02
von ben78
ja richtig, aus phpMyadmin

Verfasst: 25.01.2010, 22:08
von Kassandra70
Und ich hab schon den Monitor geputzt ...

Aber schön, dass du weitergekommen bist. Ich bin schon gespannt, was Dir als nächstes einfällt :)