Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5880[/thread]

Bestenliste besser

Leser: 1


<< >> 6 Einträge, 1 Seite
ppm1
 2003-11-05 22:04
#69569 #69569
User since
2003-09-14
142 Artikel
BenutzerIn
[default_avatar]
Hallo

Ich wollte mal fragen wie ich ein Bestenlistenscript verbessern kann?

Bisher mache ich immer so:


In einer Variablen $platz den Platz speichern von dem ab 10 Leute ausgegeben werden sollen.

Dann lese ich aus der Datenbank mittels folgendermaßen aus:

my $i = 1;
my $b = 0;
$statement = "SELECT name,punkte,id FROM user ORDER BY punkte DESC";
$sth = $dbh->prepare( $statement ) || die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
$sth->execute || die "Kann Abfrage1 nicht ausfuehren: $DBI::errstr\n";
while(my @daten = $sth->fetchrow_array and $b < 10) {
if ($i>=$platz and $i < $platz+10) {
Dann wird hier eine Zeile geschrieben ausgegeben.

$b++;
}

$i++;
}
$sth->finish;


Allerdings sind dann z.B. bei einem Platz= 1500 , 1500 Scheifendurchläufe notwendig!!!

Kann man da was verändern?
Geewiz
 2003-11-05 22:21
#69570 #69570
User since
2003-09-29
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn du MySQL verwendest, kannst du eventuell die SQL-Statements LIMIT und OFFSET einsetzen, um nicht alle Zeilen abzurufen.
jan10001
 2003-11-05 22:42
#69571 #69571
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
z.B. so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $zaehler="0";

$statement = "SELECT name,punkte,id FROM user ORDER BY punkte DESC";
$sth = $dbh->prepare( $statement ) || die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
$sth->execute || die "Kann Abfrage1 nicht ausfuehren: $DBI::errstr\n";

while(my @daten = $sth->fetchrow_array()) {
$zaehler++;

my $ausgabe = $ausgabe.$daten[0].$daten[1].$daten[2];

if ( $zaehler > 10 ) {
print $ausgabe;
$ausgabe="";
$zaehler="0";
}

}
$sth->finish;


Aber bitte nicht eins zu eins übernehmen. :)\n\n

<!--EDIT|jan10001|1068066265-->
GH@NDI
 2003-11-05 23:23
#69572 #69572
User since
2003-09-21
16 Artikel
BenutzerIn
[Homepage] [default_avatar]
Kann mich Geewiz nur anschließen, sofern es sich um MySQL dreht oder ein anderes RDBMS das LIMIT oder eine equivalente Funktion kennt, sollte die bei sowas genutzt werden.

Im Falle von MySQL sähe das dann so aus:
Code: (dl )
my $query = "SELECT name,punkte,id FROM user ORDER BY punkte DESC LIMIT $platz, 10";


Was evtl. auch noch eine Lösung sein könnte, vorrausgesetzt es handelt sich nicht um zuviele Datensätze, könnte man einfach das komplette Ergebnis in einen Array packen und dann per:
Code: (dl )
1
2
3
4
5
6
7
my @daten = <DATENBANKRÜCKGABE>;
my $start = $platz; # Startplatz
my $ende = $start + 10; # Endplatz

foreach($daten[$start..$ende]) {
# tadaaa :)
}


Dabei kommts halt drauf an, wieviel Arbeitsspeicher zur verfügung steht...hab grade mal getesten, mein Perl (ActivePerl 5.8.0, Win2k) braucht bei einem Array mit 100.000 Einträgen und je 512Byte Daten immerhin schon 57MB Arbeitsspeicher ;)
Bei 10.000 Einträge sinds aber vertragbare 8MB :)
Strat
 2003-11-06 02:26
#69573 #69573
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
oder gleich mit CPAN:Tie::File arbeiten? dann brauchst du nicht alles in den arbeitsspeicher laden.
(Nebenbei: wenn man eine Datei mit while(<FILE>) ... einliest, hat man auch immer nur eine Zeile im Arbeitsspeicher, weil das ein skalarer Kontext ist. bei foreach (<FILE>) oder @liste = <FILE>, bekommt man einen listenkontext, und die ganze datei wird zurueckgegeben)

oder einen Hash auf die Festplatte bannen, wo ein bisschen indiziert wird (z.B. mit CPAN:DB_File), einmal benutzername -> id, und einmal id -> benutzername & punkte oder was auch immer.
aber wenn es viel wird, koennte da eine datenbank sicher einfacher sein\n\n

<!--EDIT|Strat|1068078507-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
jan10001
 2003-11-06 10:42
#69574 #69574
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Ich hatte das so verstanden das er die ganze Tabelle in 10er Blöcken ausgeben möchte. Wenn er noch einen zweiten Zähler in die Schleife setzt hätte er auch die jeweiligen Platznummern.
<< >> 6 Einträge, 1 Seite



View all threads created 2003-11-05 22:04.