Seite 1 von 1

Probleme nach Update von 4.9.12 auf aktuelle 4.10-dev

Verfasst: Do 11. Sep 2025, 19:11
von lunsen_de
Hallo,

ich habe heute versucht eine 4.9.12 Installation auf die aktuelle 4.10-dev aus dem git mit dem Update zu versehen.

Zum Server:
Contenido 4.9.12 mitr PHP 7.0
PHP während Update auf 8.2.29 gestellt
Mariadb 5.5 (ich weiß, eigentlich zu alt, aber auf dem Server laufen einige Installtionen mit einer 4.10-dev aus z.B. Februar 2025 ohne Pronbleme).

Während des Setups: Der grüne Balken läuft bis zum Ende (also voll) aber erspringt nicht auf die Endseite auf der man sich dann ins Backend einloggen etc. (es bleicht bei ... bitte warten....). Habe vor dem Update natürlich die Config in data kopiert. Diese wird aber nicht neu gespeichert. Warscheinlich weil das Setup nicht komplett durchläuft.
Habe zum Vergleich mit den gleichen Daten eine Neuinstallation in eine leere Datenbank gemacht und da läuft das Setup vollständig bis zum Abschluss durch: Abgeschlossen. Hier wird auch die config ordnungsgemäß erstellt.

Habe mich dann trotzdem ins Backend des Updates mal eingeloggt und einige Bereiche bleiben beim Aufrufen weiß. z.B. wird Content Kategorie unten garnicht geladen, oder bei Administration Benutzer im linken Frame oben die Eintrage wir Benutzer verwalten etc.

In der Errorlog stehen folgende Sachen. Irgendwelche Einträge mit 0 verursachen hier scheinbar Fehler:

Direkt nach der Installation, nach Login:

Code: Alles auswählen

[11-Sep-2025 19:31:15 Europe/Berlin] PHP Fatal error:  Uncaught mysqli_sql_exception: Incorrect table definition; there can be only one auto column and it must be defined as a key in /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php:210
Stack trace:
#0 /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php(210): mysqli_query()
#1 /var/www/vhosts/domain/contenido/classes/db/class.db.driver.handler.php(811): cDbDriverMysqli->query()
#2 /var/www/vhosts/domain/setup/lib/functions.sql.php(276): cDbDriverHandler->query()
#3 /var/www/vhosts/domain/setup/lib/functions.sql.php(98): alterTableHandling()
#4 /var/www/vhosts/domain/setup/upgrade_jobs/class.upgrade.job.main.php(66): addAutoIncrementToTables()
#5 /var/www/vhosts/domain/setup/upgrade_jobs/class.upgrade.job.main.php(33): cUpgradeJobMain->_executeInitialJobs()
#6 /var/www/vhosts/domain/setup/lib/include.db.controller.php(130): cUpgradeJobMain->_execute()
#7 /var/www/vhosts/domain/setup/index.php(31): include('...')
#8 {main}
  thrown in /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php on line 210
Nach den Klicks die weiße Bereiche bewirken:

Code: Alles auswählen

[11-Sep-2025 19:33:37 Europe/Berlin] PHP Fatal error:  Uncaught mysqli_sql_exception: Duplicate entry '0' for key 'PRIMARY' in /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php:210
Stack trace:
#0 /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php(210): mysqli_query()
#1 /var/www/vhosts/domain/contenido/classes/db/class.db.driver.handler.php(811): cDbDriverMysqli->query()
#2 /var/www/vhosts/domain/contenido/includes/functions.str.php(362): cDbDriverHandler->query()
#3 /var/www/vhosts/domain/contenido/includes/include.str_overview.php(59): strRemakeTreeTable()
#4 /var/www/vhosts/domain/contenido/main.php(216): include_once('...')
#5 {main}
  thrown in /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php on line 210
