Mit Formularabfrage Datenbank durchsuchen und Ergebnis ausgeben.

Friedemann

Aktives Mitglied
Thread Starter
Dabei seit
19.10.2003
Beiträge
3.054
Reaktionspunkte
43
Die Frage steht ja schon weiter oben. Ich bin jetzt seit drei Tagen dabei mich durch PHP/HTML/MySQL-Seiten zu kämpfen und hauptsächlich raucht mir der Kopf..

Was ich möchte ist recht einfach: in einem Formular (ja, dass hab ich sogar hingekriegt), gibt der Benutzer einen Begriff ein. Mit diesem Begriff wird meine mySQL-Datenbank durchsucht.
Jede Zeile in der diese Wortkette vorkommt soll hernach dem User angezeigt werden. Das kann doch nicht kompliziert sein, oder?

Mein Formular sieht so aus:

<h1>Formular f&uuml;r Suchmaske</h1>

<form action="nea.php" method="post">
<p>Suchbegriff:<br><input name="suchbegriff" type="text" size="30" maxlength="100"></p>
<input type="submit" name="abschicken" value="Anfrage abschicken" />
<input type="reset" value="Anfrage l&ouml;schen" />
</form>
<?php
if("" == $_POST['suchbegriff']) {
echo "Bitte geben sie einen Suchbegriff ein";
}
echo $_POST['suchbegriff'];
?>

Die Datenbank ist auch sauber eingebunden:
<?php
$verbindung = mysql_connect("localhost","root","")
or die ("keine Verbindung m&ouml;glich. Benutzername oder Passwort sind falsch.");
mysql_select_db("NEA-Bibliothek")
or die ("Diese Datenbank existiert nicht.");
?>


Und jetzt komm ich halt schon nicht mehr weiter. Hab zwar schon Befehle wie mysql_fetch_assoc gefunden und natürlich kann ich per echo irgendwelche Zeilen aus der Datenbank anzeigen lassen.

Aber die Kombination, dass der eingegebene String die Suchanfrage bestimmt, gelingt mir überhaupt nicht.

Ich weiß, dass diese Fragen für die meisten banal sind und hier jetzt wieder tausende Links auftauchen werden, allerdings wären mir konkrete Hilfen echt lieber, denn mit den meisten Links komme ich einfach nicht weiter. Das QuakeNet-Tutorial und SelfHTML, etc. pp. kenne ich schon.
 
Kein Link, sondern die Schritte:

Auf den Suchbegriff hast Du ja schon Zugriff :)
Jetzt bastelst Du dir damit einen Suchquery zusammen.
Denke, da sollte nicht das Problem sein.
Kannst ja erstmal einen normalen Abfragequery basteln, wenn Du das nicht schon drauf hast.

Dann kommt folgendes:

PHP:
// Query steht in der Variable $qry
$sql = mysql_query($qry);
while($tmp = mysql_fetch_assoc($sql)){
// Hier die Ausgabe machen, bzw. vorbereiten.
// Zugriffsdemo:
echo $tmp['feldname']

}

Das sollte alle Sätze des Querys aus der Spalte "feldname" zurückgeben.

Erklärung:

Mit mysql_query($qry) schickst Du den Query an die MysqlDB. Zurück kommt eine Ressource-ID. Kannst den ja mal zum Spaß ausgeben lassen :D
Diese ID nutzt Du nun für die Funktion mysql_fetch_assoc. Die speichert für jedes Mal das die Funktion aufgerufen wird, den nächsten Satz aus der Ergebnistabelle vom Query (auf die Du mit der Ressource-ID zugreifen kannst, bzw. die Funktion darauf zugreift.) Beim ersten Aufruf freillich den ersten Satz, und wenns keine Sätze mehr gibt, gibt die Funktion FALSE zurück, womit auch direkt aus der Schleife gesprungen wird.

Und das wars :)
 
PHP:
SELECT 'alle felder die du durchsuchen willst', MATCH ('alle felder die du durchsuchen willst') AGAINST ('dein suchbegriff') AS score
		FROM tabelle
   	WHERE MATCH ('alle felder die du durchsuchen willst')
   	AGAINST ('dein suchbegriff' IN BOOLEAN MODE)
   	ORDER BY score DESC

wichtig ist, dass alle durchsuchbaren felder auf dem index stehen...

habe leider nicht mehr zeit zum antworten, falls fragen sind, melde dich, ich versuche zu helfen
 
Hmm, ehrlich gesagt weiß ich nicht wie ich einen Suchquery erstelle. Ich mache ja einen query mit

$abfrage = "SELECT zeile FROM tabelle";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{
echo "$row->zeile<br>";
}



