2011-09-07 11 views
1

설문 조사 유형으로 생각하고있는 양식을 생각해보십시오. 50 가지 이상의 가능한 조건을 모두 확인할 수 있습니다. 어떤 형식과 마찬가지로 결과를 MySQL 데이터베이스에 게시 할 수 있어야합니다. 최선의 방법으로 생각하지 않는 한 각각의 개별 열을 만들 필요없이 이러한 모든 확인란의 입력을 얻는 가장 좋은 방법을 찾아 내려고합니다.웹 양식의 50 개 이상의 확인란 입력

여기 내가 생각한 바가 있습니다. 1-N에서 숫자로 체크 박스 이름을 할당하십시오. 그런 다음 상태를 점검하는 모든 확인란을 반복합니다. 그런 다음 각 확인란에 대해 열을 만드는 대신 하나의 열을 사용하고 각각에 대해 일종의 식별자를 연결하십시오.

Psuedocode

For checkbox in N: 
    check state of N: 
     if N is checked: 
      concatenated string += idenifier(N) 

이 방법은 그 일을하는 좋은 방법인가, 또는 다른 제안이 있습니까?

답변

0

DB에 별도의 열을 사용하는 것은 정보가 무엇인지, 앞으로 어떻게 사용할 것인지에 따라 결정되어야합니다.

고유하고 개별적으로 사용할 수있는 정보를 수집하는 경우 ... 각 checkbox은 컴파일 될 수있는 값을 나타내고 나머지는 따로 사용되는 값을 나타내는 경우 별도의 열을 사용합니다. 귀하의 코멘트 당으로 편집

...

내가만큼이나 오랫동안 연결된 문자열에서 모두 같은 정보를 얻을 수 있다면이 방법의 도움이 될 것입니다 무엇

데이터를 가져올 때 추가 구문 분석 단계가 있습니까?

나는 몇 가지 이유를 생각할 수 : 당신은 미래의 정보를 검색하는 방법을

  1. 을 알고하지 않을 수 있습니다. 하나의 필드에 배치하면 어떻게 잡는가에 따라 점점 어려워집니다.

  2. 정보를 비교하는 것이 훨씬 어려워집니다.

  3. checkboxes을 추가하거나 제거하는 것은 유지하기가 훨씬 어려워집니다.

+0

데이터를 가져올 때 별도의 구문 분석 단계가있는 한 연결된 문자열에서 동일한 정보를 모두 얻을 수 있다면이 방법의 이점은 무엇입니까? – chancelkx

+0

위의 편집을 참조하십시오. @chancelkx –

1

이것은 아마도 가장 나쁜 방법 일 것입니다. 제안 된 솔루션에는 많은 문제가 있지만 암 from지의 귀에서 실크 지갑을 만들려하지는 않습니다 ....

관계형 데이터베이스에서이를 수행하는 유일한 방법은 각 확인란 결과를 얻는 것입니다 테이블의 자체 행에 저장됩니다. 그런 다음 당신은 또한 체크 박스가 무엇을 나타내는 지 설명 할 수

response { 
    id auto_increment-, 
    user_id references data elsewhere, 
    ... 
    primary key (id) 
} 

answers { 
    response_id references response.id, 
    checkbox_id references available_checkboxes.id, 
    value_selected, 
    primary key(response_id, check_box id) 
} 

: 그래서 당신은 뭔가를해야 할 수도 있습니다

available_checkboxes { 
    id auto_increment; 
    option_text varchar(40); 
} 

을 그리고 다른 설문을 구축 .... 데이터 수집을 사용자 정의 ....이상

+0

양식을 제출하면 모든 열이 체크 박스와 chexbox의 상태가되는 한 행이 생깁니 까? – chancelkx

+0

또한 왜 내 방법이 가장 최악입니까? – chancelkx

+0

아니요, 그는 한 제출에 여러 행이 있고 각 행에는 정확히 하나의 확인란의 상태가 기술되어 있다고 말합니다. – Nathan

