2009-10-13 1 views
1

PHP에서 MySQL 데이터베이스에 입력 할 데이터의 유효성을 검사하고 구문 분석하는 데이터 입력 웹 페이지를 만들고 있습니다. 데이터베이스에 MySQL SET 또는 ENUM 데이터로 구성된 열이 30 개 이상 있습니다. SQL을 많이 모르는 경우 ENUM 데이터 유형 열은 데이터베이스를 만들 때 정의한 ENUM 변수 모음에서 하나의 값만 보유 할 수 있습니다. SET은 데이터베이스를 만들 때 정의하는 변수 모음이지만 SET 열은 SET 변수 중 하나 이상을 포함 할 수 있습니다.PHP와 MySQL DESCRIBE 명령을 사용하여 체크 박스와 라디오 버튼 메뉴를 동적으로 생성하십시오.

이것은 ENUM 데이터 유형입니다. car_titled_in_state = enum ('Alabama', 'Alaska', 'Arkansas', 'California') 자동차는 한 상태에서만 제목을 지정할 수 있습니다. MySQL은 car_titled_in_state에 하나 이상의 상태를 입력 할 수 없습니다. (자세한 상태에서 차를 제목에는 처리 코드 오류는 기능 prison_term (NUM_YEARS)입니다 ;-) 이것은 SET의 데이터 형이며,

:. ice_cream_toppings = 설정 ('초콜릿 시럽', '습지 부드러운 크림', ' 체리 ','버터 스카치 '). 아이스크림 토핑을 여러 개 가질 수 있지만 세트의 각 멤버는 한 번만 입력하고 은 한 번 셉니다. 너무 많은 아이스크림 토핑에 대한 오류 처리 함수는 body_weight = body_weight ++입니다.

그룹에서 하나의 선택 만 허용하는 라디오 버튼은 ENUM 변수에 적합합니다. 그룹의 선택 항목 수를 허용하는 체크 박스는 SET 변수에 적합합니다.

허용되는 변수 그룹 이 많은 MySQL 열에서 베타 테스트 중 및 초기 생산 개월로 바뀌기 때문에 PHP에서 이러한 메뉴를 한 행씩 작성하는 것은 번거롭습니다. 그들 중 일부는 2011 년에 다시 변경해야 할 것입니다. 이러한 변경 (많은 변경)은 PHP 코드에서 으로 이루어져야하며 모든 요청은 클라이언트와 서버 사이의 대역폭을 두껍게 만듭니다.

필자는 MySQL 데이터베이스를 쿼리하고 동적으로 메뉴를 작성하는 PHP 함수를 사용하기로 결정했습니다. 이것은 ENUM 또는 SET 데이터 유형 열에서 사용될 때 이 열에 허용 된 문자열 그룹을 반환하는 MySQL 명령 DESCRIBE를 사용해야합니다. (위의 형식을 참조하십시오.) 이제 누군가가 어딘가에이 문제에 직면했음을 확신합니다. 그러나 매번 두 시간 씩 인터넷을 두 번 검색했습니다. 그리고 특히 PHP와는 다른 것을 발견하지 못했습니다. 그래서 나는 내 자신을 쓰기로 결정했다. 그것은나에게 2 일을 투옥했다. 그것은 오랫동안 나를 잡아서는 안되었을 것입니다. 그러나 저는 내 아내와 나의 아내와 함께 밴에있는 노트북에서 일하고 있었는데, 이것은 효율적인 프로그래머 서식지에 대한 Joel Spolsky의 규칙을 준수하는 환경이 아니 었습니다.

나는 나의 기능성 절단기를 호출한다. (코드에서이 값을 변경하는 것은 틀림 없습니다.) MySQL 테이블 이름 ($ table), MySQL 열 이름 ($ col_name) 및 $ row_length라는 정수가 세 개의 인수를 취합니다. $ row_length는 편리합니다. 나는 매우 큰 SET와 ENUM 열을 가지고있다. 데이터베이스; ENUM 중 하나가 모든 연방 당국을 열거합니다! 나는 깔끔함을 위해 각 라인에 표시되는 숫자를 제한합니다.

Choicemaker()는 DESCRIBE 쿼리의 결과를 검사하고 라디오 단추 (ENUM) 또는 확인란 (SET)을 빌드할지 여부를 결정하는 데 사용합니다. 이렇게하면 코드에서 결정을 내리지 않아도됩니다!여기

