테스트 사이트 - 개발 중인 베타 버전입니다

datatype이 "SET"인 wr_option 처리 채택완료

평상심NZ 3년 전 조회 1,499

안녕하세요.

 

게시판에 새로운 글을 추가하면 호스팅에서는 잘되는데, 제 PC 환경에서는 안됩니다.

간략한 환경은...

Hosting: PHP 7.3.29, mysqlnd 5.0.12-dev

제 PC: PHP 7.4.26, mysqlnd 7.4.26

 

sql insert 문은 두 환경 모두 wr_option = ",," 식으로 문장이 만들어집니다.  

그런데

저의 PC에서는 ERROR가 발생하고 

Hosting 환경에서는 SQL 문이 실행되고 테이블 컬럼에 등록된 값은 blank입니다.

 

wr_option = "html,," 일 경우

저의 PC에서는 ERROR가발생하고 

Hosting 환경에서는 SQL 문이 실행되고 테이블 컬럼에 등록된 값은 "html"입니다.

 

Table의 wr_option의 datatype이 SET이므로 문장이 위처럼 만들어지면 ERROR인 것 같은데,

어떻게 Hosting 환경에서는 콤마(,)가 사라지는 것일까요?

 

제 PC 환경에 문제가 있을까 싶어 Hosting에서 file과 DB를 backup받아서 제 PC에 설치해보았습니다만 마찬가지입니다.

 

write_update.php 를 보니, wr_option과 관련된 항목으로 

</p>

<p>// 외부에서 글을 등록할 수 있는 버그가 존재하므로 비밀글은 사용일 경우에만 가능해야 함

if (!$is_admin && !$board['bo_use_secret'] && (stripos($_POST['html'], 'secret') !== false || stripos($_POST['secret'], 'secret') !== false || stripos($_POST['mail'], 'secret') !== false)) {

    alert('비밀글 미사용 게시판 이므로 비밀글로 등록할 수 없습니다.');

}</p>

<p>$secret = '';

if (isset($_POST['secret']) && $_POST['secret']) {

    if(preg_match('#secret#', strtolower($_POST['secret']), $matches))

        $secret = $matches[0];

}</p>

<p>// 외부에서 글을 등록할 수 있는 버그가 존재하므로 비밀글 무조건 사용일때는 관리자를 제외(공지)하고 무조건 비밀글로 등록

if (!$is_admin && $board['bo_use_secret'] == 2) {

    $secret = 'secret';

}</p>

<p>$html = '';

if (isset($_POST['html']) && $_POST['html']) {

    if(preg_match('#html(1|2)#', strtolower($_POST['html']), $matches))

        $html = $matches[0];

}</p>

<p>$mail = '';

if (isset($_POST['mail']) && $_POST['mail']) {

    if(preg_match('#mail#', strtolower($_POST['mail']), $matches))

        $mail = $matches[0];

}</p>

<p>

 

그리고 아래는 관련 SQL 문 입니다.

</p>

<p>    $sql = " insert into $write_table

                set wr_num = '$wr_num',

                     wr_reply = '$wr_reply',

                     wr_comment = 0,

                     ca_name = '$ca_name',

                     wr_option = '$html,$secret,$mail',  // 이하 생략

또는 

</p>

<p>    $sql = " update {$write_table}

                set ca_name = '{$ca_name}',

                     wr_option = '{$html},{$secret},{$mail}', // 이하 생략</p>

<p>

SQL 관련 코드는

insert) wr_option = '$html,$secret,$mail', 와

update) wr_option = '{$html},{$secret},{$mail}', 인데 내부 처리 과정/방법을 알 수 있을까요?

 

제 PC  환경에서 무엇을 체크해야 하는지 알려주시면 감사하겠습니다. 

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

sql_mode하고 관련이 있어 보입니다.

sql_query( "set sql_mode='' ");

이후 해당 query를 사용해 보세요.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

평상심NZ
3년 전
말씀하신대로 먼저 정의하고 실행하니 진행이 되는군요.
그런데 다른 분들은 이런 문제가없었을까요?
sql_mode를 지우는 것은 다른 값을 집어 넣을때 발생하는 error들도 무시하게 되는 것 아닌가요?
엑스엠엘
3년 전
sql_mode에는 많은 내용이 있습니마.
서버마다 기본 값이 다르기도 하고요.
SQL 문법을 얼마나 정확하게 쓰느냐,
어떤 표준을 쓰는지에 대한 설정이 주요 내용입니다.

댓글을 작성하려면 로그인이 필요합니다.

평상심NZ
3년 전

제 PC 환경의 mySQL을 Hosting 환경과 맞췄습니다.

WAMP64을 사용하는데 동일한 버전의 addon을 설치 했더니 새글 작성이 가능합니다.

DB 버전에 관계없이 저장이 되어야 할 것 같습니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인