고수님들께 checkbox 배열 질문드립니다.

고수님들께 checkbox 배열 질문드립니다.

QA

고수님들께 checkbox 배열 질문드립니다.

본문

아무리 생각을 해봐도 이해가 안가는 점이 있어서 질문을 드립니다.

 

현재 다중체크박스를 쓰는 경우가 필요합니다.

(옵션  □1 □2 □3  <= 이런 방식을 사용할 예정입니다. )

 

여러가지 검색을 통해본 결과.. 대부분이 아래의 방식으로 사용을 하라고 말씀을 해주십니다.

.

.

<label for="wr_1">옵션</label>
        <input type="checkbox" name="wr_1[]" id="wr_1" value="1">1
        <input type="checkbox" name="wr_1[]" id="wr_1" value="2">2

.

.

 

그런데... 여기서 문제가 발생을 합니다.

해당의 방식을 이용하면, DB에는 wr_1에 "Array" 가 찍혀버리는 문제가 ;;

 

과연 이문제가 어디서 발생을 하는것인가에 대한 원인을 찾기 위해 이틀간을 고민했습니다만, 정확한 원인을 찾지 못하였습니다.

 

해당과 동일한 증상에 관련한 질문( https://sir.kr/qa/232959 ) 이 앞서 있기에, 해당 질문에 연관된 거의 대부분의 질문은 다 찾아보았고, 고수님들의 의견도 충분히 읽어보았습니다.

(물론 구글 및 국내/해외PHP관련포럼도 다 뒤져봤습니다 ㅠㅠ)

 

implode를 해라, var_dump나 print_r 을 찍어서 원인을 찾아라, 소스상에는 문제가 없는데 등등... 대부분의 의견을 읽어보았습니다만...

체크박스의 네임값이 name="wr_x[]" 의 형태로 지정이 되면 write_update.skin.php 로 넘어오는 과정에서 array의 형태가 string의 형태로 변경되어버린다는 점이 문제입니다.

 

 

제가 이해하고 있는 그누보드의 처리순서를 본다면..

 

1. bbs/write_update.php (대부분의 과정을 처리후 DB에 값을 찍음)

2. 스킨폴더/write_update.skin.php (사용자코드를 실행하여 DB를 재처리하던 뭘하던 사용자마음)

3. bbs/write_update.php (goto_url 을 통하여 view 페이지에서 작성된 내용을 확인함)

(위의 과정에서 goto_url 부분을 주석처리하여 그 이전에 처리되는 과정의 결과를 확인하였습니다.)

 

그런데.. 넘어오기전 이미 wr_1의 내용은 string 으로 처리가 되어버려서... implode 안되고, var_dump 찍으면 string(5) "Array" 로 나와버리고, print_r 이야.. 뭐 당연히 Array 라는 글씨만 보여주고;;;

 

혹시 서버자체의 설정같은것이 문제가 있을까 싶어, 그누보드 내부가 아닌 일반적인 html 페이지로 값을 넘기면 정상적으로 배열처리가 됩니다.

(a.html 에서 b.html 로 값을 넘겨서 테스트해봄)

 

그렇다면.. 그누보드 내부에서는 DB에도 Array 가 찍혀버리니.. DB를 찍기전에 이미 배열이 정상처리가 안된다는 결론에 도달해서 bbs/write_update.php 를 뒤져서 관련 소스를 변경해 보았습니다.

 

제일 유력한 놈이 이놈 (settype이 string??) 인거 같아서.. 아래소스의 if 문을 주석처리 해봐았습니다.

for ($i=1; $i<=10; $i++) {
    $var = "wr_$i";
    $$var = "";
    if (isset($_POST['wr_'.$i]) && settype($_POST['wr_'.$i], 'string')) {
        $$var = trim($_POST['wr_'.$i]);
    }
}

  

어... 배열이 정상적으로 넘어옵니다. 그런데 문제는 wr_x 와 관련된 내용이 DB에 찍히질 않아버리네요;;

 

여기까지가 제가 이틀간 고민한 내용입니다.

 

물론 해당의 방식을 피해서 변수명을 바꾸고 쓰던, 별도의 자바스크립트나 기타의 방식을 통해 별도로 처리를 하던 .. 처리에 대한 내용은 저도 모르는 바는 아닙니다.

다만, 이게 왜 이렇게 안되는것인가? 라는 궁금증이 사람을 미치게 만들더라구요 ㅠㅠ

 

 

 

앞에 사설이 너무 길어졌네요. 죄송합니다 ㅠㅠ 질문을 정리하도록 하겠습니다.

 

1. name="wr_x[]" 의 배열처리가 안되는 것은 제가 지목한 유력용의자가 원인인것이 맞나요?

 

2. 유력용의자의 소스를 그냥 말로 한다면 조금 이해가 안되는게.. 

"$_POST['wr_x'] 변수가 존재하고, $_POST['wr_x'] 변수의 타입을 string 으로 만든다면..." 인거 같은데

사실상 조건문은 "$_POST['wr_x'] 변수가 존재하고, $_POST['wr_x'] 변수의 타입이 string 이라면..." 이 맞는게 아닌가요? 

(settype 이 아닌 gettype($_POST['wr_'.$i]) == 'string' 이 더 맞는게 아닌지..)

  

3. 유력용의자의 소스를 변경한다면 제가 미처 생각하지 못한 문제가 생길려는지요...?

 

4. 유력용의자를 변경하여 name="wr_x[]" 의 형태를 쓸수 있게 만들수는 없는지요...?

 

5. 유력용의자가 아닌 기타의 이유로 인해 이러한 문제가 발생할수 있는지요...?

(니가 멍청해서 서버설정은 살펴보지도 않았잖아 같은 ...)

서버는 현재 APACHE : 2.4.27 (Win64)  / PHP : 7.1.8 / Mysql : 5.7.20 입니다.

개인서버라서 설정파일은 전부 커스터마이징이 가능합니다.

 

-------------------------------------------------------------------------------------------------------

모든 테스트는 하나도 손대지 않은 순정 그누보드를 기반으로 하였습니다.

지식이 짧아 많은 고수님들의 조언이 필요합니다. 

조그마한 도움이라도 주시면 감사하겠습니다 ㅠㅠ

 

 

 

 

 

 

 

이 질문에 댓글 쓰기 :

답변 1

체크박스를 어떤용도로 사용하실지에 대한 

논리적인 정리가 중요할겁니다.

 

일을 처리하는 사람 입장에서는 그너 저거나 라고 볼수있지만

 

먼저 그누보드의 특징인

 

wr_1[] 로 값을 넘기면 1개를 넘겨도

 

값을 저장할때

$_REQUEST/$_POST/$_GET 등으로 수신하면

wr_1 은 배열로 넘어갑니다.

 

sql이 저장될때 배열은 Array 라는 타입값 저장 혹은 오류를 발생시킬수밖에 없습니다.

 

그러면

 

wr_1에는 어떤형태의 값이 저장되어야 하나요?

 

보통 체크박스는 멀티값을 저장하기에

 

wr_1 = "사과|배|포도"의 선택된 값들이 저장되고 싶어합니다.

 

그런데 넘기는 값 wr_1 과 

저장되는 wr_1의 구분이 어려워집니다.

 

그래서 흔히들 wr_1 은 sql 을 처리할때 사용하고(실제 table 의 필드도 wr_1 이죠)

 

에디팅폼인 wr_1은 wr1[] 과 같은 구조로 약간 변형해서들 많이 사용합니다.

 

넘기기 전이에 결합하여 wr_1 으로 string을 만들어 넘기던지 (Javascript로) 

넘겨받아서 wr1 을 count(wr1)으로 loop로 결합시키던지

등의 방법을 선택하시면 해결될겁니다.

 

이미 많이 와 있는 상태에서 개념만 정리하면 해결하실듯 하여 개념만 설명드립니다.

신경써주신 답변 감사드립니다.

설명해주신 내용을 보면 어떠한 이유로 DB에 array 라는 타입값이 찍히는가는 이해가 갑니다만...
그렇다면 다른분들은 왜 구조의 변경 (에디팅폼인 wr_1은 wr1[] 과 같은 구조로 약간 변형같은) 을 통하지 않고 그냥 wr_1[]을 써도 문제가 없다고 말씀을 하시는지에 대한 설명을 조금 더 부탁드려도 될까요? ㅠㅠ

그누보드에서 wr_1은 게시판의 여분 필드명이고
1~10개의 값은 기본으로 저장 조회가 가능합니다

전달할
form태그 안의
wr_1을 사용하면 단일값으로 전달되서
수신하는 페이지에서
$_REQUEST,$_POST의 형태로 받게될경우
단일값이아니라면 배열의 형태로 받아지게 됩니다

따라서 그냥 저장하년 배열의 타입값을 가지게 되는 구조라서 값이 아닌 구조명 혹은 오류가 발생되는 거지요

그래서
배열로 받으면 문자열 변수로 치환시켜 값을 저장해야 합니다

제가 머리가 너무 나쁜가 봅니다 ㅠㅠ 글이 이해가 잘 안되는데...

"배열로 받으면 문자열 변수로 치환시켜 값을 저장해야 합니다" 라는 말씀은...
위에서 제가 얘기한 bbs/write_update.php 의 '유력용의자' 가 사용되는 이유를 말씀해주시는건지..
아니면, 스킨폴더의 write_update.skin.php 에서 implode 를 사용해라 라는 말씀을 해주시는건지요?


결론에 대한 요약을 해주시자면, 현재의 그누보드5 스킨폴더의 write.skin.php 에서..

1. 스킨파일에서 변수명의 별도변경없이 wr_x[] 의 형태로 써서 값을 넘기면 해당의 문제가 발생하는것이 정상이다.
(bbs/write_update.php 에서 중도에 별도로 커스터마이징을 해야 하는 부분이 있어야 하는데 다른사람들이 설명을 안한거다)

2. 아니다. 니가 뭔가를 잘못한거다. 
( bbs/write_update.php의 커스터마이징이나 스킨파일에서 변수명의 별도변경없이 wr_x[] 의 형태로 써서 값을 넘겨도 문제될것은 없다)


어느쪽이 정답인지요?

1번이라고 봐야 맞겠네요
커스텀의 방법은 워낙 다양하고 유연해서
굳이 설명하지 않은것이라고 봐야죠

그리고, 폼을 넘길때 checkbox의 값이 동일 name 으로 설정되면
배열로 되는건 그누보드가 아니라.
html의 기본적인 형태라서 설명이 필요없는것이죠

검색을
form checkbox mult post  를 구글에서 검색해서 보시면
다양한 답변들을 찾을수있을겁니다.

나한테 맞는적합한 답을 찾는건 숱한 경험밖에는 없지 않을까 싶네요

부족한 이를 위하여 너무나도 많은 시간을 투자해주셔서 송구스럽기까지 하네요 ㅜㅜ
앞으로 플래토님과 같은 고수가 되기 위해 저도 좀 더 분발하여 노력하도록 하겠습니다 ^^

답변을 작성하시기 전에 로그인 해주세요.
전체 123,476 | RSS
QA 내용 검색

회원로그인

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