2019.04.05 18:03

php7, mysql8 이상에 그누보드5를 설치 할 때 syntax 에러를 만났다면?

그누보드5를 PHP7, MySQL8의 최신 버전 환경에 설치 할 때 의도치 않은 에러를 만날 수 있다.

 

그누보드5 설치가 시작되었습니다. 
1. 전체 테이블 생성 완료 
insert into `g5_member` set mb_id = '******, mb_password = PASSWORD('*******'), mb_name = '******', mb_nick = '******', mb_email = ''*****@daum.net', mb_level = '10', mb_mailling = '1', mb_open = '1', mb_email_certify = '2019-04-05 17:32:47', mb_datetime = '2019-04-05 17:32:47', mb_ip = '119.205.37.***' 

1064 : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('***********'), mb_name = '*******', mb_nic' at line 3 

error file : /install/install_db.php

그누보드5를 설치하고 마지막에 이런 에러를 만났다면 간단하게 문제를 해결 할 수 있다.

이 메시지는 해당 sql 구문의 앞뒤에 연관성 있는 문법 에러가 있다는 의미다. MySQL8 이상에서는 TEXT를 암호화 하는 PASSWORD() 함수를 사용 할 수 없다. 서버 설정을 구 버전 형태로 바꾸면 되지만 그럴거면 굳이 MySQL8을 사용할 이유가 없을 것이다.

 

PHP에서 TEXT를 해싱하는 함수는 몇 개가 있는데 필자는 MD5()를 사용한다. 따라서 SQL 구문에서 PASSWORD()를 MD5()로 대체하면 된다.

 

만약 install/install_db.php 파일 176라인에서 아래와 같은 SQL 구문을 만났다면 PASSWORD()를 MD5()로 바꿔서 다시 그누보드5를 설치 해 보자.

// 관리자 회원가입
$sql = " insert into `{$table_prefix}member`
            set mb_id = '$admin_id',
                 mb_password = MD5('$admin_pass'),
                 mb_name = '$admin_name',
                 mb_nick = '$admin_name',
                 mb_email = '$admin_email',
                 mb_level = '10',
                 mb_mailling = '1',
                 mb_open = '1',
                 mb_email_certify = '".G5_TIME_YMDHIS."',
                 mb_datetime = '".G5_TIME_YMDHIS."',
                 mb_ip = '{$_SERVER['REMOTE_ADDR']}'
                 ";

 

 

그런데 그누보드5에서 PASSWORD() 함수로 암호화 하는 함수가 하나 더 있다.

lib/commcon.lib.php의 1558번 라인에서

function sql_password($value)
{
    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
    $row = sql_fetch(" select password('$value') as pass ");

    return $row['pass'];
}

이런 사용자 함수를 만날 수 있다. 여기서도 password('$value') as pass 부분을 md5('$value') as pass로 변경해 줘야 한다.

 

연관글

https://ziumb.tistory.com/114

        

Trackback 0 Comment 0