SuiteCRM icon indicating copy to clipboard operation
SuiteCRM copied to clipboard

BUG: JSON API v1 - error when filtering by custom fields

Open re8260 opened this issue 1 year ago • 2 comments

Issue

SQL error when fetching beans by JSON v1 API with filter on custom filed because in count query there is no join for '*_cstm' table. Without filter on custom fields no error.

Issue effect on pagination, without pagination only error messages are printed in logs. image

Expected Behavior

No error expected

Actual Behavior

PHP Error log:

Notice:  Trying to access array offset on value of type bool in /www/public/Api/V8/BeanDecorator/BeanManager.php on line 268
Stack trace:
   1. {main}() /www/public/Api/index.php:0
   2. Slim\\App->run() /www/public/Api/index.php:4
   3. Slim\\App->process() /www/public/vendor/slim/slim/Slim/App.php:297
   4. Slim\\App->callMiddlewareStack() /www/public/vendor/slim/slim/Slim/App.php:392
   5. Slim\\App->__invoke() /www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:117
   6. Slim\\Route->run() /www/public/vendor/slim/slim/Slim/App.php:503
   7. Slim\\Route->callMiddlewareStack() /www/public/vendor/slim/slim/Slim/Route.php:268
   8. Slim\\Route->Slim\\{closure:/www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:63-78}() /www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:117
   9. call_user_func:{/www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70}() /www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70
  10. Slim\\DeferredCallable->__invoke() /www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70
  11. call_user_func_array:{/www/public/vendor/slim/slim/Slim/DeferredCallable.php:57}() /www/public/vendor/slim/slim/Slim/DeferredCallable.php:57
  12. League\\OAuth2\\Server\\Middleware\\ResourceServerMiddleware->__invoke() /www/public/vendor/slim/slim/Slim/DeferredCallable.php:57
  13. Slim\\Route->Slim\\{closure:/www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:63-78}() /www/public/vendor/league/oauth2-server/src/Middleware/ResourceServerMiddleware.php:53
  14. call_user_func:{/www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70}() /www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70
  15. Slim\\DeferredCallable->__invoke() /www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70
  16. call_user_func_array:{/www/public/vendor/slim/slim/Slim/DeferredCallable.php:57}() /www/public/vendor/slim/slim/Slim/DeferredCallable.php:57
  17. Api\\V8\\Middleware\\SetLanguageMiddleware->__invoke() /www/public/vendor/slim/slim/Slim/DeferredCallable.php:57
  18. Slim\\Route->Slim\\{closure:/www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:63-78}() /www/public/custom/application/Ext/Api/V8/Middleware/SetLanguageMiddleware.php:32
  19. call_user_func:{/www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70}() /www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70
  20. Slim\\DeferredCallable->__invoke() /www/public/vendor/slim/slim/Slim/MiddlewareAwareTrait.php:70
  21. call_user_func_array:{/www/public/vendor/slim/slim/Slim/DeferredCallable.php:57}() /www/public/vendor/slim/slim/Slim/DeferredCallable.php:57
  22. Slim\\Container->Api\\V8\\Factory\\{closure:/www/public/Api/V8/Factory/ParamsMiddlewareFactory.php:34-38}() /www/public/vendor/slim/slim/Slim/DeferredCallable.php:57
  23. Api\\V8\\Middleware\\ParamsMiddleware->__invoke() /www/public/Api/V8/Factory/ParamsMiddlewareFactory.php:37
  24. Slim\\Route->__invoke() /www/public/Api/V8/Middleware/ParamsMiddleware.php:67
  25. Api\\V8\\Controller\\InvocationStrategy\\SuiteInvocationStrategy->__invoke() /www/public/vendor/slim/slim/Slim/Route.php:281
  26. Api\\V8\\Controller\\ModuleController->getModuleRecords() /www/public/Api/V8/Controller/InvocationStrategy/SuiteInvocationStrategy.php:28
  27. Api\\V8\\Service\\ModuleService->getRecords() /www/public/Api/V8/Controller/ModuleController.php:58
  28. Api\\V8\\BeanDecorator\\BeanManager->countRecords() /www/public/Api/V8/Service/ModuleService.php:121

SuiteCRM Error log:

[FATAL] Mysqli_query failed.
[FATAL]  Query Failed: SELECT COUNT(*) AS cnt FROM accounts  WHERE (accounts_cstm.test_c = 'Test' AND accounts.phone_office = '') AND accounts.deleted = '0': MySQL error 1054: Unknown column 'accounts_cstm.test_c' in 'where clause'

Possible Fix

MR: https://github.com/salesagility/SuiteCRM/pull/10320

Steps to Reproduce

  1. Add custom field to any module (I will use Account for example), for example test_c of any types
  2. do get Accounts API request GET:{{crm_hostname}}/Api/V8/module/Accounts?filter[test_c][eq]=Test
  3. Check Apache error log and SuiteCRM log

Context

image

Your Environment

  • SuiteCRM Version used: 7.12.x - 7.14.x
  • Browser name and version (e.g. Chrome Version 51.0.2704.63 (64-bit)): Chrome 120.x
  • Environment name and version (e.g. MySQL, PHP 7): PHP 7.4 - 8
  • Operating System and version (e.g Ubuntu 16.04): Ubuntu 20.04

re8260 avatar Jan 18 '24 17:01 re8260

(side note: SuiteCRM 7.14.x doesn't officially support PHP 7.4)

https://docs.suitecrm.com/admin/compatibility-matrix/

elipp avatar Jan 19 '24 13:01 elipp

Thanks @elipp I updated the details, bug not related to PHP\CRM version

re8260 avatar Jan 21 '24 09:01 re8260