php 5.3.x 에서 php 7.4.x 업그레이드 후 그누보드5 DB insert 오류 문의드립니다.
본문
서버를 이전하고 데이터 및 DB복제 및 db설정 변경도 완료하였습니다.
또한 기존에 php 5 버전에서 php 7 로 업그레이드 되면서
mysql -> mysqli 문법 변환에 해당되는
split -> explode 로 모두 변경하였습니다.
하지만 회원가입,글쓰기 등 insert 부분에 해당되는 페이지에서 DB insert error가 나옵니다.
오류 분석결과,
수정없이 DB insert 가 가능한 페이지 구성은 아래와 같습니다.
mysql_query("INSERT INTO $LMS[callcenter_table] SET
call_id = '$call_id'
,call_pw = '$passwd'
,call_name = '$call_name'
,record_type = 'S'
",$LINK) or die(alert_msg("DB Insert Error"));
해당 DB 테이블의 속성은 이렇습니다.
Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| call_id | varchar(20) | NO | PRI | NULL | |
| call_pw | varchar(20) | NO | | | |
| call_name | varchar(30) | NO | | | |
| record_type | enum('S','C') | YES | | S | |
| del_yn_call | enum('Y','N') | NO | | N
-------------------------------------------------------------------------------------------
수정을 하여 적용한 DB insert 페이지는 아래와 같습니다.
mysql_query("INSERT INTO $LMS[admin_table] SET
user_id = '$user_id'
,user_pass = '$passwd'
,user_level = '$user_level'
,user_status = '$user_status'
,name = '$name'
,tel = '$mobile' // php 5 에서는 없었던 구문을 추가 후 정상적으로 DB insert 가 되었습니다.
,mobile = '$mobile'
,email = '$email'
,regdate = now()
",$LINK) or die(alert_msg("DB Insert Error"));
tel 칼럼에서 Null 값이 NO로 되어 있고 default 값이 없으므로 insert 값을 추가하고 난 뒤에
정상적으로 DB insert 가 되었습니다.
해당 DB 테이블의 속성은 이렇습니다.
+-------------+-------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------------+------+-----+---------------------+----------------+
| uid | int(6) unsigned | NO | PRI | NULL | auto_increment |
| user_id | varchar(20) | NO | | | |
| user_pass | varchar(20) | NO | | | |
| user_level | enum('1','2','3') | NO | | 3 | |
| user_status | enum('1','2') | NO | | 1 | |
| name | varchar(20) | NO | | | |
| tel | varchar(20) | NO | | | |
| mobile | varchar(20) | NO | | | |
| email | varchar(20) | NO | | | |
| del_yn | enum('Y','N') | NO | | N | |
| regdate | datetime | NO | | 0000-00-00 00:00:00 | |
+-------------+-------------------+------+-----+---------------------+----------------+
하지만 위 사항에 맞게 DB 칼럼 속성에 비교하여
여러차례 수정해도 계속 에러가 나는 페이지가 있습니다.
mysql_query("INSERT INTO $LMS[tutor_table] SET
call_id = '$call_id'
,tu_type = '$tu_type'
,course_id = '$course_id'
,tg_id = '$tg_id'
,tu_id = '$tu_id'
,tu_pw = '$passwd'
,tu_name = '$tu_name'
,sex = '$sex'
,tu_character = '$ir1'
,profile = '$ir2'
,tu_intro = '$ir3'
,tu_status = '$tu_status'
,tu_regdate = now()
,tu_pic = '$tu_pic'
,tu_banner = '$tu_banner'
,home_yn = '$home_yn'
,tu_tel = '$tu_tel'
,tu_email = '$tu_email'
,main_pic = '$main_pic'
,main_mentor1 = '$main_mentor1'
,main_mentor2 = '$main_mentor2'
,tu_ord = '$tu_ord'
,pic1 = '$pic1'
,pic2 = '$pic2'
,pic3 = '$pic3'
,pic4 = '$pic4'
,main_txt = '$main_txt'
,main_txt2 = '$main_txt2'
,main_txt3 = '$main_txt3'
",$LINK) or die(alert_msg("DB Insert Error"));
위 부분에서 테이블 속성에 따라 추가한 구문은 아래와 같습니다.
mysql_query("INSERT INTO $LMS[tutor_table] SET
call_id = '$call_id'
,tu_type = '$tu_type'
,course_id = '$course_id'
,tg_id = '$tg_id'
,tu_id = '$tu_id'
,tu_pw = '$passwd'
,tu_name = '$tu_name'
,sex = '$sex'
,tu_character = '$ir1'
,profile = '$ir2'
,tu_intro = '$ir3'
,tu_status = '$tu_status'
,tu_regdate = now()
,tu_lastdate = now()
,del_yn_tu = 'N'
,tu_pic = '$tu_pic'
,tu_banner = '$tu_banner'
,home_yn = '$home_yn'
,tu_tel = '$tu_tel'
,tu_email = '$tu_email'
,main_pic = '$main_pic'
,main_mentor1 = '$main_mentor1'
,main_mentor2 = '$main_mentor2'
,tu_ord = '$tu_ord'
,pic1 = '$pic1'
,pic2 = '$pic2'
,pic3 = '$pic3'
,pic4 = '$pic4'
,new_yn = 'N'
,main_txt = '$main_txt'
,main_txt2 = '$main_txt2'
,main_txt3 = '$main_txt3'
,cnt_vod = '0'
,cnt_live = '0'
,cnt_sm = '0'
,npic1 = 'a'
,npic2 = 'a'
,npic3 = 'a'
,npic4 = 'a'
,npic5 = 'a'
,npic6 = 'a'
,npic7 = 'a'
,npic_main = 'a'
,npic_video = 'a'
,npic_video_img = 'a'
,npic_banner1 = 'a'
,npic_banner2 = 'a'
,npic_video_main = 'a'
,npic_intro = 'a'
,npic_share = 'a'
,tchCode = 'a'
",$LINK) or die(alert_msg("DB Insert Error"));
default가 null로 지정된 칼럼들을 임의로 값을 넣어도 DB insert 에러가 나고 있습니다.
해당 DB 테이블의 속성은 이렇습니다.
+-----------------+---------------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------------+------+-----+---------------------+----------------+
| idx | int(6) unsigned | NO | PRI | NULL | auto_increment |
| call_id | varchar(20) | NO | | NULL | |
| tu_type | enum('1','2','3','4','5') | NO | | 3 | |
| tg_id | int(11) | NO | MUL | NULL | |
| tu_id | varchar(20) | NO | UNI | | |
| tu_pw | varchar(20) | NO | | | |
| tu_status | enum('1','2') | NO | | 1 | |
| tu_name | varchar(30) | NO | | NULL | |
| tu_tel | varchar(20) | NO | | NULL | |
| tu_email | varchar(100) | NO | | NULL | |
| sex | enum('M','W') | NO | | M | |
| profile | text | NO | | NULL | |
| tu_character | text | NO | | NULL | |
| tu_intro | text | NO | | NULL | |
| tu_lastdate | datetime | NO | | 0000-00-00 00:00:00 | |
| tu_regdate | datetime | NO | | 0000-00-00 00:00:00 | |
| del_yn_tu | enum('Y','N') | NO | | N | |
| tu_pic | varchar(100) | NO | | NULL | |
| tu_banner | varchar(100) | NO | | NULL | |
| home_yn | enum('Y','N') | NO | | Y | |
| course_id | int(10) | NO | | NULL | |
| main_pic | varchar(100) | NO | | NULL | |
| main_mentor1 | enum('Y','N') | NO | | N | |
| main_mentor2 | enum('Y','N') | NO | | N | |
| tu_ord | int(10) | NO | | NULL | |
| pic1 | varchar(100) | NO | | NULL | |
| pic2 | varchar(100) | NO | | NULL | |
| pic3 | varchar(100) | NO | | NULL | |
| pic4 | varchar(100) | NO | | NULL | |
| new_yn | enum('Y','N') | NO | | N | |
| main_txt | varchar(50) | NO | | NULL | |
| main_txt2 | varchar(50) | NO | | NULL | |
| main_txt3 | varchar(50) | NO | | NULL | |
| cnt_vod | int(10) | NO | | NULL | |
| cnt_live | int(10) | NO | | NULL | |
| cnt_sm | int(10) | NO | | NULL | |
| npic1 | varchar(100) | NO | | NULL | |
| npic2 | varchar(100) | NO | | NULL | |
| npic3 | varchar(100) | NO | | NULL | |
| npic4 | varchar(100) | NO | | NULL | |
| npic5 | varchar(100) | NO | | NULL | |
| npic6 | varchar(100) | NO | | NULL | |
| npic7 | varchar(100) | NO | | NULL | |
| npic_main | varchar(100) | NO | | NULL | |
| npic_video | text | NO | | NULL | |
| npic_video_img | varchar(100) | NO | | NULL | |
| npic_banner1 | varchar(100) | NO | | NULL | |
| npic_banner2 | varchar(100) | NO | | NULL | |
| npic_video_main | varchar(200) | NO | | NULL | |
| npic_intro | text | NO | | NULL | |
| npic_share | varchar(200) | NO | | NULL | |
| tchCode | varchar(100) | NO | | NULL | |
+-----------------+---------------------------+------+-----+---------------------+----------------+
그리고 default가 null인 값을 수정하기 위해
ALTER TABLE lms_tutor ALTER COLUMN cnt_vod SET DEFAULT '';
명령어를 실행하였는데
ERROR 1067 (42000): Invalid default value for 'tu_lastdate'
datetime 속성으로 되어 있는 tu_lastdate 칼럼이 에러가 나오고 있는 상황입니다.
비슷한 경험으로 해결하신 분들의 고마운 도움을 받고자 글을 올렸습니다.
!-->!-->!-->!-->