Hallo,
use DBI;
So etwas solltest Du gleich am Anfang des Scripts einfügen, es wird ja sowieso beim Start ausgeführt (siehe perldoc -f use).
my ($SQL,$sth);
Variablen in Großbuchtsaben sind nicht gerade guter Perl-Stil (siehe dazu perldoc perlstyle).
if ($nummer && $eMail eq ''){
$SQL = "SELECT * FROM $computer_names WHERE tsslogin like '$tsskennung'";
}
[...]
else { print "Es muss mindestens ein Feld ausgefuellt sein!\n"}
Ich finde, daß das rechtungeschickt und unübersichtlich ist.
Denke einmal über folgende Code nach (der überdies auch mehrere Kritierien gleichzeitig berücksichtigt) :
my $wherestring = '';
if($nummer ne '')
{
$wherestring .= (($wherestring eq '')?' WHERE ':' AND ')." COMPUTERNUMBER = $nummer ";
}
if($tsskennung ne '')
{
$wherestring .= (($wherestring eq '')?' WHERE ':' AND ')." TSSLOGIN = '$tsskennung' ";
}
if($email ne '')
{
$wherestring .= (($wherestring eq '')?' WHERE ':' AND ')." RESPEMAIL = '$email' ";
}
if($wherestring eq '')
{
return 'es muß mindestens ein Feld angegben sein';
}
my $sql = "SELECT COMPUTERNUMBER,TSSLOGIN,RESPEMAIL from $computer_names $wherestring";
my $dbh = DBI->connect($datasource, $dbusername, $dbpassword, {RaiseError =>1, AutoCommit =>0}) || die "Unable to connect: $DBI::errstr";
1.) LIKE solltest Du nur verwenden, wenn Du mit Teilstrings suchst (FELD LIKE 'TEST%');
2.) Unterscheide zwishcen numerischen und String-Vergleichen. zweiteres erforder von der Datenbank Typkonvertierungen, welche sich schlecht auf die Leistung auswirken
3.) bei SELECT-Statements solltest Du immer die gewünschten Felder anführen. 'SELECT * FROM ...' solltest Du nur im Entwicklungsumfeld benutzen. Damit kannst Du garantieren, dßa die Felder auhc in der von Dir gewünschten Reihenfolge geliefert werden.
4.) Den Datenbankconnect solltest Du immer _nach_ sämtlichen Prüfungen machen, da er auch Performance kostet und Dir mehr Arbeit beim Aufräumen im Fehlerfalle macht.
5.) ich gehe eimal davon aus, daß $comuter_names den Namen der gewünschetn Tabelle irgendwo anders im Script definiert.
$sth = $dbh->prepare($SQL) || die "Unable to connect: $DBI::errstr";
^^^^^^^
Cut&Paste ist ein Schwein;-)
while (@row = $sth->fetchrow_array) {
$nummer = @row[0];
$tsskennung = @row[1];
$eMail = @row[2];
}
Einzelwerte aus einem Array werden üblicherweise mit $row[0] usw. abgefragt. @row[0] ist eine Liste und kein Scalar, das ist ein wesentlicher Unterschied.
while() läßt vermuten, dßa es auch durchaus mehrere Datensätze geben kann, die den Suchkriterien entsprechen. Wie willst Du das berücksichtigen? Derzeit wird nur der zuletzt von der Datenbank gelieferte Datensatz weiter verarbeitet.
return @row = ($nummer, $tsskennung, $eMail);
die Zuweisung auf @row ist hier unnötig.
$dbh->disconnect();
Diese Anweisung wird nie und nimmer ausgeführt, und kann, je nach Treiber einen Fehler produzieren. Zumindest wird es aber unnötige Resourcen binden.
Ist das alles so richtig?
Mein spezielles Problem dabei ist jetzt, dass ich nicht weiß wie die Suchergebnisse ausgegeben werden (eigentlich doch mit ...(@row = $sth->fetchrow_array... usw.) Stimmt das? Wenn ja, wie erreiche ich, dass mir meine Suchergebenisse als HTML-Code an den Browser gesendet werden?
$Suchen = uc(&Suchen($nummer ,$tsskennung ,$eMail));
warum host Du dir nicht die Einzelwerte ab und formatierst die im aufrufenden Code?
($nummer ,$tsskennung ,$eMail)= &Suchen($nummer ,$tsskennung ,$eMail);
print <<EOT;
Folgende Daten wurden gefunden:<br>
Nummer: $nummer<br>
Kennung: $tsskennung<br>
Email: $eMail<br>
EOT
Grüße
Klaus