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

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

Это тип данных ENUM: car_titled_in_state = enum ('Алабама', 'Аляска', 'Арканзас', 'Калифорния') Вы можете называть автомобиль только в одном штате. MySQL не позволит вам войти более чем в одно состояние в car_titled_in_state. (Код обработки ошибок для обозначения автомобиля в большем количестве состояний - это функция тюрьма_терм (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 и проанализировать их?

13.10.2009 02:58:18
2 ОТВЕТА

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

1
13.10.2009 03:36:06

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

0
18.10.2009 05:56:40