WulfmanGER
Commander
- Registriert
- Juli 2005
- Beiträge
- 2.272
Hallo in die Runde,
Ich hole mir aus einer Datenbank einzigartige IDs (DISTINCT). Für jede dieser IDs hole ich mir dann ein JSON-File von einem Server und möchte den Inhalt des JSON in die Tabelle schreiben.
Erster Datensatz:
imdb: 123
tmdb: 222
Zweiter Datensatz:
imdb: 124
tmdb: 294
Direkt beim ersten kommt aber schon
Fatal error: Uncaught mysqli_sql_exception: Duplicate entry '123-222' for key 'imdb_tmdb_unique'
imdb und tmdb hab ich zusammen als UNIQUE definiert. imdb selber ist unique, es kann aber passieren das es mehrere identische tmdb-id's gibt.
123-111
124-111
ist möglich und soll erlaubt sein.
123-113
123-144
ist nicht erlaubt. Es darf immer nur eine imdb-id existieren. Da ich diese aber schon per distinct aus der Datenbank hole, besteht hier keine gefahr.
Ich verstehe daher den Fehler überhaupt nicht. Mit PHP 8.0 klappt das ohne Probleme. Ich vermisse keine Datensätze. Bei 8.1 und 8.2 kommt direkt diese Fehlermeldung.
Als würde jeder Datensatz 2x in die DB eingefügt werden. Aber selbst bei 8.0 hab ich kein problem wenn ich das Script noch mal laufen lasse und somit NICHTS reingeschrieben wird, weil die Einträge ja vom ersten lauf alle vorhanden sind.
Wo kommt also dieses duplicate entry her?
So füge ich das ganze in die Datenbank ein:
(noch - werde hier auf prepared statemens umsteigen)
Ich hab jetzt vor dem query noch ein echo $imdb_id usw. gesetzt um zu prüfen ob hier eine schleife doppelt läuft. Nein.
Es kommt eine echo Ausgabe und danach direkt die Fehlermeldung. Bei Doppelte Schleife müsste ich das echo ja noch mal sehen.
Ich hab jetzt noch folgendes Entdeckt:
Ich hab das Script nach jedem INSERT mal mit ?> quasi "abgebrochen" (ohne aber die schleife zu verlassen) und mich so nach "unten" gearbeitet (nach jeden Start die DB geleert!). Es gab keine Probleme. Als ich dann am ende des scripts war und somit kein "Abbruch" mehr von meiner Seite initialisiert wurde, hab ich die DB geleert und das ganze script lief ohne fehler durch. Also DB noch mal geleert - Fehler. Aber dieses mal 124-294 ... also es wirkt nach einem caching-Problem. Es wird erst in den cache "geschrieben" - dort gibt es den Datensatz schon - und fehler?
Was mache ich hier also falsch?
Ich nutze php 8.0/1/2 unter Windows-Apache, mit MariaDB 10.11.2 - alles recht aktuell (vor 2-3 Wochen größere Updaterunde gemacht). PHP ist als CGI eingebunden.
EDIT:
Ok fehler "gefunden". Die Fehlermeldung von php ist extrem verwirrend. Der Fehler tritt an einer ganz anderen Stelle auf. In den Quelldateien die ich auslese ist tatsächlich ein Fehler ... 2 Einträge sind doppelt aber falsch markiert. Ich prüfe zwar die Markierung - wenn da aber steht "Anzahl: 1" - dann glaub ich das - wenn zwei Identische IDs mit Anzahl: 1 enthalten sind (und sich im weiteren Content unterscheiden - was korrekt wäre) wird das auch so verarbeitet und somit wird das duplikat nicht in die dafür vorgesehen Datenbank geschoben sondern in die falsche und somit duplicate entry.
Nur warum es mal ohne Fehlermeldung unter 8.1/2 klappt (also das eintragen natürlich nicht - duplicate verboten ist), irritiert mich. Ich schreib mein script jetzt um das ich mich nicht mehr auf die Quelldaten verlasse sondern selber "zähle" ... hab ich für das "Nachbarscript" schon machen müssen daher fix gemacht....
Ich hole mir aus einer Datenbank einzigartige IDs (DISTINCT). Für jede dieser IDs hole ich mir dann ein JSON-File von einem Server und möchte den Inhalt des JSON in die Tabelle schreiben.
Erster Datensatz:
imdb: 123
tmdb: 222
Zweiter Datensatz:
imdb: 124
tmdb: 294
Direkt beim ersten kommt aber schon
Fatal error: Uncaught mysqli_sql_exception: Duplicate entry '123-222' for key 'imdb_tmdb_unique'
imdb und tmdb hab ich zusammen als UNIQUE definiert. imdb selber ist unique, es kann aber passieren das es mehrere identische tmdb-id's gibt.
123-111
124-111
ist möglich und soll erlaubt sein.
123-113
123-144
ist nicht erlaubt. Es darf immer nur eine imdb-id existieren. Da ich diese aber schon per distinct aus der Datenbank hole, besteht hier keine gefahr.
Ich verstehe daher den Fehler überhaupt nicht. Mit PHP 8.0 klappt das ohne Probleme. Ich vermisse keine Datensätze. Bei 8.1 und 8.2 kommt direkt diese Fehlermeldung.
Als würde jeder Datensatz 2x in die DB eingefügt werden. Aber selbst bei 8.0 hab ich kein problem wenn ich das Script noch mal laufen lasse und somit NICHTS reingeschrieben wird, weil die Einträge ja vom ersten lauf alle vorhanden sind.
Wo kommt also dieses duplicate entry her?
So füge ich das ganze in die Datenbank ein:
Code:
$mysqli->query("INSERT INTO fdb_filmdetails (imdb_id, tmdb_id, tmdb_typ)
VALUES (
'$imdb_id',
'$tmdb_id',
'$type')"
);
Ich hab jetzt vor dem query noch ein echo $imdb_id usw. gesetzt um zu prüfen ob hier eine schleife doppelt läuft. Nein.
Es kommt eine echo Ausgabe und danach direkt die Fehlermeldung. Bei Doppelte Schleife müsste ich das echo ja noch mal sehen.
Ich hab jetzt noch folgendes Entdeckt:
Ich hab das Script nach jedem INSERT mal mit ?> quasi "abgebrochen" (ohne aber die schleife zu verlassen) und mich so nach "unten" gearbeitet (nach jeden Start die DB geleert!). Es gab keine Probleme. Als ich dann am ende des scripts war und somit kein "Abbruch" mehr von meiner Seite initialisiert wurde, hab ich die DB geleert und das ganze script lief ohne fehler durch. Also DB noch mal geleert - Fehler. Aber dieses mal 124-294 ... also es wirkt nach einem caching-Problem. Es wird erst in den cache "geschrieben" - dort gibt es den Datensatz schon - und fehler?
Was mache ich hier also falsch?
Ich nutze php 8.0/1/2 unter Windows-Apache, mit MariaDB 10.11.2 - alles recht aktuell (vor 2-3 Wochen größere Updaterunde gemacht). PHP ist als CGI eingebunden.
Ergänzung ()
EDIT:
Ok fehler "gefunden". Die Fehlermeldung von php ist extrem verwirrend. Der Fehler tritt an einer ganz anderen Stelle auf. In den Quelldateien die ich auslese ist tatsächlich ein Fehler ... 2 Einträge sind doppelt aber falsch markiert. Ich prüfe zwar die Markierung - wenn da aber steht "Anzahl: 1" - dann glaub ich das - wenn zwei Identische IDs mit Anzahl: 1 enthalten sind (und sich im weiteren Content unterscheiden - was korrekt wäre) wird das auch so verarbeitet und somit wird das duplikat nicht in die dafür vorgesehen Datenbank geschoben sondern in die falsche und somit duplicate entry.
Nur warum es mal ohne Fehlermeldung unter 8.1/2 klappt (also das eintragen natürlich nicht - duplicate verboten ist), irritiert mich. Ich schreib mein script jetzt um das ich mich nicht mehr auf die Quelldaten verlasse sondern selber "zähle" ... hab ich für das "Nachbarscript" schon machen müssen daher fix gemacht....
Zuletzt bearbeitet: