Используйте команду PHP и MySQL DESCRIBE для динамического создания меню флажков и переключателей. - PullRequest
1 голос
/ 13 октября 2009

Я делаю веб-страницу для ввода данных на PHP, которая проверяет и анализирует данные для ввода в базу данных MySQL. В базе данных более 30 столбцов, состоящих из данных MySQL SET или ENUM. Если вы не знаете много SQL, столбец типа данных ENUM может содержать только одно значение из коллекции переменных ENUM, которые вы определяете при создании базы данных. SET также является коллекцией переменные, которые вы определяете при создании базы данных, но столбец SET может содержать один или несколько SET переменные.

Это тип данных ENUM: car_titled_in_state = enum («Алабама», «Аляска», «Арканзас», «Калифорния») Вы можете назвать автомобиль только в одном штате. MySQL не позволит вам войти более чем в одно состояние в car_titled_in_state. (Код обработки ошибок для обозначения автомобиля в большем состоянии - это функция prison_term (NUM_YEARS). ; -)

Это тип данных SET: ice_cream_toppings = set («шоколадный сироп», «болотный мягкий крем», «вишня», «ириска»). Вы можете иметь любое количество начинки для мороженого, но каждый член набора может быть введен только и считается один раз. (Функция обработки ошибок для слишком большого количества долива мороженого - body_weight = body_weight ++.)

Радиокнопки, которые допускают только один выбор из группы, подходят для переменных ENUM. Флажки, которые допускают любое количество выборок из группы, подходят для переменных SET.

Создание этих меню построчно в моем PHP было бы хлопотно, потому что группы разрешенных переменных во многих из этих колонок MySQL будут меняться во время бета-тестирования и вплоть до первых месяцев производства; некоторые из них, вероятно, потребуется изменить снова в 2011 году. Эти изменения (много изменений) придется выполненный в коде PHP, плюс все эти запросы могут увеличить пропускную способность между клиентом и сервером.

Я решил, что буду использовать функцию PHP, которая запрашивает базу данных MySQL и динамически создает меню. Для этого потребуется использовать команду MySQL DESCRIBE, которая при использовании в столбцах типа данных ENUM или SET возвращает группу строк, разрешенных в столбце. (См. Выше для их формата.) Теперь я уверен, что кто-то где-то сталкивался с этой проблемой раньше, но я каждый раз искал в Интернете по два часа, и я не нашел ничего даже близко, особенно не в PHP. Поэтому я решил написать свой, который взял мне два дня. Наверное, это не должно было занять так много времени, но я работал на своем ноутбуке в фургоне с моя жена и мои родственники, которые не были в соответствии с правилами Джоэла Спольски для эффективные места обитания программиста.

Я вызываю мою функцию выбора. (Вы, несомненно, измените это в своем коде.) Это займет три аргументы: имя таблицы 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 и проанализировать их?

Ответы [ 2 ]

1 голос
/ 13 октября 2009

На вашем месте я бы кешировал это в шаблоне или использовал бы php-файл в качестве генератора, если не будет достаточно таблиц, которые будут запрошены. Какова цель динамического запроса типов enum? Ajax не заставит его загружаться быстрее, возможно, даже медленнее, но может позволить вам загрузить первые 10, затем вторые 10 и т. Д., Так что пользователь видит, что он действительно работает, и может взаимодействовать с ним до того, как он будет полностью погрузка. Я не думаю, что время загрузки будет большой проблемой.

0 голосов
/ 18 октября 2009

Причина, по которой мне нужно построить меню из enum и задать типы данных, заключается в том, что по крайней мере в течение первых двух лет моего приложения эти типы данных будут расширяться, и их слишком много (более 30), чтобы сделать его эффективным продолжать добавлять новые в коде. Добавление их в базу данных и возможность динамически генерировать меню для кода сэкономит МНОГО времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...