등업(그룹) 관리 모듈은 오래된 XE(라이믹스) 모듈로 숭숭군님이 개발, 이후로 BJ람보님이 이어받아 개발하고 있는 모듈입니다.

https://github.com/bjrambo/gradeup

하지만 개발이 중단된지 8년 정도 되어 현재 사용하기엔 무리가 있는 써드파티 자료입니다.

현재 다양한 오류들이 발견되어 수정하는 중이긴 합니다-_-;


현재 작업 중인 문제점.

### e9. 로컬호스트에서만 회원추가가 안됨

[08-Jun-2023 11:11:03 Etc/GMT-9] Query Error: SQLSTATE[HY000]: General error: 1364 Field 'new_group_srl' doesn't have a default value (code -1) in /Users/eond/PhpstormProjects/rx/modules/gradeup/gradeup.admin.controller.php on line 144
#0 /Users/eond/PhpstormProjects/rx/classes/module/ModuleObject.class.php(686): gradeupAdminController->procGradeupAdminTermGroupAdd()


이 인용문은 ChatGPT의 답변입니다. 아래에서 나타나는 인용문은 모두 ChatGPT의 답변입니다. (따로 표시하지 않겠지만 참조해주세요. )

이 오류 메시지는 데이터베이스 쿼리 실행 시에 발생한 문제를 나타냅니다. 


특히, MySQL 데이터베이스의 `General error: 1364 Field 'new_group_srl' doesn't have a default value` 오류는 'new_group_srl'이라는 필드에 대한 값이 제공되지 않았고, 이 필드에 기본값이 설정되어 있지 않다는 것을 나타냅니다.


이 오류가 발생하는 경우는 주로 두 가지입니다:


1. `INSERT` 쿼리를 실행할 때, 'new_group_srl' 필드에 대한 값이 제공되지 않았고, 이 필드는 NULL을 허용하지 않거나 기본값이 설정되어 있지 않습니다.

2. 데이터베이스 스키마를 변경하면서 'new_group_srl' 필드를 NOT NULL로 설정하였지만, 기본값을 설정하지 않았습니다.


이 문제를 해결하려면 다음 중 하나의 방법을 사용할 수 있습니다:


1. `INSERT` 쿼리를 수정하여 'new_group_srl' 필드에 대한 값을 제공합니다. 

2. 데이터베이스에서 'new_group_srl' 필드의 기본값을 설정합니다. 이렇게 하면, 이 필드에 대한 값이 제공되지 않는 경우에도 데이터베이스에서 자동으로 기본값을 사용할 수 있습니다.


오류 메시지에 따르면 이 오류는 `gradeupAdminController->procGradeupAdminTermGroupAdd()` 메서드에서 발생하였으므로, 이 메서드를 검토하여 'new_group_srl' 필드에 대한 값을 제공하는지 확인하면 좋을 것 같습니다.


dispGradeupAdminTermGroupAdd
modules/gradeup/tpl/term_group_add.html

회원추가는 위 페이지에서 하게 됩니다.

procGradeupAdminTermGroupAdd 

위 act를 실행하는데,

modules/gradeup/gradeup.admin.controller.php

function procGradeupAdminTermGroupAdd()

이 함수에서 실행을 합니다.

modules/gradeup/queries/insertGradeUpTermGroup.xml

저 함수에서는 이 쿼리문을 실행합니다.

<query id="insertGradeUpTermGroup" action="insert">
   <tables>
      <table name="gradeup_term_group" />
   </tables>
   <columns>
      <column name="log_srl" var="log_srl" />
      <column name="member_srl" var="member_srl" />
      <column name="old_group_srl" var="old_group_srl" />
      <column name="new_group_srl" var="new_group_srl" />
      <column name="add_group_srl" var="add_group_srl" />
      <column name="gradeup_add_type" var="gradeup_add_type" />
      <column name="regdate" var="regdate" />
      <column name="remain_date" var="remain_date" />
   </columns>
</query>

역으로 이제 살펴보도록 하겠습니다.

