Extra Form
PHP PHP 7.4
CMS Rhymix 2.1

1. 현재 환경

rhymix_version : 2.1.18
php : 7.4.33 (64-bit)
server : nginx/1.18.0
baseurl : https://naseller.com/

[System Settings]
db.type : mysql (innodb, utf8mb4)
db.version : 8.0.39-0ubuntu0.22.04.1

 

2. 최근 라이믹스를 신규로 설치해서 사이트를 만드는 중에 있습니다.

로그인 상태에서는 문제가 없지만 로그 아웃 후 사이트 진입을 시도하면 에러가 발생하는 문제로 에러로그를 살펴 보니 로그인인 안되는 문제와 연관이 있을지 모르지만 포인트 히스토리에서 아래와 같은 쿼리 에러 메지지를 발견했습니다.

 

포인트 히스토리 모듈 ( https://xetown.com/download/22508 )  new Object를 new BaseObject 변경 상태이고 운영중인 다른 사이트 php7.2에서는 정상 사용중인 모듈입니다. 

 

3. 포인트히스토리 에러 로그

 

05. Query Error: SQLSTATE[42000]: Syntax error or access violation: 1140 In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'nasellerdb.pointhistory_status.point'; this is incompatible with sql_mode=only_full_group_by (code -1)
06. Notice: Trying to get property 'count' of non-object
    - modules/pointhistory/pointhistory.controller.php line 174
    - modules/pointhistory/pointhistory.controller.php line 106
    - modules/pointhistory/pointhistory.controller.php line 27
    - classes/module/ModuleHandler.class.php line 1336
    - classes/module/ModuleHandler.class.php line 307
    - index.php line 60
07. Query Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'rx_pointhistory_status.PRIMARY' (code -1)
08. Query Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '20241018' for key 'rx_pointhistory_status.PRIMARY' (code -1)

 

4.  쳇 gpt 에 해당 에러에 대해서 아래와 같은 답변을 받았습니다.

 

구체적으로 에러 메시지를 분석해보면:

Duplicate entry '0' for key 'rx_pointhistory_status.PRIMARY': 이 오류는 rx_pointhistory_status 테이블의 기본 키가 '0'인 레코드가 이미 존재하는데, 또 다시 '0'을 삽입하려고 시도했을 때 발생합니다. 일반적으로 기본 키는 유일해야 하므로, 동일한 값이 두 번 들어갈 수 없습니다.

Duplicate entry '20241018' for key 'rx_pointhistory_status.PRIMARY': 이 오류는 20241018이라는 값이 기본 키로 설정된 상태에서 또다시 동일한 값을 삽입하려고 시도했음을 나타냅니다.

 

동일 포인트 히스토리 모듈을 단지 php 버젼만 다른 7.2에서 정상 사용중인데 혹시 원인이 무엇일지 도움 부탁드립니다.

 

 

  • ? Lv7
    로그인이 안되는 문제는 해당 히스토리 모듈 디비 삭제 후에도 로그인이 안되는 증상이 계속되는걸로 보아 연관이 없는 없는것 같습니다.
  • Lv36

    첫 번째 오류는 쿼리 구조상의 문제입니다. GROUP BY나 aggregate function을 사용하는 쿼리에서는 1) GROUP BY에 언급된 컬럼, 2) aggregate function을 사용하여 하나의 값으로 정리한 컬럼, 이렇게 2가지만 SELECT할 수 있습니다. 그 밖의 컬럼은 여러 개의 값이 존재할 수 있기 때문에, 어느 것을 가져올지 판단할 수 없기 때문입니다.

     

    예를 들어 아래의 쿼리는 괜찮고,

    SELECT order_id, user_id, SUM(price) FROM orders GROUP BY order_id, user_id;

     

    아래의 쿼리는 안됩니다. *에는 order_id 외에도 여러 컬럼이 포함되어 있기 때문입니다.

    SELECT * FROM orders GROUP BY order_id;
     

    이런 종류의 쿼리는 SELECT DISTINCT로 바꾸거나 서브쿼리를 사용해야 하는데, XE는 SELECT DISTINCT를 지원하지 않았기 때문에 많은 자료들이 무리하게 GROUP BY를 사용해 왔지요.

     

    MySQL 구 버전에서는 대충 쿼리를 써도 대충 아무거나 반환하곤 했는데, DB가 "대충 아무거나" 반환한다는 것은 말도 안 되기 때문에;;; 최근에는 금지하는 추세입니다. 여전히 되는 서버가 있다면 MySQL 구 버전이거나, sql_mode 설정으로 구 버전처럼 대충 아무거나 반환하도록 만들어 놓았을 가능성이 높습니다.

     

    그 밖에도 예전에 만들어진 자료들 중 MySQL 8.0 순정 상태에서 사용하면 의외로 오류를 일으키는 것이 많습니다. 쿼리 오류는 눈치채지도 못하고 넘어가는 사람이 대부분이기 때문에, PHP 8.0 오류만큼 시끄럽지 않을 뿐... 대략 2020년 (라이믹스가 DISTINCT를 지원하기 시작한 시점) 이전에 만들어진 자료로서 어떤 통계를 저장하거나 추출하는 기능이 있다면 매우 높은 확률로 GROUP BY 문제에 걸립니다.

  • Lv36 ? Lv7
    네 말씀 하신 것처럼 포인트 히스토리 모듈이 에러가 발생하지 않는 곳은 mysql 구 버젼입니다.
    답변 감사드립니다.