Verwenden:
MySQL 5.5 ActivePerl v5.14.1 Windows 7 64bit
Das folgende Skript hat ein undefiniertes $DBI::errstr beim Scheitern des execute-Aufrufs:
#!c:/perl/bin/perl.exe -w
use DBI;
my $dbh = DBI->connect('dbi:mysql:cq','root','password') or die "Connection Error: $DBI::errstr\n";
# This SQL should fail because of a foreign key constraint
my $sql = "delete from Player where ID=6462";
my $sth = $dbh->prepare($sql);
$sth->execute or die "SQL Error: $DBI::errstr\n";
Die Ausgabe bei Ausführung des Skripts lautet:
Use of uninitialized value $DBI::errstr in concatenation (.) or string at testmysql2.pl line 10.
SQL Error:
Der SQL-Lauf über HeidiSQL liefert den erwarteten Fremdschlüssel-Fehler: (Ich kann das Bild nicht einfügen, da ich ein neuer Benutzer bin)
Das gleiche Skript, das unter Windows XP 32-Bit ausgeführt wird, liefert den erwarteten Fehler:
DBD::mysql::st execute failed: Cannot delete or update a parent row: a foreign key constraint fails (`cq`.`messageboard`, CONSTRAINT `messageboard_ibfk_1` FOREIGN KEY (`PlayerID`) REFERENCES `player` (`ID`)) at testmysql2.pl line 10.
SQL Error2: Cannot delete or update a parent row: a foreign key constraint fails (`cq`.`messageboard`, CONSTRAINT `messageboard_ibfk_1` FOREIGN KEY (`PlayerID`) REFERENCES `player` (`ID`))
Anmerkung:
Das Problem tritt unabhängig von der SQL auf, zum Beispiel führt ein SQL-Syntaxfehler auch zu einem undefinierten $DBI::errstr
Interessanterweise wird ein Verbindungsfehler zurückgegeben - stoppen Sie zum Beispiel den MySQL-Dienst - führen Sie das Skript aus und die folgende Ausgabe wird wie erwartet ausgegeben:
DBI connect('cq','root',...) failed: Can't connect to MySQL server on 'localhost' (10061) at testmysql2.pl line 4
Connection Error: Can't connect to MySQL server on 'localhost' (10061)
Die Einstellung eines Trace-Levels liefert (für mich) keine nützlichen Informationen:
$sth->trace(5, "trace.txt");
$sth->execute or die "SQL Error: $DBI::errstr\n";
mit einem Ausschnitt aus trace.txt, der wie folgt umformatiert wurde:
dbd_st_free_result_sets
mysql_st_internal_execute MYSQL_VERSION_ID 50147
parse_params statement delete from Player where ID=6462
dbd_st_execute returning imp_sth->row_num 18446744073709551614
execute= ( undef ) [1 items] at testmysql2.pl line 11
DESTROY for DBD::mysql::st (DBI::st=HASH(0x29dc0a8)~INNER) thr#2a97e8
Korrektes SQL funktioniert wie erwartet. Ich vermute, dass dies ein Fehler für Windows 7 64bit ist? - aber ich bin mir nicht sicher, wie ich das Problem beheben oder die richtige Stelle finden kann, um es definitiv zu melden/herauszufinden.
Wenn Sie bis hierher gekommen sind ... danke fürs Lesen!