15.05.2017, 12:50
|
|
Интересующийся
|
|
Регистрация: 15.05.2017
Сообщений: 12
|
|
Отправка выбора Select в data-group
Есть 2 таблицы mysql.
Первая: sortable в ней колонки ord(отвечает за позицию) id(ai) nick(Varchar имя) rank_name(Varchar должность)
Вторая: sortable2 в ней колонка rank(Varchar unicode_ci) в ней написаны значения которые должны отправляться при выборе в data-group элемента в котором был сделан выбор..
Вот php:
<?php include( 'db_connection.php' );
$select = "SELECT * FROM sortable, sortable2 ORDER BY ord, rank ASC";
echo mysql_error();
$perform = mysql_query( $select );
echo mysql_error();
while( $array = @mysql_fetch_array( $perform ) ){
$id = $array['id'];
$rank = $array['rank'];
$nick = $array['nick'];
$rank_name = $array['rank_name'];
?>
<?php require "body.php" ?>
<?php
}
?>
Вот то что в body.php
<figure class="portfolio-item" data-groups='["<?php echo $rank ?>"]'>
<figcaption>
<div class="col-md-4" id='item-<?php echo $id ?>'>
<strong class="st-member-name"><?php echo $nick ?></strong>
<p class="st-member-pos"><?php echo $rank_name ?></p>
////тут много много <div> </div>
</div>
</div>
<select> <option value="<?php echo $rank ?>"><?php echo $rank_name ?></option>
</select>
</div>
</div>
</div>
</figcaption>
</figure>
Фильтры вынесены каждый на кнопку т.е. при нажатии меняется.. Например жму на кнопку Водители и показывает анкеты водителей.. Жму грузчики.. Убирает водителей и показываются грузчики.. Так вот
У меня таких должностей 15 и получается страница "бесконечная" оно дублируется или умножает 15*15 и выводит например: nick Вася rank_name Грузчик 15 раз подряд.. ну с этим разберусь думаю тут чтото связано с UPDATE.. так вот в каждой Анкете человека я установила кнопку <select> в которой выбор все должности. И например Вася стал грузчиком а был водителем)) И должно сработать так чтобы отправило Васю из категории грузчики в категорию водители т.е. смена data-group фильтра самой анкеты где был сделан выбор произошла.. Помогите пожалуйста.. Я просто поставила себе такую задачу научится этому я не делаю не для предприятия не деньги за это не получу и т.д. я делаю для себя.. Вот хочу научится так чтобы при выборе в анкете всю анкету перемещало в другую data-group чтобы фильтр принимал ее там.. но я похоже не в том разделе создала надо было в php но может тут чтото с джейквери.. Мне ненужно чтобы написали мне код мне нужно помочь подтолкнуть что я делаю не так.. Да и думаю тем кто тут давно тоже интересно будет такая задачка но вам легко.. а мне нет я новенькая(
|
|
15.05.2017, 15:27
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
echo mysql_error(); - это зачем?
$perform = mysql_query( $select ) or die(здесь вывод ошибок, но выводить их нужно по условию отладки, а вываливать на страницу всем, это плохо);
while( $array = @mysql_fetch_array( $perform ) ){ - убрать собаку, и mysql_fetch_assoc, но $id = $array['id']; (и другие) в цикле будет означать, что после окончании цикла $id будет иметь значение последней записи. А вы чего хотите?
Расставьте акценты и приоритеты в описании. Многое чего вам хочется реализуется в рамках sql запроса.
|
|
15.05.2017, 16:09
|
|
Интересующийся
|
|
Регистрация: 15.05.2017
Сообщений: 12
|
|
Сообщение от laimas
|
echo mysql_error(); - это зачем?
$perform = mysql_query( $select ) or die(здесь вывод ошибок, но выводить их нужно по условию отладки, а вываливать на страницу всем, это плохо);
while( $array = @mysql_fetch_array( $perform ) ){ - убрать собаку, и mysql_fetch_assoc, но $id = $array['id']; (и другие) в цикле будет означать, что после окончании цикла $id будет иметь значение последней записи. А вы чего хотите?
Расставьте акценты и приоритеты в описании. Многое чего вам хочется реализуется в рамках sql запроса.
|
Убрала собаку теперь выводит только одну запись и то без параметров.. Да assoc помогает делала уже но потом чет переделала и забыла про него)) Да блин я просто хотела реализовать вот есть анкета.. Я беру выбираю категорию для анкеты и оно переносит анкету в другую категорию(в моем случае фильтр с дата группой).. Вот и все что я хотела сделать перерыла весь интернет.. Негде примеров схожего нет.. Мне просто нужно чтобы выбор селект переносил блок с анкетой и все.. это я уже намудрила знаю.. 2 таблицы даже сделала потому что мне нужно в отдельной держать должности латиницей потомучто я не понимаю как можно с одной например я хочу Вася чтобы был грузчиком а не водителем.. оно не возьмет данные
<form id="filter"><fieldset class="group"><label class="btn btn-default"><input type="radio" name="filter" value="Gruz4ik">Грузчик</label></fieldset>
</form>
где Gruz4ik это и есть то что записано во второй таблице то что и должно выводится вот сюда
<figure class="portfolio-item" data-groups='["<?php echo $rank ?>"]'>
Последний раз редактировалось Niliya, 15.05.2017 в 16:15.
|
|
15.05.2017, 16:40
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Niliya
|
Убрала собаку теперь выводит только одну запись и то без параметров..
|
Собака не управляет параметрами запроса, она блокирует вывод предупреждений. Нужно проверять результат запроса, а не блокировать предупреждения, что чревато дальнейшими ошибками.
Если запрос возвращает одну запись, зачем же while и select? Если это список должностей (не одна запись), то уже говорилось
$id = $array['id'];
$rank = $array['rank'];
$nick = $array['nick'];
$rank_name = $array['rank_name'];
это неверно. Цикл в этом случае должен быть в строке 09 кода выводящего список.
mysql_fetch_array возвращает два идентичных набора из ресурса, один из которых индексный массив, а второй ассоциативный. Вы используете ассоциации, зачем же получать два набора? Либо используя mysql_fetch_array указывайте вторым параметром нужный набор, либо сразу получать нужное mysql_fetch_assoc.
Приведите дампы таблиц своих (значений много не надо, 3-4 записи хватит), иначе еще туманнее чего надо, ибо таблицы не создаются по принципу "латиница значит другая таблица".
|
|
15.05.2017, 17:07
|
|
Интересующийся
|
|
Регистрация: 15.05.2017
Сообщений: 12
|
|
Сообщение от laimas
|
Собака не управляет параметрами запроса, она блокирует вывод предупреждений. Нужно проверять результат запроса, а не блокировать предупреждения, что чревато дальнейшими ошибками.
Если запрос возвращает одну запись, зачем же while и select? Если это список должностей (не одна запись), то уже говорилось
$id = $array['id'];
$rank = $array['rank'];
$nick = $array['nick'];
$rank_name = $array['rank_name'];
это неверно. Цикл в этом случае должен быть в строке 09 кода выводящего список.
mysql_fetch_array возвращает два идентичных набора из ресурса, один из которых индексный массив, а второй ассоциативный. Вы используете ассоциации, зачем же получать два набора? Либо используя mysql_fetch_array указывайте вторым параметром нужный набор, либо сразу получать нужное mysql_fetch_assoc.
Приведите дампы таблиц своих (значений много не надо, 3-4 записи хватит), иначе еще туманнее чего надо, ибо таблицы не создаются по принципу "латиница значит другая таблица".
|
Понимаю я уже сама запуталась.. Вот дамп))
Первая таблица:
INSERT INTO `sortable` (`ord`, `id`, `nick`, `rank_name`) VALUES
(2, 2, 'Федя', 'Грузчик'),
(3, 3, 'Петя', 'Водитель'),
(4, 4, 'Маша', 'Оператор');
Вторая таблица:
INSERT INTO `sortable2` (`rank`) VALUES
('Gruz4ik'),
('Voditel'),
('Operator'),
|
|
15.05.2017, 17:32
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
У вас вторая таблица никоим образом не связана с первой, то есть, запрос
SELECT * FROM sortable, sortable2
еще не означает, что он вернет 'Федя', 'Грузчик', 'Gruz4ik'.
Зачем хранить это в другой таблице, это вполне можно хранить и в одной. Зачем вообще нужно иметь 'Грузчик' и 'Gruz4ik'?
Вам нужно прочесть о нормализации, этим руководствуются при проектировании баз данных. Федя это субъект, а 'Грузчик', 'Водитель', 'Оператор' должность, которую он может иметь, как и другие субъекты Петя, Маша и т.д., то должности и должны быть описаны в другой таблице связанной с первой по идентификатору. Можно и в одной таблице описать и субъектов и должности - полем типа ENUM. Но такой подход оправдан в том случае, если список должностей фиксирован, не изменяется во времени.
То есть вам надо сначала иметь грамотную структуру таблиц исходя из ваших данных. Тогда и остальные вопросы будут разрешимы.
|
|
15.05.2017, 18:06
|
|
Интересующийся
|
|
Регистрация: 15.05.2017
Сообщений: 12
|
|
Сообщение от laimas
|
У вас вторая таблица никоим образом не связана с первой, то есть, запрос
SELECT * FROM sortable, sortable2
еще не означает, что он вернет 'Федя', 'Грузчик', 'Gruz4ik'.
Зачем хранить это в другой таблице, это вполне можно хранить и в одной. Зачем вообще нужно иметь 'Грузчик' и 'Gruz4ik'?
Вам нужно прочесть о нормализации, этим руководствуются при проектировании баз данных. Федя это субъект, а 'Грузчик', 'Водитель', 'Оператор' должность, которую он может иметь, как и другие субъекты Петя, Маша и т.д., то должности и должны быть описаны в другой таблице связанной с первой по идентификатору. Можно и в одной таблице описать и субъектов и должности - полем типа ENUM. Но такой подход оправдан в том случае, если список должностей фиксирован, не изменяется во времени.
То есть вам надо сначала иметь грамотную структуру таблиц исходя из ваших данных. Тогда и остальные вопросы будут разрешимы.
|
Да я видимо не так обьясняю чтото))
Связала идентификаторами как вы сказали вот что получилось во второй таблице.. Я не знаю что такое ENUM но как поняла оно мне не подходит у меня постоянно например будут меняться должности и анкета будет переходить в другую data_group.. в одну я не могу сделать потомучто опять же мне прийдется каждого нового человека например записывать в mysql напрямую таким образом можно и менять то что есть напрямую через таблицу а я хочу сделать чтобы через админку можно было просто щелчком select менять категорию и все.. Хотела изначально просто сделать Вот есть анкета.. Я беру жму добавить - повляется новая анкета я выбираю там должность и вписываю имя и оно создается.. но после того как прочитала гору ненужных и бесполезных энциклопедий в которых например хотела понять что такое JSON а поняла только что она основана Дугласом Крокфордом в 1999 году забила голову ненужной информацией изза этого и сейчас в голове одна каша которую я не могу теперь применить.. Скрипт я этот взяла а не сама писала.. это с сайта где учили как делать drag n drop с сохранением в базу. я просто вырезала сам .draggable скрипт и оставила только чтобы сохраняло в базу.. Вот изза этой каши в голове я не могу нечего реализовать.. Вроде знаю достаточно а применить просто не могу.. Мне ненужно больше нечего мне нужно только сделать чтобы анкета перемещалась на кнопку в другую категорию и все.. остальные мне знания ненужны там дальше верстка просто все проще с базами mysql я не когда не работала потому не могу понять что она хочет от меня.. опять же прочитала кучу энциклопедий как выбирать то и где что надо - опять одна каша и я запуталась уже.. мне нужно легкое действие а информации впитала в себя наверно уже терабайт ненужной))) Вот так сделала как вы сказали.. добавила идентификатор.
INSERT INTO `sortable2` (`rank`, `id`) VALUES
('Gryz4ik', 1),
('Voditel', 2),
('Operator', 3),
Я видимо обьяснять не умею вот покажу картинкой что имею ввиду)) Я просто не хочу изучить еще килотонну ненужной мне информации ради одного действия
Последний раз редактировалось Niliya, 15.05.2017 в 18:16.
|
|
15.05.2017, 18:42
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Очень трудно читать когда все кучей одним абзацем. Трудно вникать и отделить главное от второстепенного. Поэтому напишу примеры.
Если вторая таблица связана с первой по идентификатору, тогда поучить записи из второй таблицы связанной с первой, это
SELECT * FROM sortable
LEFT JOIN sortable2
USING(id)
ORDER BY ord
Сортировать запрос по полю rank второй таблицы нет смысла, так как первичная сортировка производится по полю ord первичной таблицы, с которым из второй таблицы будет связана только одна запись.
Насколько я понял таблица sortable2 вообще лишняя, ее записи должны быть помещены в таблицу sortable. Но тут возникают два вопроса: 1) что такое rank_name, 2) что такое rank.
Если одно и тоже значение rank_name могут иметь многие несколько субъектов, то это список. Если это список который может динамически добавляться, то выгоднее его описывать в связанной таблице. Если же это уникальные значения у каждого субъекта, то оперировать списком нельзя, если только не вывести такой ради информации.
Если rank_name это список, но фиксированный, то есть кроме этих трех значений более нет и не предвидится, то такие данные удобно хранить в поле типа ENUM. Это текстовое представление данных, но во внутреннем представлении, это числа, которыми и оперирует SQL.
То же самое относится и к полю rank.
Если rank_name и rank это все таки списки, и связанные, то для субъекта изменение значения из первого должно автоматически менять и значение и из второго.
На эти вопросы вы так и не даете ответов, а от этого многое зависит. Постановка же вопроса "мне нужно только сделать чтобы анкета перемещалась на кнопку в другую категорию и все" вообще не понятна: что такое категория, что значит переместить анкету в другую категорию - сменить значения rank? Тогда почему rank_name не является в вашем выводе списком (если это действительно список) и не изменяется, эти значения не связаны?
Не пишите о drag&drop и прочем не имеющем отношения к вопросу, дайте лучше ответы на вопросы, и конкретно что есть что.
Последний раз редактировалось laimas, 15.05.2017 в 18:47.
|
|
15.05.2017, 19:29
|
|
Интересующийся
|
|
Регистрация: 15.05.2017
Сообщений: 12
|
|
Сообщение от laimas
|
Очень трудно читать когда все кучей одним абзацем. Трудно вникать и отделить главное от второстепенного. Поэтому напишу примеры.
Если вторая таблица связана с первой по идентификатору, тогда поучить записи из второй таблицы связанной с первой, это
SELECT * FROM sortable
LEFT JOIN sortable2
USING(id)
ORDER BY ord
Сортировать запрос по полю rank второй таблицы нет смысла, так как первичная сортировка производится по полю ord первичной таблицы, с которым из второй таблицы будет связана только одна запись.
Насколько я понял таблица sortable2 вообще лишняя, ее записи должны быть помещены в таблицу sortable. Но тут возникают два вопроса: 1) что такое rank_name, 2) что такое rank.
Если одно и тоже значение rank_name могут иметь многие несколько субъектов, то это список. Если это список который может динамически добавляться, то выгоднее его описывать в связанной таблице. Если же это уникальные значения у каждого субъекта, то оперировать списком нельзя, если только не вывести такой ради информации.
Если rank_name это список, но фиксированный, то есть кроме этих трех значений более нет и не предвидится, то такие данные удобно хранить в поле типа ENUM. Это текстовое представление данных, но во внутреннем представлении, это числа, которыми и оперирует SQL.
То же самое относится и к полю rank.
Если rank_name и rank это все таки списки, и связанные, то для субъекта изменение значения из первого должно автоматически менять и значение и из второго.
На эти вопросы вы так и не даете ответов, а от этого многое зависит. Постановка же вопроса "мне нужно только сделать чтобы анкета перемещалась на кнопку в другую категорию и все" вообще не понятна: что такое категория, что значит переместить анкету в другую категорию - сменить значения rank? Тогда почему rank_name не является в вашем выводе списком (если это действительно список) и не изменяется, эти значения не связаны?
Не пишите о drag&drop и прочем не имеющем отношения к вопросу, дайте лучше ответы на вопросы, и конкретно что есть что.
|
Да я поняла.. Отвечаю на все вопросы начав все заного.. С исправлениями которыми вы советовали.. И так..
Дамп таблицы:
CREATE TABLE IF NOT EXISTS `sortable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nick` varchar(155) COLLATE utf8_unicode_ci NOT NULL,
`rank_name` varchar(155) COLLATE utf8_unicode_ci NOT NULL,
`rank` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16 ;
INSERT INTO `sortable` (`id`, `nick`, `rank_name`, `rank`) VALUES
(1, 'Федя', 'Грузчик', 'one'),
(2, 'Вася', 'Водитель', 'two'),
(3, 'Гена', 'Оператор', 'three');
Дамп переписала русские слова в ручную потомучто выдало там где ру Гена и все такое хотя кодировка UTF-8
Есть фильтр:
<form id="filter">
<fieldset class="group">
<label class="btn btn-default"><input type="radio" name="filter" value="one">Грузчик</label>
<label class="btn btn-default"><input type="radio" name="filter" value="two">Водитель</label>
<label class="btn btn-default"><input type="radio" name="filter" value="three">Оператор</label>
</fieldset>
</form>
Есть php скрипт который содержится в index.php
<?php
include( 'db_connection.php' );
$select = "SELECT * FROM sortable ORDER BY id ASC"; // select every element in the table in order by order column
//echo mysql_error();
$perform = mysql_query( $select ); //perform selection query
//echo mysql_error();
while( $array = @mysql_fetch_assoc( $perform ) ){ //download every row into array
$id = $array['id'];
$rank = $array['rank'];
$nick = $array['nick'];
$rank_name = $array['rank_name'];
?>
<?php require "body.php" ?>
<?php
}
?>
Тут поменяла ток assoc все работает
Есть часть кода в body.php
<figure class="portfolio-item" data-groups='["<?php echo $rank ?>"]'>
<figcaption>
<div class="col-md-4" id='item-<?php echo $id ?>'>
<strong class="st-member-name"><?php echo $nick ?></strong>
<p class="st-member-pos"><?php echo $rank_name ?></p>
Чуть ниже по коду..
<select>
<option value="three">Грузчик</option>
<option value="two">Водитель</option>
<option value="three">Оператор</option>
</select>
Нужно - при изменении <option> меняется -
<filter data-groups='["СЮДА ВЫВОДИТСЯ ТО ЧТО В БЫЛО ВЫБРАНО В <option value="*"> "]'>
Пример: Выбираю id=1 nick = Вася rank_name = Грузчик rank=one.. Выбираю в <option> Водитель(rank_name) и ему соответствует rank = two и само "TWO" должно echo вписать и получится <filter data-groups='["two"]'> и оно сработает и вася уже стал грузчик.. Вот что я хочу.. Ответила на все вопросы))
Вот так
Последний раз редактировалось Niliya, 15.05.2017 в 19:32.
|
|
15.05.2017, 20:44
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Не цитируйте мои комменты полностью, зачем?
Если ваша база для работы только с русским и английским, то выгоднее не
utf8_unicode_ci, а utf8_general_ci.
Чтобы был корректный вывод из базы, а не Гена, нужно указывать кодировку соединения сразу после соединения с базой:
mysql_query("SET NAMES utf8");
Естественно, также должна определятся и кодировка страниц. Если предполагается использование функций для работы с многобайтными строками, то можно сразу и для них определить кодировку
mb_internal_encoding("UTF-8");
$select = "SELECT * FROM sortable ORDER BY id ASC"; // select every element in the table in order by order column
//echo mysql_error();
$perform = mysql_query( $select ); //perform selection query
//echo mysql_error();
while( $array = @mysql_fetch_assoc( $perform ) ){...
Я уже писал, что это плохо и чревато последствиями, почему продолжается?
Сообщение от Niliya
|
Ответила на все вопросы
|
Нет. Я вам уже дважды пытался пояснить что требуется - что такое rank_name? Во-первых именование поля не понять о чем, и вы не даете пояснений.
Пусть в некой фирме определены всего четыре должности и иных должностей не предвидится. В данном случае все можно описать одной таблицей используя для описания должностей поле типа ENUM:
Код:
|
CREATE TABLE `structure` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL COMMENT 'Имя',
`post` enum('Шеф','Бухгалтер','Бригадир','Рабочий') NOT NULL COMMENT 'Должность',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7;
INSERT INTO `structure` (`id`, `name`, `post`) VALUES
(1, 'Василий', 'Шеф'),
(2, 'Ангелина', 'Бухгалтер'),
(3, 'Петрович', 'Бригадир'),
(4, 'Николай', 'Рабочий'),
(5, 'Иваныч', 'Рабочий'),
(6, 'Кузьмич', 'Рабочий'); |
Внутренняя структура этого типа данных будет такой:
1 - Шеф
2 - Бухгалтер
3 - Бригадир
4 - Рабочий
Если в выборке указать поле post, то будет выведено соответственное значение как Бухгалтер, Рабочий и т.д., которое определено субъекту. Если же запросить значение этого поля как post+0 post (в старых версиях MySQL так post+0 AS post), то получим не текстовое значение этого поля, а числовое, то есть от 1 до 4, соответственно определенному.
Для того чтобы в форме оперировать этим полем как списком (при добавлении/редактировании субъектов), можно получить структуру этой таблицы, ее поля post и получим список
<select>
<option value="">Выберите ...</option>
<option value="1">Шеф</option>
<option value="2">Бухгалтер</option>
<option value="3">Боигадир</option>
<option value="4">Рабочий</option>
</select>
При этом, если редактирование, то при выводе таблицы из базы можно получать как текстовое значение поля post так и числовое, сравнивая которое в цикле при построении списка со значениями ENUM отметь в списке должность рабочего (selected). Хотя можно проверять и равенство текстовых значений.
Записываться в базу при этом будет числовое значение. Это позволяет облегчить проверку ожидаемых данных.
Если же должности предполагают дополнения/изменения, то хранить их в поле типа ENUM не выгодно. В этом случае такие данные описывают в связанной таблице. Но если взять этот пример, то в результате получим такой же список, где число будет являться идентификатором этой таблицы. Поле post основной таблицы будет также будет содержать этот идентификатор. Если отношения Таблицы должностей и основной таблицы более сложные, то их связи описываются внешней таблицей связей.
То есть не нужно никаких "телодвижений" для того, что из одного набора переместить выбор в другой набор, достаточно просто выбора в списке, который и нужно отправлять серверу.
Разберитесь в конце концов что за данные у вас, каково их назначение и создайте нормальную их структуру. Я так и не понял что к чему у вас.
Записи в базе типа 1, 'Федя', 'Грузчик', 'one', это искусственное создание проблем. Если я правильно понял из описанного вами.
|
|
|
|