0

내 제안은 MySQL 테이블에 필드 varchar (50)을 만드는 것입니다. 관련 체크 박스가 선택되었는지 여부에 따라 각 위치는 0 또는 1이됩니다. 당신은 체크 박스가 체크하거나하지 않은 경우 확인하기 위해 수신 코드의 반복을 만들 수

$string = "1100100001000...0001" <- 50 positions 

: 사용자가 상자 1, 2, 5, 10, 50를 선택하면 같은, 당신의 문자열이 보일 것이다. 체크 된 경우 문자열에 "1"을 추가하고 체크하지 않은 경우 "0"을 추가하십시오.

자바 스크립트로 클라이언트의 유효성 검사 코드에 문자열을 만들고 저장할 준비가 된 문자열을 전달할 수도 있습니다.

월별 지불을 나타내는 문자열의 각 위치 - 할부 계획에서 지불을 추적하는 데 사용 된 유사한 구현을 보았습니다.

이 정보가 도움이되기를 바랍니다.

+0

이것은 정확히 내가 구상 한 것입니다. 필요한 모든 것은 동일한 순서의 모든 값을 갖는 xml 파일처럼 단순한 조회 테이블 일 것입니다. 항목 1,3,5가 테이블의 1,3,5 항목을 읽었는지 확인합니다. 나는 이것이 왜 나쁜 것으로 여겨지는지 이해하지 못합니다. – chancelkx

+2

@chancelkx : 여러 가지 이유로 좋지 않습니다. a) 매핑은 데이터와 분리되어 있으므로 확인란을 설정하면 매핑과 데이터를 모두 변경하고 매핑을 사용하지 않아도 데이터가 의미가 없으므로 매핑을 동기화해야합니다. b) 정규화되지 않았으므로 관계형 데이터베이스의 강력한 성능을 활용할 수 없으므로 인덱싱이 필요없고 빠른 검색이 필요하지 않습니다. – dnagirl

+0

@dnagirl이 맞습니다. 고맙습니다. – chancelkx

1

귀하의 질문은 귀하의 양식에 관한 것이 아니라 귀하의 데이터를 저장하는 방법에 관한 것입니다. 스파 스 매트릭스로 간주 될 수있는 항목을 저장하려는 것처럼 들리지만 비어 있지 않은 값만 저장하려고합니다. EAV model을 살펴보십시오. 이와 같은 데이터에는 유용하지만, 사용자가 스스로 알아야 할 몇 가지 주요 제한 사항이 있습니다.

테이블 구조는 기본적으로 열을 행으로 만듭니다. 다음과 같이 입력하십시오.

CREATE TABLE terms(
    term_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    termname varchar(30) NOT NULL, 
    termvalue varchar(100) NOT NULL, 
    assoc_id INT UNSIGNED NOT NULL, 
    CONSTRAINT FOREIGN KEY (assoc_id) REFERENCES maintable(main_id) ON DELETE CASCADE) 
ENGINE=InnoDB 

원하는대로 체크 박스를 호출 할 수 있습니다. 당신이 그들을 처리 할 때, 2 개의 삽입 쿼리가있을 것입니다 - 하나는 메인 레코드를 생성하기위한 것입니다; 하나는 연관된 체크 박스 값을 저장하는 것입니다. 확인란 양식 결과의 속성처럼 액세스 할 것이다, 그래서

INSERT INTO maintable(allfields, that, must, be, collected) VALUES (1,2,3,4,5); 
//get last_insert_id(), we'll say main_id=7 this time 

INSERT INTO mytable(termname, termvalue, assoc_id) 
VALUES 
('colour', 'blue', 7), 
('feeling','happy', 7), 
('schedule', 'daily', 7); 
0

아마, 그 일에 가장 깨끗한 방법, 그것은, ORM 객체와 같은 형태로 결과를 저장합니다.

Doctrine 또는 MongoDB를 사용할 수 있습니다.

관련 문제