[11-Sep-2025 19:35:04 Europe/Berlin] PHP Fatal error:  Uncaught mysqli_sql_exception: Column 'idproperty' cannot be null in /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php:210
Stack trace:
#0 /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php(210): mysqli_query()
#1 /var/www/vhosts/domain/contenido/classes/db/class.db.driver.handler.php(811): cDbDriverMysqli->query()
#2 /var/www/vhosts/domain/contenido/classes/genericdb/class.item.collection.php(1294): cDbDriverHandler->query()
#3 /var/www/vhosts/domain/contenido/classes/contenido/class.property.php(197): ItemCollection->createNewItem()
#4 /var/www/vhosts/domain/contenido/classes/contenido/class.property.php(396): cApiPropertyCollection->create()
#5 /var/www/vhosts/domain/contenido/classes/genericdb/class.item.php(634): cApiPropertyCollection->setValue()
#6 /var/www/vhosts/domain/contenido/includes/include.rights_left_top.php(40): Item->setProperty()
#7 /var/www/vhosts/domain/contenido/main.php(216): include_once('...')
#8 {main}
  thrown in /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php on line 210

Bei der Blanko (Neu) Installation stand bei dem Klick auf Statistiken, dass diese abgeschaltet wären und ich sie aktivieren kann (sind in der Mandantenconfig allerdings an) kam auch ein ähnlicher Fehler:

Code: Alles auswählen

....Column 'idstat' cannot be null in....
Ich kann mir das nicht erklären, da wie gesagt auf dem Server viele Installtionen von Contenido laufen. Andere 4.10-dev Versionen spuken beim Klick auf Stastiken den Fehler ....Column 'idstat' cannot be null in.... nicht aus. Diese laufen fehlerfrei mit der gleichen Datenbank und der gleichen PHP Version.

Kann jemand mit den Fehlern etwas anfangen?

Grüße Lars

Re: Probleme nach Update von 4.9.12 auf aktuelle 4.10-dev

Verfasst: Fr 12. Sep 2025, 10:34
von Faar
Guten Morgen Lars.
Einige bekannte Fehler gibt es, wenn alte Tabellen auf neu umgewandelt werden.
In denen steht hier und da mal NULL aber das darf eigentlich nicht sein, weil NULL ist Nichts, Boolean Nichts aber in z.B. Charakter Tabellen hat NULL nichts zu suchen, sondern höchstens "" (" "), das ist ein leeres Zeichen.
Wenn nun die Tabelle neu definiert wird, müssten auch die falschen Werte vorher (!) alle umgewandelt werden.
Dafür bräuchte es Helferroutinen mit Queues, die bei Updates die alten Datenbank durchforsten und das machen.
Das ist jetzt nur ein Beispiel.

Anderes Beispiel ist, wenn Tabellen aktualisiert und sortiert werden und in einer PRIMARY Tabelle, die zwingend auch Unique ist (also nur unterschiedliche Werte) und zusätzlich kein NULL enthalten dürfen.
Ist da ein NULL, knallt's.
Ist da ein 0 und beim Bearbeiten durch das Update wird sortiert, dann kann es sein, dass die Null (0) noch stehen bleibt und beim Sortieren neu eingetragen werden will, wobei bei einer Primary nur einmal ein gleicher Wert sein kann.
Theoretisch und braktisch müsste eine Helferroutine diese Tabellenspalten aufspüren, eine temporäre Tabelle aufmachen, alles rüberkopieren und dann die alte Tabelle leeren oder löschen und neu mit den kopierten Werten füllen, dann klappt das.
Das ist nur ein Beispiel, woran es hapern kann, wogegen es bei anderen, die andere Tabellenzustände haben, reibungslos läuft.

Ich hatte mit Xmurrix diese Diskussion vor einiger Zeit, ich weiß aber nicht mehr wo, es ist Jahre her.
Ich kann dann in die Datenbank-Tabelle und das händisch erledigen aber das können nur wenige.
Vielleicht erinnert sich Xmurrix noch an das Thema?

