PHP 8 upgrade problem

Describe the issue or problem
We recently changed OS for the server and hence also the PHP version from 7.3.18 to 8.0.30.
We encountered some problems for submissions earlier imported via Native XML plugin. some problems were solved by adding missing locale information to the affiliaition field accoring to:
Ojs upgrade fails on php8? - Software Support - PKP Community Forum (sfu.ca)
But in another journal this query in MariaDB did not show any line with this error. The server gives a 500 error when trying to show the issue page. When accessing the submissions table (logeed in) we could find there is an “unexpected error” with one of the submissions in that issue.
image

How can I in the database find out which value that is causing the error?
I have tried with

select * from publication_settings where publication_id=386;

but it does not look different to other publications.
abstract, copyrightholder and title has a locale value.

What application are you using?
Now running OJS 3.3.0-16, recently updated from 3.3.0-13

Additional information
PHP log when trying to access the submission in the submissions table:

[19-Feb-2024 14:10:04 Europe/Stockholm] Slim Application Error:
Type: TypeError
Message: Cannot access offset of type string on string
File: /var/www/html/ecp/lib/pkp/classes/core/DataObject.inc.php
Line: 133
Trace: #0 /var/www/html/ecp/lib/pkp/classes/db/SchemaDAO.inc.php(249): DataObject->setData()
#1 /var/www/html/ecp/lib/pkp/classes/submission/PKPAuthorDAO.inc.php(134): SchemaDAO->_fromRow()
#2 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(99): PKPAuthorDAO->_fromRow()
#3 /var/www/html/ecp/lib/pkp/classes/db/DAOResultIterator.inc.php(33): DAOResultFactory->next()
#4 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(181): DAOResultIterator->__construct()
#5 /var/www/html/ecp/lib/pkp/classes/services/PKPAuthorService.inc.php(69): DAOResultFactory->toIterator()
#6 /var/www/html/ecp/lib/pkp/classes/publication/PKPPublicationDAO.inc.php(62): PKP\Services\PKPAuthorService->getMany()
#7 /var/www/html/ecp/classes/publication/PublicationDAO.inc.php(39): PKPPublicationDAO->_fromRow()
#8 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(99): PublicationDAO->_fromRow()
#9 /var/www/html/ecp/lib/pkp/classes/db/DAOResultIterator.inc.php(33): DAOResultFactory->next()
#10 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(181): DAOResultIterator->__construct()
#11 /var/www/html/ecp/lib/pkp/classes/services/PKPPublicationService.inc.php(80): DAOResultFactory->toIterator()
#12 /var/www/html/ecp/lib/pkp/classes/submission/PKPSubmissionDAO.inc.php(93): PKP\Services\PKPPublicationService->getMany()
#13 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(99): PKPSubmissionDAO->_fromRow()
#14 /var/www/html/ecp/lib/pkp/classes/db/DAOResultIterator.inc.php(33): DAOResultFactory->next()
#15 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(181): DAOResultIterator->__construct()
#16 /var/www/html/ecp/lib/pkp/classes/services/PKPSubmissionService.inc.php(108): DAOResultFactory->toIterator()
#17 /var/www/html/ecp/lib/pkp/api/v1/_submissions/PKPBackendSubmissionsHandler.inc.php(152): PKP\Services\PKPSubmissionService->getMany()
#18 [internal function]: PKPBackendSubmissionsHandler->getMany()
#19 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php(40): call_user_func()
#20 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/Route.php(281): Slim\Handlers\Strategies\RequestResponse->__invoke()
#21 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\Route->__invoke()
#22 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/Route.php(268): Slim\Route->callMiddlewareStack()
#23 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/App.php(503): Slim\Route->run()
#24 /var/www/html/ecp/lib/pkp/classes/security/authorization/internal/ApiAuthorizationMiddleware.inc.php(77): Slim\App->__invoke()
#25 [internal function]: ApiAuthorizationMiddleware->__invoke()
#26 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#27 [internal function]: Slim\DeferredCallable->__invoke()
#28 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#29 /var/www/html/ecp/lib/pkp/classes/security/authorization/internal/ApiCsrfMiddleware.inc.php(46): Slim\App->Slim\{closure}()
#30 [internal function]: ApiCsrfMiddleware->__invoke()
#31 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#32 [internal function]: Slim\DeferredCallable->__invoke()
#33 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#34 /var/www/html/ecp/lib/pkp/classes/security/authorization/internal/ApiTokenDecodingMiddleware.inc.php(131): Slim\App->Slim\{closure}()
#35 [internal function]: ApiTokenDecodingMiddleware->__invoke()
#36 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#37 [internal function]: Slim\DeferredCallable->__invoke()
#38 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#39 /var/www/html/ecp/lib/pkp/classes/handler/APIHandler.inc.php(68): Slim\App->Slim\{closure}()
#40 [internal function]: APIHandler->{closure}()
#41 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#42 [internal function]: Slim\DeferredCallable->__invoke()
#43 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#44 /var/www/html/ecp/lib/pkp/classes/handler/APIHandler.inc.php(127): Slim\App->Slim\{closure}()
#45 [internal function]: APIHandler->{closure}()
#46 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#47 [internal function]: Slim\DeferredCallable->__invoke()
#48 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#49 /var/www/html/ecp/lib/pkp/classes/handler/APIHandler.inc.php(132): Slim\App->Slim\{closure}()
#50 [internal function]: APIHandler->{closure}()
#51 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#52 [internal function]: Slim\DeferredCallable->__invoke()
#53 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#54 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\App->Slim\{closure}()
#55 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/App.php(392): Slim\App->callMiddlewareStack()
#56 /var/www/html/ecp/lib/pkp/classes/handler/APIHandler.inc.php(124): Slim\App->process()
#57 [internal function]: APIHandler->{closure}()
#58 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#59 [internal function]: Slim\DeferredCallable->__invoke()
#60 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#61 /var/www/html/ecp/lib/pkp/classes/handler/APIHandler.inc.php(132): Slim\App->Slim\{closure}()
#62 [internal function]: APIHandler->{closure}()
#63 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/DeferredCallable.php(57): call_user_func_array()
#64 [internal function]: Slim\DeferredCallable->__invoke()
#65 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(70): call_user_func()
#66 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(117): Slim\App->Slim\{closure}()
#67 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/App.php(392): Slim\App->callMiddlewareStack()
#68 /var/www/html/ecp/lib/pkp/lib/vendor/slim/slim/Slim/App.php(297): Slim\App->process()
#69 /var/www/html/ecp/lib/pkp/classes/core/APIRouter.inc.php(115): Slim\App->run()
#70 /var/www/html/ecp/lib/pkp/classes/core/Dispatcher.inc.php(144): APIRouter->route()
#71 /var/www/html/ecp/lib/pkp/classes/core/PKPApplication.inc.php(360): Dispatcher->dispatch()
#72 /var/www/html/ecp/index.php(68): PKPApplication->execute()
#73 {main}
View in rendered output by enabling the "displayErrorDetails" setting.

