제가 운영하는 커뮤니티에 회원이 등록한 설문에 설문참여를 하려하니 다중선택이라 선택을 여러개 해야 한다는 의미의 알림창이 뜨고 설문참여가 되지 않는 상황이 발생해서 확인해 보았습니다.
제가 여러가지로 테스트로 확인한 결과는 항목선택 갯수를 숫자로 정확히 입력하지 않고 문자열 같은 것을 실수로 입력했을때 발생하는 것을 확인했습니다.
문자로 입력시 선택항목 갯수가 db에 0으로 입력되면서 발생하는 문제입니다.
1이면 단일, 1이 아닌경우 다중선택으로 코드가 짜여있는데 0이 입력되면서 다중입력으로 분류가 되고 다중입력 숫자와 선택한 항목이 숫자가 일치해야 하는데 일치할 수 없는 상황이 벌어지는 것입니다.
라이믹스 코어에서는 사용자가 선택항목 갯수 1을 지우고 비워둔 채로 등록을 시도하면 1로 보정해서 db에 입력되도록 해주는 코드가 있습니다.
https://github.com/rhymix/rhymix/blob/master/modules/poll/poll.controller.php#L94
if(!$val->checkcount)
{
$val->checkcount = 1;
}
이렇게 설문 항목선택 갯수를 입력하지 않은채 설문등록 요청이 들어오면 1을 강제로 넣어주어 단일선택으로 등록을 해주는 것입니다.
여기에 문자로 이상하게 입력하게 되면 값이 있기 때문에 1로 바꿔서 입력되지 못하고 문자를 입력을 시도하게 되는데 db 설정에 따라서 SQL 에러가 발생해서 설문등록이 안되는 경우가 있고 제가 운영하는 사이트는 0으로 인식되서 설문이 등록되어 버립니다.
저 상태로 설문이 등록되면 더 문제가 되는게 아무도 설문 참여를 할 수 없는 문제가 발생합니다.
개인적으로는 입력 받은 값을 정수(INT)로 변환하여 해당값이 0보다 큰 값이 아니면 보정치로 1을 입력하도록 코드를 보완했습니다.
if(!$val->checkcount || !(int)$val->checkcount > 0)
{
$val->checkcount = 1;
}
(int)$value
의 경우 문자열을 정수의 숫자로 변환해 주는데 문자열이 숫자가 아닌 경우 0으로 반환을 해주게 됩니다. 따라서 숫자가 아닌 형식의 문자를 사용자가 입력하게 되면 0을 가지게 되어 대체값이 1을 가지게 만드는 것 입니다.
여기서 문자열을 숫자로 변환해주는 것을 사용해야 하는 이유는 설문등록시 입력받은 설문항목 선택에 입력된 내용이 숫자가 아닌 문자로 취급되어 넘어오기 때문입니다. 0과 비교를 하기 위해서는 문자와 0 을 비교하여 원하는 연산결과를 얻어내지 못해서 입니다.
해당 문제는 이슈로 등록해 놓았으니 이후 더 좋은 방법으로 패치가 될 것으로 예상이 됩니다.
현재 배포중인 2.0.16 버전까지는 이러한 문제가 있으니 필요하다면 선조치를 해두는 것이 좋습니다.
https://github.com/rhymix/rhymix/issues/1831
*해당 이슈는 2.0.17 에서 처리 되었습니다.