Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

PHP Suchfiunktion

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
ben78
PostRank 4
PostRank 4
Beiträge: 153
Registriert: 30.03.2007, 17:15

Beitrag von ben78 » 25.01.2010, 00:31

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!!!
Zuletzt geändert von ben78 am 25.01.2010, 03:22, insgesamt 2-mal geändert.

Anzeige von ABAKUS

von Anzeige von ABAKUS »

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

nerd
PostRank 10
PostRank 10
Beiträge: 4023
Registriert: 15.02.2005, 04:02

Beitrag von nerd » 25.01.2010, 00:50

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>

ben78
PostRank 4
PostRank 4
Beiträge: 153
Registriert: 30.03.2007, 17:15

Beitrag von ben78 » 25.01.2010, 01:57

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

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


nerd
PostRank 10
PostRank 10
Beiträge: 4023
Registriert: 15.02.2005, 04:02

Beitrag von nerd » 25.01.2010, 02:24

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.

ben78
PostRank 4
PostRank 4
Beiträge: 153
Registriert: 30.03.2007, 17:15

Beitrag von ben78 » 25.01.2010, 02:53

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?

nerd
PostRank 10
PostRank 10
Beiträge: 4023
Registriert: 15.02.2005, 04:02

Beitrag von nerd » 25.01.2010, 03:29

$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.

Kassandra70
PostRank 4
PostRank 4
Beiträge: 198
Registriert: 11.01.2006, 00:48
Wohnort: Gran Canaria

Beitrag von Kassandra70 » 25.01.2010, 03:50

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 ;-)
https://www.anabell.de - ein nicht optimiertes Projekt mit tausend Themen

ben78
PostRank 4
PostRank 4
Beiträge: 153
Registriert: 30.03.2007, 17:15

Beitrag von ben78 » 25.01.2010, 04:43

:D AAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHahahfaaaaaaaaaaaaaaaaaa

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

ben78
PostRank 4
PostRank 4
Beiträge: 153
Registriert: 30.03.2007, 17:15

Beitrag von ben78 » 25.01.2010, 04:54

@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>

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 25.01.2010, 10:08

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 :)

ben78
PostRank 4
PostRank 4
Beiträge: 153
Registriert: 30.03.2007, 17:15

Beitrag von ben78 » 25.01.2010, 18:06

THX @ ALL...ihr seid der Wahnsinn...vielen Dank Leutz...vor allem @ Mork vom Ork, Kassandra70 & nerd :wink: :idea: :wink:

Anonymous

Beitrag von Anonymous » 25.01.2010, 18:15

: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

w3news
PostRank 8
PostRank 8
Beiträge: 938
Registriert: 10.10.2006, 23:17
Wohnort: Berlin

Beitrag von w3news » 25.01.2010, 18:27

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...
MfG Lars

News, Tarife und Mobilfunk: w3news.de
Mobile Datenflatrates

ben78
PostRank 4
PostRank 4
Beiträge: 153
Registriert: 30.03.2007, 17:15

Beitrag von ben78 » 25.01.2010, 21:02

ja richtig, aus phpMyadmin

Kassandra70
PostRank 4
PostRank 4
Beiträge: 198
Registriert: 11.01.2006, 00:48
Wohnort: Gran Canaria

Beitrag von Kassandra70 » 25.01.2010, 22:08

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 :)
https://www.anabell.de - ein nicht optimiertes Projekt mit tausend Themen

Antworten