PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suchfundktion


xaverseppel
2005-08-19, 13:16:56
Ich möchte auf einer Homepage eine Suchfunktion einbauen.

Ich hab ein Formular gemacht wo man das Wort was gesucht wird eingibt und diese dann eine Datei übergeben wird, wo es dann ausgewertet wird.

Aber leider klappt es nicht.

Kann mir jemand weiterhelfen?

Hier die ocdes:
zu erst der code des Formulars:


<form action="suchauswertung.php" method="post">
<table border="0" cellpadding="2" class="kontakt">
<tr><td>Bitte geben Sie hier einen Suchbegriff ein:</td></tr>
<tr><td><input type="text" size="30" name="wort"></td></tr>
<tr><td><div align="center"><input type="submit" value="Absenden"></div></td></tr>
</table>
</form>



dann der Code der Suchauswertung:


<?php
$connection = mysql_connect('','user','pw');
if($connection)
{
mysql_select_db('datenbank');

$name = $_POST['wort'];

$sql = 'SELECT * FROM tblcms_artikel_content WHERE content like \'%'.$name.'%\'';

$result = mysql_query($sql);

if (!$result) {
echo 'Ihre Abfrage ergab keinen Treffer ' ;
exit;
}

else {
echo ("Ihre Suchanfrage nach dem Wort <em><strong>".$name."</strong></em> ergab folgende Treffer:");

while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
{

echo ("<b>".$line['title']."</b><br>");
}

}
}

?>

clm[k1]
2005-08-19, 13:57:25
1.) verwende addslashes() für $_POST['irgendwas'] sonst öffnest du sql-injection-attacken tür und tor.
2.) Warum verwendest du hochkommatas anstatt normale anführungszeichen für strings?
3.) mysql_query() gibt keinen boolean wert zurück!
Um zu gucken ob zeilen zurück gegeben wurden, gibts zB. mysql_num_rows()


so long
clm[k1]

xaverseppel
2005-08-19, 14:14:15
thk erstmal

habe das jetzt in dsa geändert:

<?php
$connection = mysql_connect("db_host","name","pw");
if($connection)
{
mysql_select_db("datenbank");

$name = addslashes("$wort");

$sql = "SELECT * FROM tblcms_artikel_content WHERE content like \"%".$name."%\"";

$result = mysql_query($sql);

if (!$result) {
echo "Ihre Abfrage ergab keinen Treffer " ;
exit;
}

else {
echo ("Ihre Suchanfrage nach dem Wort <em><strong>".$name."</strong></em> ergab folgende Treffer:");

$num_rows = mysql_num_rows($result);

echo "$num_rows Rows\n";

}
}

?>

dort gibt er mir dann zb aus das er 5 Rows gefunden hat. Also 5 einträge.

wie kann ich jetzt erreichen, das diese gefunden artikel verlinkt werden?

ist der teil eigentlich auch richtig, wenn er nichts gefunden hat?

if (!$result) {
echo "Ihre Abfrage ergab keinen Treffer " ;
exit;
}

clm[k1]
2005-08-19, 14:33:08
wie wäre es mit:


$name = addslashes($_POST['wort']);

Denn woher willst du wort nehmen wenn du es nicht aus dem superglobalen array $_POST nimmst? (ich hoffe für dich das du registerglobals deaktiviert hast, das ist ein sicherheitsrisiko hoch 10)


$sql = "SELECT * FROM tblcms_artikel_content WHERE content like '%".$name."%'";

Du kannst hochkommatas in anführungszeichen verwenden ohne die escapen zu müssen.


if (mysql_num_rows($result) == 0) {
echo "Ihre Abfrage ergab keinen Treffer " ;
exit;
}

Ich sagte doch schon $result ist kein boolean


und für alles weitere: http://www.php.net/manual/de

Gruß
clm[k1]

xaverseppel
2005-08-19, 14:37:12
wenn du mir sagst was registerglobals ist und wie ich es deaktivieren kann, kann ich dies auch machen :wink:

clm[k1]
2005-08-19, 14:37:39
Ach ja: am besten zu prüfst nach mysql_query() noch, ob die abfrage nen fehler geschmissen hat, oder nicht:


if(mysql_error() != "") {
die("Die Abfrage war fehlerhaft: " . mysql_error());
}


clm[k1]

xaverseppel
2005-08-19, 14:39:33
']Ach ja: am besten zu prüfst nach mysql_query() noch, ob die abfrage nen fehler geschmissen hat, oder nicht:


if(mysql_error() == "") {
die("Die Abfrage war fehlerhaft: " . mysql_error());
}


clm[k1]


also du meinst anstatt dem hier

if (mysql_num_rows($result) == 0) {
echo "Ihre Abfrage ergab keinen Treffer " ;
exit;
}

clm[k1]
2005-08-19, 14:41:35
wenn du mir sagst was registerglobals ist und wie ich es deaktivieren kann, kann ich dies auch machen :wink:

Registerglobals ermöglicht es variablen die man normalerweise mit den superglobalen arrays $_POST und $_GET abfragt einfach so zu verwenden.

Also statt: $name = $_POST['name'];
einfach: $name verwenden.

Du kannst dir vorstellen, das das der Sicherheit nicht gerade zuträglich ist.

Deaktivieren tut man das in der php.ini
da muss es einen eintrag geben der "register_globals = On"
heißt, und der muss logischerweise auf "Off" stehen.


clm[k1]

clm[k1]
2005-08-19, 14:43:31
also du meinst anstatt dem hier

if (mysql_num_rows($result) == 0) {
echo "Ihre Abfrage ergab keinen Treffer " ;
exit;
}


Nein! Ich meine DAVOR!
Weil du ja erst mal wissen willst, ob deine sql-query überhaupt erfolgreich war, und ob du nicht vielleicht einen syntax-fehler in deinem statement hast.

Und dann, kannst du prüfen ob deine erfolgreiche abfrage einen datensatz zurück geliefert hat.


clm[k1]

xaverseppel
2005-08-19, 14:48:48
jetzt gibt er mir das hier aus
Die Abfrage war fehlerhaft:

aber ohne fehlermeldung

clm[k1]
2005-08-19, 14:52:20
jetzt gibt er mir das hier aus
Die Abfrage war fehlerhaft:

aber ohne fehlermeldung


Ups... mein Fehler :rolleyes:
Da muss natürlich ein ungleich hin und kein gleich ...kleiner tippfehler.


clm[k1]

xaverseppel
2005-08-19, 14:57:54
']Ups... mein Fehler :rolleyes:
Da muss natürlich ein ungleich hin und kein gleich ...kleiner tippfehler.


clm[k1]


Das macht doch nichts, jetzt klappt es! Danke!!!!!

Aber wie bekomme ich jetzt die gefunden Begriffe angezeigt?

Zur Zeit jetzt da noch so und so viele Treffer

clm[k1]
2005-08-19, 15:08:25
Das macht doch nichts, jetzt klappt es! Danke!!!!!

Aber wie bekomme ich jetzt die gefunden Begriffe angezeigt?

Zur Zeit jetzt da noch so und so viele Treffer

Na so wie du es schon in deinem ersten post hattest:


while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo ("<b>".$line['title']."</b><br/>");
}


clm[k1]

xaverseppel
2005-08-19, 15:19:58
']Na so wie du es schon in deinem ersten post hattest:


while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo ("<b>".$line['title']."</b><br/>");
}


clm[k1]


