Suchfunktion nur in einer kategorie

Gesperrt
vishnuu
Beiträge: 6
Registriert: So 8. Aug 2004, 20:00
Kontaktdaten:

Suchfunktion nur in einer kategorie

Beitrag von vishnuu »

Hi Leute,
ich muss eine Art PLZ-Suche basteln mit der man ein 5-stellige PLZ eintragen kann und er liefert einem dann die entsprechende Seite. Es handelt sich um ca. 30 Seiten die angezeigt werden müssen.
Eine PLZ Auflistung habe ich. Jetzt hab ich mir überlegt ich nehme ein Kategorie und ertstelle darin alle 30 Seiten, gehe her und Trage in das Feld Zusammenfassung der jeweiligen Seite alle zuständigen PLZ rein.
Und verwende das unten stehende Volltextsuchemodul welches aber nur in einer angegeben kategorie suchen soll und nicht in der ganzen Seite sondern nur in dem Feld Zusammenfassung.

Hat schon jemand so ein Modul geschrieben?
Ich würde diese Suchfunktione nehmen:

Output
<?php
echo "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr>";
if($suche){
$suche = trim($suche);
$suchregexp = "(".str_replace(" ",")|(",$suche).")";
$s=ereg_replace("ü", "%FC",strtolower($suche));
$s=ereg_replace("ä", "%E4",$s);
$s=ereg_replace("ö", "%F6",$s);
$suchregexp .= "|$s";
$suchliste = explode(" ",strtolower($suche));

$sql = "SELECT
a.title AS title, a.idart AS idart, a.summary AS comment, a.idartlang AS idartlang,
b.idcat AS idcat,
c.parentid AS parentid,
d.value AS content
FROM
".$cfg["tab"]["art_lang"]." AS a,
".$cfg["tab"]["cat_art"]." AS b,
".$cfg["tab"]["cat"]." AS c,
".$cfg["tab"]["content"]." AS d
WHERE
a.idart = b.idart AND
a.idartlang = d.idartlang AND
b.idcat = c.idcat AND
c.idclient = '$client' AND
idlang = '$lang' AND
online='1' AND
(d.value REGEXP '$suchregexp' OR a.title REGEXP '$suchregexp' OR a.summary REGEXP '$suchregexp')";

$db->query($sql);
if ($db->num_rows() != 0){
for ($i=0; $i<$db->num_rows(); $i++) {
$db->next_record();
if ($auth->auth["uid"] == "nobody"){
$sql2 = "SELECT public FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".$db->f("idcat")."'";
$db2 = new DB_Contenido; $db2->query($sql2); $db2->next_record();
if($db2->f("public") == 0) continue;
};
$num = 0 + $db->f("idartlang");
$results[$num][link] = "front_content.php?client=$client&lang=$lang&parent=".$db->f("parentid")."&idcat=".$db->f("idcat")."&idart=".$db->f("idart")."";
$results[$num][title] = $db->f("title");




switch ("CMS_VALUE[2]") {
case 0: $results[$num][text] = "";break;
case 1: $results[$num][text] = $db->f("comment");break;
case 2: $results[$num][text] .= substr(strip_tags(rawurldecode($db->f("content"))),0,100)."...";
};
for($x=0;$x<count($suchliste);$x++){
$hits[$num] += substr_count(strtolower($db->f("title")), $suchliste[$x]) +
substr_count(strtolower($db->f("comment")), $suchliste[$x]) +
substr_count(strtolower($db->f("content")), $suchliste[$x]);
};
};
if(count($hits) > 0){
$hits = array_values($hits);
$results = array_values($results);
array_multisort ($results, SORT_DESC, SORT_NUMERIC, $hits, SORT_DESC, SORT_NUMERIC);
for ($i=0; $i<count($hits); $i++){
echo "<tr><td align=left width=50%>- <a href=\"".$results[$i][link]."\"";
if("CMS_VALUE[3]"){echo "TARGET=\"CMS_VALUE[3]\" ";};
echo ">".$results[$i][title]."</a><span>&nbsp;&nbsp;</td><td>Anzahl Treffer (".$hits[$i].")<BR>";
echo $results[$i][text]."</span></td></tr>";
};
} else { echo "<tr><td align=center>Keine passenden Seiten gefunden</td></tr>"; };
} else { echo "<tr><td align=center>Keine passenden Seiten gefunden</td></tr>"; };
};
echo "</table><br>";
?>
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

die suche muss auf die kategorien die enthalten sind ja eingrenzt werden
ich würd mich der funktion conDeeperCategoriesArray in der functions.con.php bedienen...

ich habs jetzt nicht getestet aber versuch mal das sql query am beginn durch folgendes zu ersetzen:

Code: Alles auswählen

$startidcat = 10; // der baum der durchsucht werden soll
$idcat_array = conDeeperCategoriesArray($startidcat);

$sql = "SELECT 
			a.title AS title, a.idart AS idart, a.summary AS comment, a.idartlang AS idartlang, 
			b.idcat AS idcat, 
			c.parentid AS parentid, 
			d.value AS content 
		FROM 
			".$cfg["tab"]["art_lang"]." AS a, 
			".$cfg["tab"]["cat_art"]." AS b, 
			".$cfg["tab"]["cat"]." AS c, 
			".$cfg["tab"]["content"]." AS d 
		WHERE 
			a.idart = b.idart AND 
			a.idartlang = d.idartlang AND 
			b.idcat = c.idcat AND 
			c.idclient = '$client' AND 
			idlang = '$lang' AND 
			online='1' AND 
			(d.value REGEXP '$suchregexp' OR a.title REGEXP '$suchregexp' OR a.summary REGEXP '$suchregexp')";
			
if (is_array($idcat_array) ) {
   $sql .= " AND c.idcat IN (".implode (',', $idcat_array).")";
} 
so oder so ähnlich sollte es funktionieren...
*** make your own tools (wishlist :: thx)
vishnuu
Beiträge: 6
Registriert: So 8. Aug 2004, 20:00
Kontaktdaten:

Beitrag von vishnuu »

Hey Cool, hat auf Anhieb tadellos funktioniert.
Großen Dank @emergence

Aber eins versteh ich nocht nicht so genau. Ich hab pro Seite immer total unterschiedliche PLZ und trotzdem gibt der mir als Anzahl gefundener Treffer 2 aus. Obwohl dass doch gar nicht sein kann. Ich vermute dass die Suche irgendeine DB doppelt scannt oder? Ich mein dass ist zwar halb so wild da es sich ja ausblenden lässt aber trotzdem irgendwie komisch.

Abgesehen davon macht das eigentlich einen großen Aufwand die Ausgabe so umzubauen dass als Ergebnis gleich die gesuchte Seite kommt. Da es ja zumindest hier in meinem Fall immer nur 1 Ergebnis geben kann.
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

vishnuu hat geschrieben:Aber eins versteh ich nocht nicht so genau. Ich hab pro Seite immer total unterschiedliche PLZ und trotzdem gibt der mir als Anzahl gefundener Treffer 2 aus. Obwohl dass doch gar nicht sein kann. Ich vermute dass die Suche irgendeine DB doppelt scannt oder? Ich mein dass ist zwar halb so wild da es sich ja ausblenden lässt aber trotzdem irgendwie komisch.
wenn du das sql query das erzeugt wird, direkt im phpmyadmin testest, siehst du warum dies so ist...
man müsste das sql query etwas umschreiben um dieses fehlverhalten zu beheben... dafür hab ich aber momentan leider keinerlei zeit...
*** make your own tools (wishlist :: thx)
Gesperrt