So weit so schön, aber wie krieg ich in so eine Abfrage rein, dass er nicht fix eine von mir definierte Zeile ausliest, sondern nur die Zeile, die 'suchbegriff' entspricht?
 
Oh, danke, alanin, dein Beispiel klingt sehr vielversprechend.

Noch eine ganz doofe Frage: wie genau greife ich denn auf meinen Suchbegriff zu? Ist der unter
$_POST['suchbegriff]
abgespeichert?
 
Wenn du as Formular via POST abgesendet hast, ist es im Superglobalen Array $_POST über den Namen des Formularfelds als Indexschlüssel zu erreichen.

Kurz: Ja! :D
 
Also gebe ich dann in meinem Beispiel an:

SELECT *
MATCH *
AGAINST ($_POST['suchbegriff'])
AS hersteller
FROM tabelle

WHERE MATCH *
AGAINST ($_POST['suchbegriff'] IN BOOLEAN MODE)
ORDER BY hersteller DESC


Und habe natürlich alles falsch gemacht...

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\Programme\XAMPP\htdocs\xampp\NEA.php on line 45


Habt Mitleid mit einem merkbefreiten..
 
Das ist eine Fehlermeldung von PHP.

Wahrscheinlich irgendwo ein ; oder " oder sowas in der Richtung vergessen :)

Einfach mal die Zeilen rund um 45 checken, ob da nicht was schiefgelaufen ist :augen:
 
<?php $abfrage2 = "SELECT * , MATCH (*) AGAINST ($_POST['suchbegriff']) AS hersteller
FROM tabelle
WHERE MATCH (*)
AGAINST ($_POST['suchbegriff'] IN BOOLEAN MODE)
ORDER BY hersteller DESC
?>


So sehen meine Zeilen ab 45 aus. Ich hab den ganzen Teil gerade auskommentiert, der Fehler muss dort sein.

EDIT: ich hab jetzt noch ein Semikolon hinter "tabelle" und "DESC" gesetzt. Ändert nichts.
 
@Friedemann: verwendest Du einen Editor mit Syntax-Highlighting?

Wenn nicht solltest Du das tun! Da merkt man recht schnell das man ja wohl Anführungszeichen oder Ähnliches vergessen hat!
 
<?php $abfrage2 = "SELECT * , MATCH (*) AGAINST ($_POST['suchbegriff']) AS hersteller
FROM tabelle
WHERE MATCH (*)
AGAINST ($_POST['suchbegriff'] IN BOOLEAN MODE)
ORDER BY hersteller DESC";
?>


Ich hab so ziemlich alle Kombinationen von Gänsefüßchen und Semikolata ausgetestet, die Meldung bleibt die Gleiche.
 
Ich verwende Weaverslave. Der hat Syntax-Highlighting, aber erinnert mich nicht daran wenn ich Dinge vergessen habe.

Ist ein Windows-Editor, auf Arbeit hab ich keinen Mac.
 
Code:
<?php $abfrage2 = "SELECT * , MATCH (*) AGAINST (".$_POST['suchbegriff'].") AS hersteller 
FROM tabelle
WHERE MATCH (*) 
AGAINST (".$_POST['suchbegriff']." IN BOOLEAN MODE) 
ORDER BY hersteller DESC"; 
?>

Ich würde darüber hinaus davon abraten, bei den ersten Gehversuchen mit MATCH zu arbeiten, da du zwangsläufig in Fehler laufen wirst, die mit den Volltexteinstellungen zusammenhängen. Bau dir eine Query mit LIKE:

Code:
$sql = 'SELECT * from tabelle where feld like "%'.$_POST['suchbegriff'].'%"';
 
das ist doch aber nur bedingt zu empfehlen, oder? wenn er ne große tabelle hat, wäre nen ordentlicher index die bessere lösung?!

kann mich auch irren, berufe mich auf mein halbwissen ;)
 
Wir reden hier aber nicht über Performanceprobleme, sondern über ein generelles Verständnis von MySQL.

Ein Volltextindex hat je nach Anwendungsfall durchaus seine Vorteile. Aber MATCH...AGAINST funktioniert halt in der Standardeinstellung erst ab vier Zeichen. Und das kann, wenn man gerade in die Sache hineinschnuppert, sehr frustrierend sein, wenn Tests mit weniger Zeichen kein Ergebnis bringen.
 
ja ok - stimmt schon.

allerdings funktioniert es ab drei zeichen :)
 
ah ok, dass 4 zeichen der standard sind wusste ich nicht. ich nahm an ich habe eine standard konfiguration, da ich nichts geändert habe...

man lernt halt immer etwas dazu...
 
Zurück
Oben Unten