쿼리문에서 살펴보면 new_group_srl 항목이 존재합니다. 그런데 이 쿼리문에서는 해당 컬럼 값이 notnull 이라는 속성은 안 보입니다.


`notnull="notnull"`이라는 속성은 해당 필드가 NULL 값을 허용하지 않음을 나타냅니다. 즉, 해당 필드에는 반드시 값이 설정되어야 하며, NULL 값은 허용되지 않습니다.


따라서 이 경우, `new_group_srl`이라는 필드는 NULL 값을 허용하지 않는다는 것을 의미합니다. 이 필드에 데이터를 입력할 때 값이 제공되지 않으면 데이터베이스 오류가 발생합니다.


이전에 받은 오류 메시지(`General error: 1364 Field 'new_group_srl' doesn't have a default value`)는 이 필드에 기본값이 설정되지 않았으며, `INSERT` 쿼리 실행 시 이 필드에 값이 제공되지 않아 발생한 것으로 보입니다. 이 필드에 값을 제공하거나 기본값을 설정하여 이 오류를 해결할 수 있습니다.


이 함수 자체는 문제가 없다는 뜻이 되겠죠....

gradeup.admin.controller.php에서 procGradeupAdminTermGroupAdd 함수를 살펴보더라도 해당 값에 대한 변수 항목은 보이지 않습니다. 그럼 이 부분은 상관이 없다는 뜻이겠죠.

//변수설정
$args = new stdClass();
$args->member_srl = $obj->member_srl;
$args->add_group_srl = $obj->group_srl;
$args->gradeup_add_type = $obj->gradeup_add_type;
$args->regdate = $obj->regdate.$obj->regdate_h.$obj->regdate_i.$obj->regdate_s;
$args->remain_date = $obj->remain_date.$obj->remain_date_h.$obj->remain_date_i.$obj->remain_date_s;
$args->old_group_srl = $oGradeupModel->getMemberGroupSrl($obj->member_srl);

$obj->group_srl 이 부분은 add_group_srl 컬럼값이 되고,

new_group_srl을 담당하는 부분이 안보입니다.


실제 동작하는 실서버에서 new_group_srl이 뭔지, add_group_srl이 뭔지 확인해보도록 하겠습니다.

이 모듈에서 관련된 테이블은 이렇게 3개로 확인됩니다. 

new_group_srl은 빈값으로 올라가있습니다. 값 자체가 넘어가지 않아도 정상적으로 동작이 된다는 뜻이 됩니다.


그런데 로컬호스트에서는 해당 테이블에 등록조차 되지 않았다는 거죠..-.-?;

그럼에도 불구하고 등록조차 안되었다면 처음 스키마에서 null 값을 허용해줘야하는데 이 부분이 적용이 안되서 그럴 수 있겠습니다.

처음 설치하는 사용자를 위해 스키마에도 null값을 허용해주는 코드를 추가해주고,

기존 사용자는 phpmyadmin 등에서 아래 쿼리 명령어를 실행해주세요.

ALTER TABLE `rx_gradeup_term_group`
MODIFY new_group_srl varchar(128) DEFAULT NULL;

이제 rx_gradeup_term_group 테이블에서 new_group_srl 컬럼값은 null 이 허용이 됩니다. 빈값으로 넘어와도 등록이 될겁니다.

(코드가 동일한데 왜 로컬호스트는 안되고, 실사용 사이트는 됐는지 모르겠지만, 추측하기론 아마 오래 전에 설치할 때는 해당 값이 null로 스키마가 등록되도록 된게 아닐까 싶기도 한데, 실제 디비 테이블 구조를 보면 그것도 아니라서 잘 모르겠습니다-.-;;)


이제 정상적으로 등록이 됩니다.


그 밖에 작업한 수정내용

- new Object 를 new BaseObject로 수정함
- function gradeupModel::getMemberInfo() 오류 수정
- function gradeupModel::gradeUp() 오류 수정
 
댓글은 로그인 사용자만 작성 가능합니다. 로그인하기