Hallo,
<input type="checkbox" name="$hash_ref->{'id'}" value="$hash_ref->{'id'}" />
Ich denke mal in $hash_ref->{'id'} steht die ID eines Datensatzes, den Du gerade von der Datenbank gelesen hast. Es ist allerdings imho sehr problematisch, Formularelemente so zu benennen, da sie bei der Abarbeitung des abgesendeten Forumulars schwer zu identifizieren sind.
Sinnvoll wäre es imho, wenn alle Checkboxen einen Namen haben, und Du sie beispielsweise mit
my(@delete_ids) = $query->param('delete_id');
ausliest. (Wernn ich davon ausgehe, daß die Checkboxen delete_id heißen und Du das CGI-Modul einsetzt, und Dein Query-Objekt $query heißt)
sub delete {
Es ist äußerst gefährlich, wenn Du Namen von build-in-Funktionen für deine eigenen verwendest. Perl unterstützt zwar das Überladen von Funktionen, es sollte allerdings wirklich nur in den seltensten Fällen Sinn machen, es auch zu tun. In Deinem Fall hat es nicht so funktioniert, deshalb auch die Fehlermeldung bezüglich fehlender Argumente
print $query->header;
my $sql = "DELETE FROM eintraege WHERE id=$query->param($hash_ref->{'id'}) LIMIT 1";
Ich denke einmal, daß das die ominöse Zeile 311 ist. Aufgrund der Fehlermeldung denke ich, daß $hash_ref im aktuellen Kontext des Programmes nicht erzeugt ist, geschweige denn einen sinnvollen Wert besitzt.
Bedenke, daß jeder Script-Aufruf quasi ein Universum für sich ist. _Nach_ dem abschicken des Formulars weiß das aufgerufene Script nichts über die Zustände jenes Scripts, welches das Formular erzeugt hat (auch wenn beide das selbe Script sind). Du mußt schon die CGI-Parameter auslesen, um zu den übergebenen Werten zu kommen. Einfach nur einen Variablennamen wieder zu verwenden reicht nicht.
my $sth = $dbh->prepare($sql) || die "$dbh->errstr";
print $query->start_html(-title=>'Adminfunktionen',
-author=>'jl@visualgrafyx.com',
-style=>{'src'=>'../stylesheets/style.css'});
print "<p>Eintrag erfolgreich gelöscht</p>\n";
print $query->end_html;
Dir ist hoffentlcih klar, daß hier kein Löschvorgang ausgeführt wird. Ein prepare() alleine genügt nicht. Du muß es dann schon noch mit execute() ausführen und, je nach DB-Verbindungseinstellungen auch mittels commit() bestätigen (wenn AutoCommit abeschaltet ist, was ich persönlich immer mache).
Außerdem lassen Checkboxen vermuten, daß Du potentiell mehrere Einträge gleichzeitig löschen willst, welshalb ich an Deiner Stelle die Bestätigungsmeldung überarbeiten würde.
Grüße
Klaus