PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: unsauber programmiert ?



jonasge
23-03-2003, 16:07
Hi,
habe heute die ersten Perl erfahrungen gemacht:

#!/usr/bin/perl
print 'Content-type: text/html\n\n';
print "<HTML><HEAD><TITLE>Kapacity Download</TITLE></HEAD><BODY>";
print "Download wird gleich gestartet.";

use CGI;
use DBI;
my $cgi = new CGI;
my $filename = $cgi->param('filename');

#### EDIT
$hostname="localhost";
$datenbank="efsfd_db";
$username="efsfd";
$passwd="ufb";
#### EDIT
my $OK=0;
my $filefromdb;
my $idfromdb;
my $anzahlfromdb;
####Mysql Anbindung:
my $dbh = DBI->connect("DBI:mysql:$datenbank:$hostname", $username, $passwd) || die "Keine Verbindung zu Server $DBI::errstr\n";
my $sth = $dbh->prepare( 'SELECT * FROM kapacity') || die "Kann nicht Select: Mysql-DBI Sys: $DBI::errstr\n";
$sth->execute || die "Kann nicht ausführen: Mysql-DBI says: $DBI::errstr\n";

while (my @ergebnis = $sth->fetchrow_array ) {
# print ': ' . $ergebnis[0] . ' : ' . $ergebnis[1] . ' : ' . $ergebnis[2] ;
# print "<br>";
if ($ergebnis[1] eq $filename)
{
# print "<br>GLEICH<br>";
$idfromdb = $ergebnis[0];
$filefromdb = $ergebnis[1];
$anzahlfromdb = $ergebnis[2];
$OK = 1;
}
# if ($OK == 1)
# exit;

}

$sth->finish;
$dbh->disconnect();
#### ENDE Mysql:





#print "<br>Filename: $filename<br>";
#print "<br>ID: $idfromdb<br>FILE: $filefromdb<br>Anzahl: $anzahlfromdb<br>";
#print "<br>Rechne anzhal +1:<br>";
$anzahlfromdb += 1;
#print "Neue Anzahl: $anzahlfromdb";

###schreibe Wert neu:
my $dbha = DBI->connect("DBI:mysql:$datenbank:$hostname", $username, $passwd) || die "Keine Verbindung zu Server $DBI::errstr\n";
my $stha = $dbha->prepare( "UPDATE kapacity SET anzahl=$anzahlfromdb WHERE id=$idfromdb") || die "Kann nicht Select: Mysql-DBI Sys: $DBI::errstr\n";
$stha->execute || die "Kann nicht ausführen: Mysql-DBI says: $DBI::errstr\n";
$stha->finish;
$dbha->disconnect();


print "<br><br><b>FILENAME: $filename<br></b>";

print "<meta http-equiv=\"refresh\" content=\"0; URL=./download/$filename\">";
print "</BODY></HTML>";


Irgendwie habe ich den verdacht, das durch dieses Script meine mysql-DB belastet wird, stimmt das ?

Bzw. das soll ein Downloadzähler sein, ganz einfach.

gruss
Jonas

msi
23-03-2003, 18:25
du kannst bei deiner select anweisung noch ein where dazu machen, dann kannst du dir die komplette while Schleife sparen.

tomes
24-03-2003, 20:38
meist eine einzige Zeile (oder nur wenige ) anspricht, nehme ich dazu
my $stha = $dbha->do("...."), Variante. Ist dann nur ein Befehl.
Ausserdem sind select * ... Abfragen meist nicht so gut. Besser sind immer genaue Angaben (ausser du brauchst wirklich alle Felder).
Was mir noch aufgefallen ist:
1. Warum erst html dann mysql, dann wieder html usw. ?
2. Gehoert ein Meta-Tag nicht in den Header ?
3. Wenn du eine Connection zur DB hast, warum beendest du sie dann um sie sofort wieder aufzubauen ?
Dadurch koennte es passieren, das der erste Teil durchgefuehrt wird, der zweite aber nicht, da vielleicht z.Z. keine Sockets frei sind ;)
4. Siehe Beitrag von msi. Statt der while Schleife reicht dann ein:


my $ergebniss= $sth->fetchrow_hashref();
print $ergebniss->{'Spaltenname'};


Alles in allem, nur Kleinigkeiten ;)

T;o)Mes

jonasge
25-03-2003, 12:41
Danke, werde es mal anschauen, und hier nochmal posten...


Gruss
Jonas

jonasge
26-03-2003, 15:40
Hallo,

danke für die paar Tipps, jetzt habe ich das mit der WHERE abfrage noch gemacht, und paare mir die while-Schleife und den zweiten DB connect.

Gruss
Jonas:)