Gruß,
Frank

Re: Probleme nach Update von 4.9.12 auf aktuelle 4.10-dev

Verfasst: Fr 12. Sep 2025, 11:28
von xmurrix
Hallo Lars,

Code: Alles auswählen

[11-Sep-2025 19:31:15 Europe/Berlin] PHP Fatal error:  Uncaught mysqli_sql_exception: Incorrect table definition; there can be only one auto column and it must be defined as a key in .../contenido/classes/db/class.db.driver.mysqli.php:210
Stack trace:
#0 .../contenido/classes/db/class.db.driver.mysqli.php(210): mysqli_query()
#1 .../contenido/classes/db/class.db.driver.handler.php(811): cDbDriverMysqli->query()
#2 .../setup/lib/functions.sql.php(276): cDbDriverHandler->query()
#3 .../setup/lib/functions.sql.php(98): alterTableHandling()
#4 .../setup/upgrade_jobs/class.upgrade.job.main.php(66): addAutoIncrementToTables()
#5 .../setup/upgrade_jobs/class.upgrade.job.main.php(33): cUpgradeJobMain->_executeInitialJobs()
#6 .../setup/lib/include.db.controller.php(130): cUpgradeJobMain->_execute()
#7 .../setup/index.php(31): include('...')
#8 {main}
  thrown in .../contenido/classes/db/class.db.driver.mysqli.php on line 210
Hier wird beim Setup das Primärschlüssel-Feld der Tabellen auf AUTO_INCREMENT umgestellt. Das funktioniert bei einem der Tabellen nicht. Anscheinend hast du in der Tabelle ein Feld mit AUTO_INCREMENT, das aber nicht als "PRIMARY KEY" definiert ist.
Meine Vermutung ist, dass es eine benutzerdefinierte Tabelle ist, es kann aber auch eine CONTENIDO-Tabelle sein.
Du kannst das in der Datei setup/lib/functions.sql.php in der Funktion alterTableHandling() debuggen.

Code: Alles auswählen

[11-Sep-2025 19:33:37 Europe/Berlin] PHP Fatal error:  Uncaught mysqli_sql_exception: Duplicate entry '0' for key 'PRIMARY' in .../contenido/classes/db/class.db.driver.mysqli.php:210
Stack trace:
#0 .../contenido/classes/db/class.db.driver.mysqli.php(210): mysqli_query()
#1 .../contenido/classes/db/class.db.driver.handler.php(811): cDbDriverMysqli->query()
#2 .../contenido/includes/functions.str.php(362): cDbDriverHandler->query()
#3 .../contenido/includes/include.str_overview.php(59): strRemakeTreeTable()
#4 .../contenido/main.php(216): include_once('...')
#5 {main}
  thrown in .../contenido/classes/db/class.db.driver.mysqli.php on line 210
In der Kategorieübersicht wird der Kategoriebaum validiert, siehe Datei contenido/includes/functions.str.php und Funktion strRemakeTreeTable(). Gibt es Probleme, z. B. Kategorie hat eine nicht mehr vorhandene parent-id, oder mehrere Kategorien haben die gleiche pre-id/post-id, usw., wird der Kategoriebaum neu befüllt.
Anscheinend hast du bei dir in der Tabelle con_cat_tree eine Kategorie, die es nicht gibt.
In der Funktion strRemakeTreeTable() werden alle Kategorien des Mandanten geladen, der Kategoriebaum validiert und falls dies Fehlschlägt, werden die Kategorien des Mandanten aus con_cat_tree gelöscht, dann die Tabelle neu befüllt.
Vermutlich gibt es in der con_cat_tree doch noch einen übriggebliebenen Eintrag, was dann bei einem INSERT den Fehler wirft.
Das Problem müsstest du dir genauer ansehen.