I cannot even remove the submission:

# php deleteSubmissions.php 386
PHP Fatal error:  Uncaught TypeError: Cannot access offset of type string on string in /var/www/html/ecp/lib/pkp/classes/core/DataObject.inc.php:133
Stack trace:
#0 /var/www/html/ecp/lib/pkp/classes/db/SchemaDAO.inc.php(249): DataObject->setData()
#1 /var/www/html/ecp/lib/pkp/classes/submission/PKPAuthorDAO.inc.php(134): SchemaDAO->_fromRow()
#2 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(99): PKPAuthorDAO->_fromRow()
#3 /var/www/html/ecp/lib/pkp/classes/db/DAOResultIterator.inc.php(33): DAOResultFactory->next()
#4 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(181): DAOResultIterator->__construct()
#5 /var/www/html/ecp/lib/pkp/classes/services/PKPAuthorService.inc.php(69): DAOResultFactory->toIterator()
#6 /var/www/html/ecp/lib/pkp/classes/publication/PKPPublicationDAO.inc.php(62): PKP\Services\PKPAuthorService->getMany()
#7 /var/www/html/ecp/classes/publication/PublicationDAO.inc.php(39): PKPPublicationDAO->_fromRow()
#8 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(99): PublicationDAO->_fromRow()
#9 /var/www/html/ecp/lib/pkp/classes/db/DAOResultIterator.inc.php(33): DAOResultFactory->next()
#10 /var/www/html/ecp/lib/pkp/classes/db/DAOResultFactory.inc.php(181): DAOResultIterator->__construct()
#11 /var/www/html/ecp/lib/pkp/classes/services/PKPPublicationService.inc.php(80): DAOResultFactory->toIterator()
#12 /var/www/html/ecp/lib/pkp/classes/submission/PKPSubmissionDAO.inc.php(93): PKP\Services\PKPPublicationService->getMany()
#13 /var/www/html/ecp/lib/pkp/classes/db/SchemaDAO.inc.php(55): PKPSubmissionDAO->_fromRow()
#14 /var/www/html/ecp/tools/deleteSubmissions.php(51): SchemaDAO->getById()
#15 /var/www/html/ecp/tools/deleteSubmissions.php(62): SubmissionDeletionTool->execute()
#16 {main}
  thrown in /var/www/html/ecp/lib/pkp/classes/core/DataObject.inc.php on line 133

Does anyone have any idea how I can solve this?

@asmecher, you use to find good solutions!

//@eddoff

Solved it myself

There was two rows of “affilation” in author_settings table.

MariaDB [ojs_ecp]> select * from author_settings where author_id = 1183 and locale = 0;
+-----------+--------+---------------------+---------------+
| author_id | locale | setting_name        | setting_value |
+-----------+--------+---------------------+---------------+
|      1183 |        | country             | FI            |
|      1183 |        | orcid               |               |
|      1183 |        | url                 |               |
|      1183 | 0      | affiliation         |               |
|      1183 | en_US  | affiliation         |               |
|      1183 | en_US  | biography           |               |
|      1183 | en_US  | familyName          | Name1         |
|      1183 | en_US  | givenName           | Name2         |
|      1183 | en_US  | preferredPublicName |               |
+-----------+--------+---------------------+---------------+

This query should show if there are any more such rows:’
SELECT * FROM author_settings WHERE setting_name = 'affiliation' AND locale = '0' AND author_id IN ( SELECT author_id FROM author_settings WHERE setting_name = 'affiliation' GROUP BY author_id HAVING COUNT(*) > 1 );

I solved it by changing the zero-string of locale to sv_SE.

UPDATE author_settings SET locale = 'sv_SE' where author_id = 1183 and locale = '0';

A question to the developers (ping @asmecher )
I found that many of our XML-imported articles had a ‘0’ in the locale field in this table. That does not seem to be a problem right now, but could it be a problem in the future? Should I change those zeros to en_US in the database?