Thread Suchscript funktioniert nur mangelhaft...warum? (14 answers)
Opened by amilate at 2010-06-03 10:24

amilate
 2010-06-03 10:24
#137940 #137940
User since
2010-06-03
4 Artikel
BenutzerIn
[default_avatar]
Erstmal Hallo alle miteinander; ich bin der Neue...

Zum Problem:
Ich habe wenig Ahnung von Perl, habe aber ein cgi-Shopsystem
von 1998 "geerbt" und möchte dieses nun für einen Bekannten
aufsetzen. Bei der Anpassung an die Bedürfnisse (spezieller
bei der Suche) komme ich nun nicht weiter.

Der Suchalgorythmus vergleicht ein Stichwort mit mehreren Text-Files
und in verschiedenen Datenbereichen und gibt dieses dann als Liste aus.
Nur das die Treffer zum Teil einfach, zum Teil aber auch mehrfach
(bis zu 12x) auftauchen. Ich finde mit meinen spärlichen cgi-Kenntnissen
die Ursache nicht.
Zum Nachvollziehen mal unter
http://www.boofe-shop.de/shop/menu/main.html
einfach einen Hersteller anklicken.

Vielleicht kann sich hier mal einer den (gekürzten) Code anschauen
und sagen wo der Fehler liegt. Optional würde es auch gehen wenn
einfach bei der Suche doppelte Einträge wieder rausgefiltert werden
(so das jeder Artikel nur 1x drinsteht).

Das Codefragment:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
@katalog       = ("Hosen",
"Pullover",
"Bekleidung-Sonstiges",
"Jacken",
"Unterwäsche",
"Schuhe",
"Rucksack",
"Schlafsack",
"Zelte",
"Klettern",
"Hardware-Sonstiges",
"Kocher");

sub search {

# Get the input
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

# Split the name-value pairs
@pairs = split(/&/, $buffer);

foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);

# Un-Webify plus signs and %-encoding
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;

if ($allow_html != 1) {
$value =~ s/<([^>]|\n)*>//g;
}
else {
unless ($name eq 'body') {
$value =~ s/<([^>]|\n)*>//g;
}
}

$FORM{$name} = $value;
}

if ($FORM{'search_text'}) {
$search_text = "$FORM{'search_text'}";
$search_text =~ s/<//g;
$search_text =~ s/>//g;
$search_text =~ s/\&//g;
$search_text =~ s/\*//g;
}
$search_kat = "$FORM{'search_kat'}";


foreach (@katalog) {
$searchrowfile = $sbagrowfiles[$kat_nummer];

open (FILE, $searchrowfile) || &error_log ("Fehler beim Lesen der Datei $searchrowfile");
while (<FILE>) { $rowtpl .= $_; }
close (FILE);

$search_positiona = 1;
$search_positionb = 2;
$search_positionc = 3;
$search_positiond = 5;
$search_positione = 6;

$akt_zeile = 0;
$akt_kat = 0;

$kat_name = $katalog[$kat_nummer];
open (FILE, $data[$kat_nummer]) || &error_log ("Fehler beim Lesen der Katalog-Datei $data[$kat_nummer]");
while (<FILE>) {
if ($_ !~ /^[\-|+|\n]/) {
$akt_zeile++;
# Kommentare Plus und Leerzeilen raus
@tempvalue=split(/;/, $_);

@s_text=split(/ +/,$search_text);
$words=@s_text."";

$break=1;
$s=0;
$found=0;
while ($s < $words & $found < $break) {

if ($tempvalue[$search_positiona] =~ /@s_text[$s]/i) {
++$found;
}
if ($tempvalue[$search_positionb] =~ /@s_text[$s]/i) {
++$found;
}
if ($tempvalue[$search_positionc] =~ /@s_text[$s]/i) {
++$found;
}
if ($tempvalue[$search_positiond] =~ /@s_text[$s]/i) {
++$found;
}
if ($tempvalue[$search_positione] =~ /@s_text[$s]/i) {
++$found;
}
++$s;
}
if ($found >= $break) {
$newrow = $rowtpl;
$newrow =~ s/BESTELL_NR/$tempvalue[0]/g;
$newrow =~ s/<!--Data1-->/$tempvalue[1]/g;
if (-e "../shop/data/$tempvalue[0].gif") {
$temp = "<A NAME=\"$tempvalue[0]\" HREF=\"..\/shop\/data\/index.php?id=$tempvalue[0]\" onclick=\"neuesFenster(this.href,'name','600','460','yes');return false\" onMouseOver=\"window.status='weitere Infos';return true\" ><IMG SRC=\"".$html_base_dir."/".$gfx_dir."info.gif\" BORDER=\"0\" align=absmiddle></A>";
$newrow =~ s/<!--InfoButton-->/$temp/g;
}
if (-e "../shop/data/$tempvalue[0].jpg") {
$temp = "<A NAME=\"$tempvalue[0]\" HREF=\"..\/shop\/data\/index.php?id=$tempvalue[0]\" onclick=\"neuesFenster(this.href,'name','600','460','yes');return false\" onMouseOver=\"window.status='weitere Infos';return true\" ><IMG SRC=\"".$html_base_dir."/".$gfx_dir."info.gif\" BORDER=\"0\" align=absmiddle></A>";
$newrow =~ s/<!--InfoButton-->/$temp/g;
}
else {
$temp = "&#160;&#160;";
$newrow =~ s/<!--InfoButton-->/$temp/g;
}
$newrow =~ s/<!--Data2-->/$tempvalue[2]/g;
$newrow =~ s/<!--Data3-->/$tempvalue[3]/g;
$newrow =~ s/<!--Preis-->/$tempvalue[4]/g;
$newrow =~ s/PROD_VAL/$namarr[1]/g;
&HiASCII2LoASCII($newrow);
$insstr .= $newrow;
++$found_sum;
}
}
elsif ($_ =~ /^\+/) {
++$akt_kat;
$akt_zeile=0;
}
}
$kat_nummer++;
close (FILE);
}
}

if ($found_sum == 0)
{
$insstr = " <TR><TD COLSPAN=\"11\">&#160;</TD></TR>
<TD COLSPAN=\"11\" ALIGN=\"CENTER\"><H1>Es wurden keine Artikel gefunden!</H1></TD></TR>
<TR><TD COLSPAN=\"11\">&#160;</TD></TR>";
}

open (FILE, $searchtplfile) || &error_log ("Fehler beim Lesen der Datei $searchtplfile");
while (<FILE>) { $tplstr .= $_; }
close(FILE);

$functions = "<SCRIPT LANGUAGE=\"JavaScript\" SRC=\"$jstplfile\" TYPE=\"text/javascript\">\n </SCRIPT>";

$tplstr =~ s/<!--INS-->/$insstr/;
$tplstr =~ s/<!--JAVASCRIPT-->/$functions/;
$style = "<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"$stylefile\">";
$tplstr =~ s/<!--STYLE-->/$style/;
$tplstr =~ s/<!--BACKGROUND-->/$html_base_dir\/$back_pic/g;
$tplstr =~ s/<!--GFX-->/$html_base_dir\/$gfx_dir/g;


$COS = "Onlineshop";

$tplstr =~ s/<!--COS-->/$COS/;

# --- HTML-Seite anzeigen ---
print "Content-type: text/html\n\n" . $tplstr;

Last edited: 2010-06-03 10:33:52 +0200 (CEST)

View full thread Suchscript funktioniert nur mangelhaft...warum?