Welche Fehler werden in der strRemakeTreeTable() bei Aufruf von strCheckTreeForErrors() gefunden?
Was steht in der con_cat_tree-Tabelle, bevor die Inhalte in der Funktion strRemakeTreeTable() gelöscht werden?
Was für ein INSERT-Befehl für die con_cat_tree-Tabelle wird in der Funktion strRemakeTreeTable() erstellt?

Code: Alles auswählen

[11-Sep-2025 19:35:04 Europe/Berlin] PHP Fatal error:  Uncaught mysqli_sql_exception: Column 'idproperty' cannot be null in .../contenido/classes/db/class.db.driver.mysqli.php:210
Stack trace:
#0 .../contenido/classes/db/class.db.driver.mysqli.php(210): mysqli_query()
#1 .../contenido/classes/db/class.db.driver.handler.php(811): cDbDriverMysqli->query()
#2 .../contenido/classes/genericdb/class.item.collection.php(1294): cDbDriverHandler->query()
#3 .../contenido/classes/contenido/class.property.php(197): ItemCollection->createNewItem()
#4 .../contenido/classes/contenido/class.property.php(396): cApiPropertyCollection->create()
#5 .../contenido/classes/genericdb/class.item.php(634): cApiPropertyCollection->setValue()
#6 .../contenido/includes/include.rights_left_top.php(40): Item->setProperty()
#7 .../contenido/main.php(216): include_once('...')
#8 {main}
  thrown in .../contenido/classes/db/class.db.driver.mysqli.php on line 210
Du hast in der con_properties-Tabelle einen Eintrag, bei der das Primärschlüssel-Feld 'idproperty' den Wert null hat.

Code: Alles auswählen

....Column 'idstat' cannot be null in....
Du hast in der con_stat-Tabelle einen Eintrag, bei der das Primärschlüssel-Feld 'idstat' den Wert null hat.


Fazit:

Zusammengefasst kann ich sagen, dass die Datenbank einige korrupte Einträge in diversen Tabellen hat. Ganz früher hat CONTENIDO die Werte der Primärschlüssel-Felder in einer eigenen Sequenztabelle verwaltet. Das ist aber schon seit der ersten 4.9'er Version nicht mehr der Fall.
In CONTENIDO 4.9.0 wurden die Primärschlüssel-Felder auf AUTO_INCREMENT umgestellt. Vor CONTENIDO 4.9 war es mit der Sequenztabelle und den alten Feld-Definitionen möglich, Einträge mit Ids = null oder Einträge mit doppelten Ids anzulegen, seit 4.9 geht das nicht.

Es wäre gut, wenn du alle Tabellen auf solche Probleme hin prüfst und diese manuell korrigierst.

Code: Alles auswählen

-- Einträge mit id = null oder id = '' oder id < 1 finden
SELECT * FROM `tabelle` WHERE `id` IS NULL OR `id` = ''  OR `id` < 1;

-- Einträge mit mir id-Duplikaten finden
SELECT `id` FROM `tabelle` GROUP BY `id` HAVING COUNT(*) > 1;
Das Thema hatten wir schon mal vor Jahren bei anderen Installationen. Das CONTENIDO-Setup geht davon aus, dass die Tabellen-Inhalte korrekt sind, und prüft diese vorher nicht.
Dieses Problem ist bisher ein paar Mal aufgetaucht und betrifft manche Installationen, die noch vor CONTENIDO 4.9 existiert haben.
Es ist nicht klar, wie das mit den Fehlern möglich ist, vermutlich eine Mischung aus, nicht strikten Tabellendefinitionen, der früheren Sequenztabelle Lösung, die eventuell nicht in allen Fällen 100% wie gewünscht gearbeitet hat, eventuell Modulen/Plugins, die beim Anlegen der Datensätze nicht korrekt vorgegangen sind, oder gar Benutzern, die die Datensätze manuell mit falschen Werten angelegt haben.

Gruß
xmurrix

Re: Probleme nach Update von 4.9.12 auf aktuelle 4.10-dev

