Hallo Jörg,
Habs gerade mal ausprobiert.
Es bleibt bestehen.
Nein.
Vielleicht müsste man die Verbindung zu sql kappen und neu aufnehmen, dann würde es vermutlich zurückgestzt.
Nein, das ist keine Eigenschaft der mysqli-Connection, sondern des mysqli-Treibers. Der Treiber ist ein Singleton, d.h. es gibt nur einen während der ganzen PHP Laufzeit. Und er wertet den Schalter für jedes Statement neu aus.
Die Lösung ist: REPORT_ERROR ist nur eine Hälfte der Medaille. Wenn Du diese Option setzt, wird für den Duplicate Key eine Warnung protokolliert. Wenn es auch noch eine Exception geben soll, muss man REPORT_STRICT hinzufügen. REPORT_STRICT allein reicht auch nicht, denn dann werden Fehler nicht protokolliert. Keine Ahnung, wann REPORT_STRICT alleine Sinn ergibt.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
wäre also vonnöten. Wie das PHP Handbuch schreibt, ist das ab PHP 8.1 die Werkseinstellung.
Wenn Du mit dem Schalter nicht rumspielen willst, setze den query-Aufruf mit dem Insert-Befehl in einen try-catch Block. Der folgende Code setzt voraus, dass SQL Exceptions geworfen werden und fragt deshalb den Returncode von query nicht mehr ab. Also: Entweder PHP 8.1 verwenden oder die Exceptions vorsätzlich einschalten.
try {
$db->query("INSERT INTO foo (bar, baz) VALUES('pi', 'daumen')");
}
catch (myqli_sql_exception $sqx) {
if ($sqx->code != 1062) {
// real error
}
}
Rolf
sumpsi - posui - obstruxi