leider kommt da nichts! ;(

ravage
2005-08-19, 16:06:09
mysql_fetch_assoc:

Feldnamen, die von dieser Funktion zurückgegeben werden, unterscheiden sich in der Groß-/Kleinschreibung.

Vielleicht heisst das Feld in deiner Datenbank "Title" und nicht "title"

/EDIT: Oder wird überhaupt garnichts ausgegeben?

xaverseppel
2005-08-19, 16:15:12
mysql_fetch_assoc:

Feldnamen, die von dieser Funktion zurückgegeben werden, unterscheiden sich in der Groß-/Kleinschreibung.

Vielleicht heisst das Feld in deiner Datenbank "Title" und nicht "title"

/EDIT: Oder wird überhaupt garnichts ausgegeben?


okay es war en denk fehler von mir

ich hab den falschen tabellennamen dort eingeben

jetzt aber noch eins:

Wie bekomme ich es nun hin, das er mir nur einen kleinen Teil des Artikels anzeigt, wo das zusuchende Wort drin steht, anzeigt.
So das, dass Wort hervorgehoben wird und nur 1, 2 Zeilen des Text davor und dahinter angezeigt werden. Und dann der rest verlinkt ist.

clm[k1]
2005-08-19, 16:52:49
$word = "bla";
$text = "Text in dem das Wort bla vorkommt!";
$textBeforeChars = 50;
$textAfterChars = 50;
$position = stripos($word);
$begin = $position - $textBeforeChars;
$length = $begin;
if($begin < 0) {
$length = $position + begin;
$begin = 0;
}

$textBefore = substr($text, $begin, $length);
$textAfter = substr($text, $position, $textAfterChars);

$finalText = $textBefore . $word . $textAfter;

//highlight word
$finalText = str_replace($word, "<span style=\"color:red;\">".$word."</span>", $finalText);



so ähnlich... kann sein, das ein paar fehler drinn sind, aber so in der Art sollte das funzen.


clm[k1]

xaverseppel
2005-08-19, 17:02:35
danke ich werde es mal versuchen!

und das in die while schleife einbauen?

xaverseppel
2005-08-19, 17:35:48
']
$word = "bla";
$text = "Text in dem das Wort bla vorkommt!";
$textBeforeChars = 50;
$textAfterChars = 50;
$position = stripos($word);
$begin = $position - $textBeforeChars;
$length = $begin;
if($begin < 0) {
$length = $position + begin;
$begin = 0;
}

$textBefore = substr($text, $begin, $length);
$textAfter = substr($text, $position, $textAfterChars);

$finalText = $textBefore . $word . $textAfter;

//highlight word
$finalText = str_replace($word, "<span style=\"color:red;\">".$word."</span>", $finalText);



so ähnlich... kann sein, das ein paar fehler drinn sind, aber so in der Art sollte das funzen.


clm[k1]


also ich habe mal ein paar sachen geändert, aber er meldet mir eine fehler meldung

zuerst mal was ich geändert habe
das

$word = "bla";

in das

$word = $name;



das

$text = "Text in dem das Wort bla vorkommt!";

in das

$text = $line;


stimmt das?

nun meldet er mir diese fehlermeldung


Fatal error: Call to undefined function: () in /www/htdocs/v163425/suchauswertung.php on line 115


line 115 ist das hier:

$position = $stripos($word);

clm[k1]
2005-08-19, 19:08:05
also ich habe mal ein paar sachen geändert, aber er meldet mir eine fehler meldung

zuerst mal was ich geändert habe
das


$text = "Text in dem das Wort bla vorkommt!";

in das

$text = $line;


stimmt das?


wenn du ein $line['title'] draus machst, könnte es stimmen.



nun meldet er mir diese fehlermeldung


Fatal error: Call to undefined function: () in /www/htdocs/v163425/suchauswertung.php on line 115


line 115 ist das hier:

$position = $stripos($word);


stripos() gibts erst ab PHP5.
verwende halt einfach strpos($text, "bla")
(wird dann aber wahrscheinlich case-sensitive sein)


clm[k1]

xaverseppel
2005-08-19, 22:55:55
Hab das jetzt so gelöst:



$text = $line['content'];
$position = strpos($text, $word);

aber nun gibt er mir keinen text aus :(

xaverseppel
2005-08-20, 00:31:00
Hab da noch ein kleines Problem und zwar wollte ich einbauen, das man das suchfeld ausfüllen muss:

hier ist der quellcode, aber der funzt net, vielleich findet einer von euch den fehler


<html>
<head>
<title>Unbenanntes Dokument</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" type="text/css" href="css/xstyle.css">

<script type="text/javascript">
function pruefen(Formular){
if (Formular.wort.value=="")
{
alert("Sie müssen einen Suchbegriff eingeben!");
document.Formular.nachname.focus();
return false;
}
}

</script>

</head>

<body>
<div align="center">
<strong><span class="txtheadline">Suche</span></strong><br><br>
<form action="suchauswertung.php" name="Suche" method="post" onSubmit="return pruefen(this)">
<table border="0" cellpadding="2" class="kontakt">
<tr><td colspan="2">Bitte geben Sie hier einen Suchbegriff ein:</td></tr>
<tr><td colspan="2"><input type="text" size="30" name="wort"></td></tr>
<tr><td><input type="submit" value="Absenden"></td><td><input type="reset" value="Zur&uuml;cksetzten"></td></tr>
</table>
</form>
</div>

</body>
</html>

xaverseppel
2005-08-20, 11:02:30
So jetzt hab ich es hinbekommen. Hab den code gleich mal unten geändert. Hatte einen Tippfehler drin :biggrin:


Wenn ich jetzt nichts eingebe, wird das Fenster geöffnet, aber wenn man dann auf OK klickt geht es weiter, aber es sollte bei dem Forumlar bleiben und nicht zur Auswertung weiter springen. Wie bekomme ich das hin?

€dit:
So selbst ist der Mann :biggrin:

Hier der richtig Code:

<script type="text/javascript">
function pruefen(Formular){
Fehlermeldung="";
if (Formular.wort.value==""){
Fehlermeldung += "Um die Suche zu starten, müssen Sie einen Suchbegriff eingeben!\n";
}
if(Fehlermeldung){
alert(Fehlermeldung);
return false;
}
else {
return true;
}
}
</script>


Jezt fehlt nur noch das er einen Teil des gefunden Artikel ausgibt und nicht alles!

Flipper
2005-08-20, 19:31:41
die benötigte Funktion findest du hier:

http://de3.php.net/manual/de/ref.strings.php

xaverseppel
2005-08-21, 20:40:08
die benötigte Funktion findest du hier:

http://de3.php.net/manual/de/ref.strings.php


danke für die Hilfe. Hat mir geholfen das ein wenig zu verstehen, aber das ich nicht ausgegeben bekommen habe, hat daran gelegen, dass kein echo befehl da war. Tja manschmal ist der Fehler ganz einfach.

Danke für die Hilfe!!!!!

xaverseppel
2005-08-21, 21:33:26
das klappt wohl doch noch nicht so.

Der gibt mir mehr text aus auch wenn ich die werte verändere und wenn er das suchwort gefunden hat, gibt er den text noch mal kurz aus.

was muss ich am code ändern, damit es geht:


echo ("Ihre Suchanfrage nach dem Wort <em><strong>".$name."</strong></em> ergab folgende Treffer:<br><br>");
$num_rows = mysql_num_rows($result);
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
$word = $name;
$text = $line['content'];
$textBeforeChars = 10;
$textAfterChars = 20;
$position = strpos($text, $word); //Position des gesuchten wortes
$begin = $position - $textBeforeChars; //50 zeichen vor dem gesuchten wort
$length = $begin;
if($begin < 0) {
$length = $position + $begin;
$begin = 0;
}
$textBefore = substr($text, $begin, $position);
$textAfter = substr($text, $position, $textAfterChars);
$finalText = $textBefore . $word . $textAfter;
//highlight word
$finalTextb = str_replace($word, "<span style=\"color:red;\">".$word."</span>", $finalText);
//Text ausgeben
echo "<li><ul>$finalTextb</ul></li><hr><br>";
}
//Treffer ausgabe
echo "<br>Es wurden ".$num_rows." Artikel gefunden<br>";

xaverseppel
2005-08-21, 23:31:18
Hab die Fehler durch Hilfe gefunden:


$textBefore = substr($text, $begin, $textBeforeChars );
$textAfter = substr($text, ($position + strlen($word)), $textAfterChars);



so sollte es ausschauen