adm/board_form.php line:258 설명 부탁드립니다. > 그누4 질문답변

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

adm/board_form.php line:258 설명 부탁드립니다. 정보

adm/board_form.php line:258 설명 부탁드립니다.

본문

<input type=checkbox name=bo_use_category value='1' <?=$board[bo_use_category]?'checked':'';?>><b>사용</b>

이 코드가 뭘까요...

댓글 전체

관라지 설정에 보시면 보이실건데요??
사용 용도는 카테고리를 사용 할지 않할지의 여부의 선택입니다.

이 부분을 체크 하시면 게시판에서 카테고리를 이용 하실수 있습니다.
단 한칸 더 내려 가보시면
<input type=text class='edit' name=bo_category_list style='width:99%;' value='<?=$board[bo_category_list]?>'>
        <br> 분류와 분류 사이는 | 로 구분하세요. (예: 질문|답변)

이런 부분이 보일 실겁니다. 이곳에
공지|일반|질문 

이런식으로 적어야만 사용이 가능합니다. (__)
아 그건 아니고요
단지
<input type=checkbox name=bo_use_category value='1' <?=$board[bo_use_category]?'checked':'';?>>

$board[bo_use_category가 1일때 는
<input type=checkbox name=bo_use_category value='1' 'checked''>
이렇게 폼이 바뀔것이고
아닐 경우는
<input type=checkbox name=bo_use_category value='1''> 이렇게 나옵니다.
이거는 수정에 들어 갔을때 bo_use_category 값이 1일때 체크해서 뷰어 시켜 주기 위함입니다.
checkbox인 걸로 보아 bo_use_category 값이 1=>사용, 0=>사용안함 일 것 같습니다만,

<?=$board[bo_use_category]?'checked':'';?> 이 부분을 잘 모르겠네요..
$board[bo_use_category] 는 tinyint형 변수인 것 같은데..
같은 코드라면, (원래 코드에서) check하지 않을 경우
bo_use_category=''
와 같이 값이 주어지지 않을 것 같네요.
그렇다면 DB TABLE에서 bo_use_category가 tinyint 형이므로 ''값을 insert하지 못하는 오류가 납니다.
질문드리게된 경위가 여기에 ^^

제가 보긴엔 버그인 듯...bo_use_category 이하 몇 군데 손봐야하지 않을까 합니다.
<input type=checkbox name=bo_use_category value='1' <?=$board[bo_use_category]?'checked':'';?>><b>사용</b>
위와 같이 원래 있는 코드가 맞습니다..단지 기본값이 true 이면 체크하느냐 하지 않느냐이며 기본값이 true 라면 체크를 하므로 db 인서트시에도 당연히 1이 할당되어 인서트 됩니다.

db 에는 tinyint 컬럼이 맞을 겁니다.
그리고 디폴트 값이 not null 이므로 0이 들어갑니다.
따라서 위 코드를 해석해 보자면 $board[bo_use_category] 값이 true(1이상인 경우) 인 경우는 체크를 하고, 그렇지 않은경우(0이하는 false 반환) 는 체크를 하지 않는 겁니다.
또한 체크를 하게되면 위 변수값과 상관없이 무조건 1을 할당하므로 인서트시에 1이 들어갑니다.
그리고 질문하신 바로 위 댓글과 같은 경우는 db 컬럼값이 not null 이 아니라 null  인 경우에 해당하는 거라고 판단됩니다.  디폴트값이 0 이고 컬럼타입이 not null 이므로 체크하지 않으면 인서트시에 값이 없으므로 당연히 기본 컬럼값인 0이 들어갑니다.  따라서 인서트시에 아무 오류도 나지 않습니다.

제가 보기엔 버그가 아니며 정상적인 코드입니다.
그렇게 되야겠죠...헌데,
1. 처음 생성시 테이블엔 아무 값도 없죠, php에서 $board[bo_use_category]는 ''입니다.
이때 사용 체크를 하지 않고 게시판을 생성하려면 $bo_use_category=''이 전달되겠죠..
2. 게시판을 수정할 경우, 예컨데 카테고리를 사용하다 필요없게되어 없앨 경우도 마찬가지로
$bo_use_category=''이 전달되겠죠..

default='0'은 아시다시피 insert나 update에서 빠졌을 경우 들어가는 값이죠,
이 경우는 sql querry문에 bo_use_category='' 이 들어 있으므로 default 값과는 상관없이
error 납니다. (''은 물론 NULL이 아니죠)

요컨데 <input type='checkbox' ...>로 설정한 부분은 value=1에서 '1'과 '' 두가지만 전달되므로 문제가 생기죠.

* MySql 버전에 따라 int, tinyint 형에서도 ''을 받아들이는 경우도 있나봅니다. (모두들 잘 이용하시니깐요) 하지만, 그건 MySql 버그(?)가 아닐까요.. ''은 정수형이 아니죠..
잘못 알고 계신듯 합니다..
1. 그누보드 처음 생성시 위 필드값에 0 이 들어갑니다. (not null default 0)
그러므로 아무값도 없다는 건 잘못 알고 계신 것 같습니다.

2. 게시판 수정할 경우 카테고리 값이 필요없어서 없앤다거나 사용하지 않을 경우는 $bo_use_category 에는 아무값도 전달되지 않습니다.
또한 sql query 문에서 bo_use_category = '' <- 여기에서 값에 홀따옴표('')가 들어가는게 아니라 아무값이 없는 빈공백입니다.  그누보드에서 인서트시에 숫자형에도 홀따옴표를 써주는 것은 아무값도 넘어오지 않았을 때, 공백이면 말씀대로 에러가 나므로 홀따옴표를 써서 문자열로 감싸주면 에러나지 않습니다.(문자열로 감싸줘도 어차피 숫자형은 숫자값이 들어가므로 1이 넘어오면 1이 들어가죠)

* 결론은 제가 보긴 사용하시는 mysql 버젼등이 3,4가 아니라 5이상으로 보여지는데요.
5 버젼에서는 말씀대로 에러가 날 수 있습니다.
그럴 경우엔 입력폼을 수정할 필요없이 업데이트 페이지 상단에,
if(empty($_POST["bo_use_category"])) $bo_use_category = 0; 이라고 해주면 굳이 입력폼에 코드를 수정할 필요는 없겠죠..

* mysql 버젼에 따라서 int,tinyint 컬럼타입에서 홀따옴표('')를 받아들이는 경우는 없습니다.  위에서 얘기했듯이 값이 없는 경우의 숫자형 컬럼에 인서트(업데이트)시에 오류를 없애기위해서 홀따옴표로 감싸줄 뿐입니다.
코멘트 감사...

다시 설명드리면,

1> 그누보드 설치후 (입력된 자료 없이 테이블만 생성되었겠죠)
첫 게시판 생성 - adm/board_form.php line:18

if ($w == "") {
여기서 처음으로 $board[] 값이 설정되며, $board[bo_use_category]는 정의되지 않고 있습니다.

line:258에
<input type=checkbox name=bo_use_category value='1' <?=$board[bo_use_category]?'checked':'';?>><b>사용</b>
나왔다면, $board[bo_use_category]='' (값이 없겠죠)
"체크"하지 않으면 역시 $bo_use_category='' (값이 없겠죠)
폼으로 넘깁니다.

adm/board_form_update.php line 25,44

$sql_common = " ... , bo_use_category = '$bo_use_category', ...";  는
$sql_common = " ... , bo_use_category = '', ...";  이것과 같습니다.

line: 118-123
sql_query는 [ insert into 게시판 set ..., bo_use_category = '',.. ]
를 수행하며 ERROR를 낸다는 것입니다.


2. 업데이트(카테고리 사용취소)

board_form.php line:258에서
$board[bo_use_category]=1 로 넘어 왔지만,
"체크해제"하여 $bo_use_category='' (값 없음)로 넘깁니다.

board_form_update.php에서
위의 1과 마찬가지.. ERROR 냅니다.

(여담으로, 홑따옴표 두개가 들어갈리는 만무하겠죠.
예를들어, char(0) 일 경우 ''과 NULL이 입력될 수 있으며 둘은 다르죠.
위에서는 값없음(NULL이 아닌 '')을 입력하고자 하나 변수형이 달라서 입력,수정할 수 없다는 ..
쓰다보니 표현이 좀 이상하네요..
MySql 버전관련글은..
숫자형 변수에 ''(값없음, not NULL)이 들어가는 것 같아서.. 0으로 입력된다면 말할 것도 없이 MySql 버그(?) 같아 보인다는 것이고,
php 코딩은 신중히 해야하지 않을까 싶어 적게 되었습니다. 아래와 같이 결국 제X보드 코드를 닮아갔네요)
음 그렇군요... 제가 보통 g3 사용자라서 db와 여러 부분을 자세히 않보고 답변을 드렸습니다.
괸라자님이 한번 검토를 해보셔야 할 부분이기도 하겠네요..
저도 한번 체크 해보고 해야 겠습니다 .^^
g4는 제홈만 설치 해서 사용해서 ^^;; 초창기 버젼이고요 ㅎㅎㅎ
좋은 정보 감사 드립니다.
//sjsjin님의 코멘트와 관련하여,
$sql .="...";
if($bo_use_category) $sql .=", bo_use_category='$bo_use_category'";
...
이렇게 하는 것도 간단하네요. 없으면 default 값 '0'이 들어 갈테니까요.
정확한 숫자값을 사용해야 하는 경우라면 오류가 발생할 소지도 있지만 단순히 예/아니오 만 판별하기 위해 0,1을 사용하는 것이라 큰 오류는 없을 듯합니다.

(mysql 5 버전은 모르겠네요..)

php와 mysql 의 자유로운 형변환이 주는 장점이자 단점이지 싶네요..
편리함 과 불분명함..
전체 6 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT