echo $begrüßung;
Die Fehlermeldung kommt ja wohl ganz offenkundig aus dem execute():
"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'alter,sex,teilnahme,email,datum) VALUES ('1004','anonym','a','a','a','a','a','2'' at line 1 at zum_ausflippen.pl line 37."
Ja, stimmt, denn hier sind die Werte eingefügt. Das heißt, dass Perl in dem Fall nicht in der Lage ist, die von der MySQL-API angebotenen Funktionen für Prepared Statements zu nutzen und sie stattdessen selbst simuliert. Mit PHPs mysqli-Erweiterung und der Nutzung des dort angebotenen Prepared-Statements-Mechanismus wird der Fehler bereits beim prepare ausgegeben (dann natürlich mit den Platzhaltern anstatt der Werte im zitierten Statement).
Dabei kommt aber kein PREPARE-Statement zur Anwendung.
Klar, es geht nicht um prepared statements, wie von Dir behauptet, vgl. auch http://search.cpan.org/~timb/DBI-1.53/DBI.pm
Welche Stelle dort genau meinst du? Das Dokument ist doch recht umfangreich und nicht alles passt auf das Thema.
Insofern gehen auch weitere Ausführungen zum Thema Deinerseits (Ausnahme: Dein Hinweis auf "alter" war durchaus richtig :) an der Sache vorbei:
"Das ist irrelevant. ...", "Das war das tatsächlich versandte SQL-Statement. ..." (
O.K. es war nicht das versandte Statement. Trotzdem war die von dir bemängelte Parameter-Anzahl irrelevant. MySQL gibt bei Syntax-Fehlern den Teil vom Auftreten des Fehlers und die folgenden 80 Zeichen aus. Der Fehler ist also am Anfang des Zitats zu suchen, und der Rest ist für diesen Fehler belanglos.
Außerdem kann man davon ausgehen, dass Perls DBI ausreichend getestet ist und die Ersetzung der Platzhalter problemlos funktioniert. Sollte es Unstimmigkeiten zwischen der Anzahl der Platzhalter und der später übergebenen Parameter geben, beschwert sich schon Perl darüber und nicht erst das DBMS. Somit kann man das DBI als Blackbox betrachten und zur Fehlersuche das prepare() übergebene Platzhalter-Statement nehmen.
Somit sollte nach einem bind_param() - wie von uns angeregt - dieses hier im Forum für Analysezwecke angegeben werden.
Das ist im Allgemeinenen dann richtig, wenn man sein Statement selbst zusammenbaut. Wenn dabei vertrauenswürdige Komponenten im Spiel sind, wie DBI oder die Prepared-Statement-Mechanismen oder -Nachbildungen anderer Systeme oder APIs, ist das nicht mehr erforderlich und manchmal gänzlich unmöglich.
echo "$verabschiedung $name";