Verfasst: Fr 12. Sep 2025, 11:36
von lunsen_de
Hallo Frank,

das mit den Nullen habe ich mir auch schon gedacht. Ich habe dazu auch einiges im Forum gelesen.

Ich habe auch nochmal eine Neuinstallation und eine Updateinstallation gemacht und dann die Datenbankstrukturen verglichen.

Ich habe mit jetzt mal die Datenbankeinträge der 4.9.12 Version angeschaut. Es gibt keine IDs mit Primery Key = 0 (kann man schonmal festhalten).
Bei den fast allen Einträgen steht in der Struktur bei dem PrimeryKey Eintrag bei Standard "kein(e)" und bei Extra "AUTO_INCREMENT".

Jetzt zu dem was beim Update passiert. Beim Update wird bei fast allen Tabellenstrukturen beim PrimeryKey Eintrag bei Standard eine "0" eingefügt un das "AUTO_INCREMENT" verschwindet, ist jetzt leer. Das apssiert nur beim Update!
Bei einer Neuinstallation sind die Strukturen korrekt, also mit "kein(e)" und "AUTO_INCREMENT". Ich habe alle Tabellen verglichen und mir sogar die Arbeit gemacht nach dem Update alle in phpmyadmin wieder so einzustellen, wie es bei der Neuinstallation ist. Dann nochmal ein Update und fast alle Strukturen sind wieder geändert.

Hier schein doch etwas in der Updateroutine nicht zu stimmen oder? Das Update läuft auch nicht komplett durch und es wird keine config.php generiert (gespeichert/heruntergeladen).

Ich habe mal im Anhang 3 Screenshot von einer Beispieltabelle aller 3 Datenbankzustände gemacht (davor 4.9.12, nach Update auf 4.10 und die Neuinstalltion)

In der Errorlog steht dann:

Code: Alles auswählen

[12-Sep-2025 12:07:00 Europe/Berlin] PHP Fatal error:  Uncaught mysqli_sql_exception: Incorrect table definition; there can be only one auto column and it must be defined as a key in /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php:210
Stack trace:
#0 /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php(210): mysqli_query()
#1 /var/www/vhosts/domain/contenido/classes/db/class.db.driver.handler.php(811): cDbDriverMysqli->query()
#2 /var/www/vhosts/domain/setup/lib/functions.sql.php(276): cDbDriverHandler->query()
#3 /var/www/vhosts/domain/setup/lib/functions.sql.php(98): alterTableHandling()
#4 /var/www/vhosts/domain/setup/upgrade_jobs/class.upgrade.job.main.php(66): addAutoIncrementToTables()
#5 /var/www/vhosts/domain/setup/upgrade_jobs/class.upgrade.job.main.php(33): cUpgradeJobMain->_executeInitialJobs()
#6 /var/www/vhosts/domain/setup/lib/include.db.controller.php(130): cUpgradeJobMain->_execute()
#7 /var/www/vhosts/domain/setup/index.php(31): include('...')
#8 {main}
  thrown in /var/www/vhosts/domain/contenido/classes/db/class.db.driver.mysqli.php on line 210
Grüße Lars

Re: Probleme nach Update von 4.9.12 auf aktuelle 4.10-dev

Verfasst: Fr 12. Sep 2025, 12:08
von lunsen_de
Hallo xmurrix,

die Hinweise waren Gold wert. Ich habe noch mal in der Startdatenbank gesucht und eine Tabelle gefunden bei der gleich 3 Spalten als Primärschlüssel gesetzt waren. AUTO_INCREMENT nur in der ersten Spalte, aber nachdem ich die Tabelle mal weggelassen habe lief das Update durch. Vorher wurden scheinbar ab dieser Tabelle alle AUTO_INCREMENT entfernt und in der Struktur die 0 eingefügt.

Ich teste jetzt mal weiter.

Danke und Grüße Lars