Доброго дня! Делаю курасч, онлайн голосование.. В этом деле новичок, еще учится и учится, но наткнулся на проблему, которую в одиночку решить не смогу... В двух словах - есть таблица "кандидаты", в которой хранятся данные: имя, фамилия и факультет... Данные из таблицы выводит циклом, и получается что-то типа этого Воот, рядом с ним есть поле +/- Нажимаешь на лайк, он перебрасывает в plus.php, где считывает id кандидата ну а там идет цикл, считывает, ии записывает в отдельную таблицу Код (Text): if(isset($_GET['plus'])) { $id = $_GET['plus']; $query = "SELECT * FROM candidate WHERE candidate_id='$id'"; $run = mysql_query($query); while ($row=mysql_fetch_array($run)) { $candidate_id = $row['candidate_id']; $candidate_name = $row['candidate_name']; $candidate_surname = $row['candidate_surname']; $candidate_faculty = $row['candidate_faculty']; $sqlb = mysql_query("INSERT INTO voting_results (`student_name`, `candidate_name`, `candidate_surname`, `candidate_faculty`, `result_value`) VALUES ('$_SESSION[student_name]', '$row[candidate_name]', '$row[candidate_surname]', '$row[candidate_faculty]', '+')") or die (mysql_error()); } } впрочем вот, записывает он практически то же, только в добавку идет: `student_name` - имя студента, за которого он зашел - $student_name = $_SESSION['student_name']; `result_value`- значение, если нажал на лайк, то записывает +, если дислайк, то минус вот и подобрались к вопросу: надо сделать так, чтобы по нажаию лайка, данный студент пропал из общего списка как я понял, надо сравнивать таблицы - "candidate" с "voting_results" и если во второй таблице нет имени, которое есть в первой - он выводит оставшейся имена, пока "voting_results" не будет равен с "candidate", НО ПРИ ЭТОМ НАДО УЧИТЫВАТЬ, ЧТО КАЖДЫЙ СТУДЕНТ ИМЕЕТ ГОЛОСОВАТЬ.. ухх, надеюсь меня поняли... Заранее спасибо, надеюсь на вашу помощь
1. а тек то голосует, они кто? они из этой таблицы? или это люди с улицы? если с улицы, совсем с улицы или они должны быть зарегистрированы? 2. те кто голосует, сколько раз они могут проголосовать? один раз или сколько угодно? и вопрос от себя, просто интересно, что за институт где учат РНР? и как называется факультет.
1) они студенты университета, есть отдельная база, у них там есть свой логин и пароль они входят и их перебрасывают на список кандидатов (тот что в скрине) 2) один раз за каждого человека... тоесть, я студент, зашел со своим студенческим: st120229, ввёл пароль, поставил лайк за андрея - он пропал из общего списка, но результат, что я поставил лайк, записал в другую таблицу... зайдя другой студент, он этого андрея должен выдить, - а я нет эмм, я не из России, так что мой ответ навряд ли подскажет, но php нас не учили... я сам выбрал php, ибо интересует именно веб-программирование
т.е. те кто голосует могут проголосовать очень много раз, а точнее пока не закончится список кандидатов? или все же можно проголосовать определенное количество раз, например 10. в чем тогда смысл, зашел раз, проголосовал за всех и все..
нет, всего один раз, я студент (st120229) за андрея хочу лайкк а инна мне не нравится, я жму дислайк (палец вниз) и эти двое для меня больше не показываются, а если зашел другой студент , например ты то ты можешь голосовать заново, это онлайн голосование, ток вместо регистрации у меня уже есть определенное количество студентов я не говорю, что система должна быть именно по нажатию, главное, что один студент может голосовать за весь список, но при этом ставить (плюс/минус/ или 0 (нейтрал, тоесть пропускает этого чувака)) готов принять любые решения
пфф... Ладно, я зашел, мой номер студенческого st777 (ну а какой еще?) есть список: 1. Вася 2. Федя 3. Тоня 4. Мальвина 5. Петрович я поставил лайк Мальвине и дислайк Петрович. После этого я (со своим студенческим st777) смогу поставить лайк / дислайк допустим Васе? (или еще кому то кроме Мальвины и Петровича) То что кто то другой со студенческим st325457645 сможет проголосовать после меня за Мальвину и Петровича это я уже понял. И еще такой вопрос, т.е. если я кому то поставил лайк, дислайк я ему уже не могу поставить? (и на оборот)
или нейтралку, нолик.. еще не придумал, но должен быть еще третий вариант - проигнорировать, НОО ДА, ТЫ МОЖЕШЬ ПРОГОЛОСОВАТЬ ЗА ВАСЮ после того как голоснул за петровича и мальвину точно! ты поставил, он пропадает из общего списка РАНЬШЕ У МЕНЯ СТОЯЛ ВОТ ТАКОЙ ВОТ вариант, но там я наткнулся на проблему, что записывает только последнее значение, (тоесть если я андрею поставил лайк, то и всем остальным он записывал лайк)
опять 25. Допустим я могу ставить только лайки (для легкости объяснения) т.е. я захожу, вижу список всего из 5 персонажей: ставлю ВСЕМ им лайки и это нормально? или может у одного студента всего 1 голос?
прости :с видать не поняллл, ну, в лучшем случае было бы сделать так, что можно голосовать только за ТРОИХ из одного факультета... 1. Вася - ИЗ DMF 2. Федя - ИЗ DMF 3. Тоня - ИЗ DMF 4. Мальвина - ИЗ DMF 5. Петрович - ИЗ DMF 6. Нина - ИЗ HF за васю - лайк за федю - лайк за петровича - дислайк ТРОЕ ИЗ ОДНОГО ФАКУЛЬТЕТА ПРОГОЛОСОВАЛИ, остальные (мальвина и тоня) пропали дальше другие кандидаты пошли остлальных факультетов, всего их пять: DMF, HF, IVF, MMF, SZF
Мутное какое то голосование, ну да ладно. Я вижу это так: есть 3 таблицы, первая, это все студенты (students) типа: 1. ИД (ид студента получается) 2. номер студенческого 3. фамилия 4. имя 5. факультет .. возможно еще какие то поля. вторая это голосование (voting): 1. ИД записи 2. ИД студента (из первой таблицы берется) 3. фамилия 4. имя 5. факультет 6. лайки 7. дислайки третья таблица связующая (название - таблица без названия): 1. ИД записи 2. ИД студента (из первой таблицы берется) 3. лайки 4. дислайки в этой таблице "лайки" и "дислайки" это текстовые поля куда ты тупо через пробел записываешь кому конкретный студент поставил "лайки" или "дислайки", записываешь ИДы т.е. у тебя есть список на голосование: я поставил лайк Феде и Мальвине, т.е. у меня в 3-м столбе будет такое: дальше при выводе списка за кого голосовать ты сначала по конкретному студенту получаешь список за кого он уже голосовал, т.е. из 3-й таблицы вытаскиваешь лайки при помощи функции explode запись типа "2 4" превращаешь в массив: Код (Text): array('2', ''4); и потом при выводе списка ты сверяешь если, ID есть в этом массиве, то запись пропускаешь, если нет, печатешь Добавлено спустя 9 минут 17 секунд: Что то не понятно?
ааа как все сложно перечитал дюжину раз, нифига не понял нельзя только ИД студенческкий номер, и пароль? типа кандидаты? кандидаты и студенты отличаются, кандидат будет штук 20-30 а студент около 600 ухх, а можешь пожалуйста написать сам код? ну или хотя бы часть его?
Код (PHP): // такой ответ будет если вытащить все содержимое таблиц: // список студентов $students = array( array('id' => '1', 'sn' => 'st777', 'first_name' => 'Семен', 'last_name' => 'Семенов', 'faculty' => 'DMF' ), array('id' => '2', 'sn' => 'st435', 'first_name' => 'Николай', 'last_name' => 'Николаев', 'faculty' => 'DMF' ) ); // голосование, оно не совсем так составлено как должно быть, т.к. все в нем перечисленные должны же быть студентами, т.е. быть в таблице $students $voting = array( array('id' => '1', 'name' => 'Петя', 'faculty' => 'DMF', 'like' => '0', 'dislike' => '0'), array('id' => '2', 'name' => 'Вася', 'faculty' => 'DMF', 'like' => '1', 'dislike' => '0'), array('id' => '3', 'name' => 'Тоня', 'faculty' => 'DMF', 'like' => '0', 'dislike' => '0'), array('id' => '4', 'name' => 'Федя', 'faculty' => 'DMF', 'like' => '1', 'dislike' => '0') ); // тут учитывается кто за кого голосовал $xx = array( array('id' => '1', 'student_id' => '1', 'like' => '2 4', 'dislike' => ''), // это студент Семен Семенов из таблицы $students, он уже поставил 2 лайка за Васю и Федю array('id' => '1', 'student_id' => '2', 'like' => '', 'dislike' => '') // это студент Николай Николаев из таблицы $students ); Код (PHP): //тут пользователь со студенческим st777 хочет поставить еще лайк // сначала мы получаем из $voting его запись т.е. нас интересует за кого он уже голосовал: $liked = $xx[0]; // - array('id' => '1', 'student_id' => '1', 'like' => '2 4', 'dislike' => '') // из всего этого нас интересует только $liked['like'] $liked = $liked['like']; // - '2 4' // переводим в массив: $liked = explode(' ', $liked); // т.е. мы получаем массив array( '2', '4' ) // печатаем таблицу для пользователя : foreach ($voting as $user) { if ( array_search($user['id'], $liked) !== false ) { continue; } else { echo "<div>{$user['name']} | {$user['faculty']} | {$user['like']} | {$user['dislike']} </div>"; } }
фигасее, просмотрел, вроде принцип понял, но все ужасно сложно, ахах а полегче вариантов нет? без массива?
сложно? это самый просто вариант решения вопроса (который приходит в голову) и что такого сложного с массивом? и о каком именно массиве идет речь?
не понял именно цикл вывода, с массивом что как присвает - все понятно, а цикл вывода, - как китайский алфавит ну и не могу догнать как это сделать с подключением к базе может я туплю и задаю не те вопросы, ибо изучаю php+mysql чуть больше недели но факт остается фактом - не понимаю я :с
ты когда делаешь запрос в БД (например получить все записи в таблице) ты ответ в виде чего получаешь?
Код (Text): $query = "SELECT * FROM candidate ORDER by candidate_faculty"; думаю в виде переменной не поверишь - все равно не понимаю как это можно связать /рукалицо/
В качестве ответа ты получаешь дескриптор, который ты потом переводишь в ассоциативный массив при помощи метода fetch_assoc, где ключ это название столбца, а значение это значение и оно выгляди так, как я писал выше: Код (PHP): // такой ответ будет если вытащить все содержимое таблиц: // список студентов $students = array( array('id' => '1', 'sn' => 'st777', 'first_name' => 'Семен', 'last_name' => 'Семенов', 'faculty' => 'DMF' ), array('id' => '2', 'sn' => 'st435', 'first_name' => 'Николай', 'last_name' => 'Николаев', 'faculty' => 'DMF' ) ); // голосование, оно не совсем так составлено как должно быть, т.к. все в нем перечисленные должны же быть студентами, т.е. быть в таблице $students $voting = array( array('id' => '1', 'name' => 'Петя', 'faculty' => 'DMF', 'like' => '0', 'dislike' => '0'), array('id' => '2', 'name' => 'Вася', 'faculty' => 'DMF', 'like' => '1', 'dislike' => '0'), array('id' => '3', 'name' => 'Тоня', 'faculty' => 'DMF', 'like' => '0', 'dislike' => '0'), array('id' => '4', 'name' => 'Федя', 'faculty' => 'DMF', 'like' => '1', 'dislike' => '0') ); // тут учитывается кто за кого голосовал $xx = array( array('id' => '1', 'student_id' => '1', 'like' => '2 4', 'dislike' => ''), // это студент Семен Семенов из таблицы $students, он уже поставил 2 лайка за Васю и Федю array('id' => '1', 'student_id' => '2', 'like' => '', 'dislike' => '') // это студент Николай Николаев из таблицы $students ); можешь считать что это полученные из БД ответ переведенный в ассоциативный массив.
так и хочется ругнуться, ибо я чайник)) прости буду тупить: название столбца в базе? типа этого? : и что такое ключ? ахах, все стало еще запутанней, надо бы пойти массивы повторить, узнать про функции, ибо такие слышу первый раз, даже не представляю что с ними делать и куда пихать *_* блеск
апдейт а можно выводить по одному кандидату и голосовать по одному? тоесть вывел первого студент проголосовал и проходит к следующему? как сделать этот проход?
Я бы базу так организовал: STUDENTS: id студента Имя Фамилия Факультет VOTING: id студента id голосовавшего оценка (+1 или -1) Посмотреть, за скольких студентов с факультета вы уже проголосовали: select count(voting.*), students.faculty from voting, students where voting.voter_id = $my_id and voting.student_id = students.student_id group by students.faculty