function choicemaker($table, $col_name, $row_length) 
    #connect to the database   
     {db_connect(); 
    #build the string for the DESCRIBE query -- note the absence of SELECT 
     $qry_list="DESCRIBE " . $table . " " . $col_name . ";"; 
    #submit the query 
     $listdisplay=mysql_query($qry_list);  
    #get the query results   
     while ($row = mysql_fetch_array($listdisplay)){ 
    #there will only be one row of results 
      $make_list=$row[1]; 
    #we need to get rid of some punctuation from the results  
      $remove = array("(", ")","'");     
      $replace = array("", "", "",""); 
    #important -- we inspect the query results to find out if we 
    #have SET or ENUM variables and then assign a value to $choice_type and 
    #get ready to remove either 'set' or 'enum' from the results string 
       if (preg_match("/^set/", $make_list)){ 
        array_unshift($remove, 'set'); 
        $choice_type="checkbox";} 
        elseif (preg_match("/^enum/", $make_list)){ 
          array_unshift($remove, 'enum'); 
          $choice_type="radio";} 
    #here we clean up the query results 
       $arr_list = str_replace($remove, $replace, $make_list); 
    #make get redy to loop through the clean results 
       $arr_list = explode(',',$arr_list); 
       $row_pos=$row_length; 
    #finally, we get to make some buttons or boxes    
         foreach ($arr_list as $item) { 
           $str_choice = $item . ' '; 
           $str_choice .= '<input type="' . $choice_type . '" '; 
           $str_choice .= 'name="' . $col_name . '" '; 
           $str_choice .= 'value="' . $item . '" /> '; 
    #output our button/box here            
           echo $str_choice; 
    #decrement $row_pos to decide if it is time to output a line break        
           $row_pos--; 
           if ($row_pos == 0) { 
           echo('<br />'); 
    #reset $row_pos after every break        
           $row_pos = $row_length;}}} 
    #Help stop connection pollution! Always close your connections!       
      mysql_close(); } 


Here's the uncommented version for cut and paste: 

      function choicemaker($table, $col_name, $row_length)   
        {db_connect(); 
        $qry_list="DESCRIBE " . $table . " " . $col_name . ";"; 
        $listdisplay=mysql_query($qry_list);         
        while ($row = mysql_fetch_array($listdisplay)){ 
          $make_list=$row[1]; 
          $remove = array("(", ")", "'");     
          $replace = array("", "", "",""); 
          if (preg_match("/^set/", $make_list)){ 
           array_unshift($remove, 'set'); 
           $choice_type="checkbox";} 
           elseif (preg_match("/^enum/", $make_list)){ 
             array_unshift($remove, 'enum'); 
             $choice_type="radio";} 
          $arr_list = str_replace($remove, $replace, $make_list); 
          $arr_list = explode(',',$arr_list); 
          $row_pos=$row_length; 
            foreach ($arr_list as $item) { 
              $str_choice = $item . ' '; 
              $str_choice .= '<input type="' . $choice_type . '" '; 
              $str_choice .= 'name="' . $col_name . '" '; 
              $str_choice .= 'value="' . $item . '" /> ';     
              echo $str_choice; 
              $row_pos--; 
              if ($row_pos == 0) { 
              echo('<br />'); 
              $row_pos = $row_length;}}} 
         mysql_close(); } 

내 질문이있다 :이 코드 페이지를 구축하기 위해 약 30 번 실행됩니다 주어, 정말 AJAX에서이 작업을 수행하기 위해 빨리 어떤 것입니까? 사용자는 최소한 30 분 정도 걸리므로 상단 부분이 더 빨리 구축되도록 과 관련된 실제 성능 향상은 없습니다. 나는 사용자 경험이 훨씬 더 좋을 것이라고 생각하지 않는다. 하지만 AJAX 버전은 어떻게 보이나요? 결과를 JSOBN에서 다시 가져 와서 구문 분석 할 수 있습니까?

답변

1

만약 내가 당신이라면이 템플릿을 캐시에 넣거나 PHP 파일을 생성기로 사용하십시오. 동적으로 enum 유형을 쿼리하는 목적은 무엇입니까? Ajax를 사용하면로드 속도가 빨라지 지 않으며 속도가 느려질 수도 있지만 처음 10 개를로드 한 다음 두 번째 10 개를로드 할 수 있으므로 사용자는 실제로 작동하는 것을 볼 수 있고 완료되기 전에 상호 작용할 수 있습니다 완전히로드. 로딩 시간이 큰 문제라고 생각하지 않습니다.

0

열거 형 및 설정 데이터 유형에서 메뉴를 작성해야하는 이유는 최소한 내 응용 프로그램의 처음 2 년 동안 이러한 데이터 유형이 확장되고 너무 많아서 (30 개 이상) 만드는 것입니다. 코드에서 새로운 것을 계속 추가하는 것이 효율적입니다. 데이터베이스에 추가하면 코드가 동적으로 메뉴를 생성하므로 많은 시간을 절약 할 수 있습니다.

관련 문제