Я делаю веб-страницу для ввода данных на 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 и проанализировать их?