За последние 24 часа нас посетили 15579 программистов и 1550 роботов. Сейчас ищут 867 программистов ...

сравнить две почти одинаковые таблицы

Тема в разделе "PHP и базы данных", создана пользователем 3ay4ka, 19 сен 2014.

  1. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    Доброго дня!
    Делаю курасч, онлайн голосование.. В этом деле новичок, еще учится и учится, но наткнулся на проблему, которую в одиночку решить не смогу...
    В двух словах - есть таблица "кандидаты", в которой хранятся данные: имя, фамилия и факультет...
    Данные из таблицы выводит циклом, и получается что-то типа этого

    [​IMG]


    Воот, рядом с ним есть поле +/-
    Нажимаешь на лайк, он перебрасывает в plus.php, где считывает id кандидата
    ну а там идет цикл, считывает,
    ии записывает в отдельную таблицу

    Код (Text):
    1. if(isset($_GET['plus']))
    2. {
    3.     $id = $_GET['plus'];
    4.     $query = "SELECT * FROM candidate WHERE candidate_id='$id'";
    5. $run = mysql_query($query);
    6.    
    7.     while ($row=mysql_fetch_array($run))
    8.     {
    9.         $candidate_id = $row['candidate_id'];
    10.         $candidate_name = $row['candidate_name'];
    11.         $candidate_surname = $row['candidate_surname'];
    12.         $candidate_faculty = $row['candidate_faculty'];
    13.         $sqlb = mysql_query("INSERT INTO voting_results (`student_name`, `candidate_name`, `candidate_surname`, `candidate_faculty`, `result_value`)
    14.         VALUES ('$_SESSION[student_name]', '$row[candidate_name]', '$row[candidate_surname]', '$row[candidate_faculty]', '+')") or die (mysql_error());
    15.  
    16.     }  
    17. }
    впрочем вот,
    записывает он практически то же, только в добавку идет:
    `student_name` - имя студента, за которого он зашел - $student_name = $_SESSION['student_name'];
    `result_value`- значение, если нажал на лайк, то записывает +, если дислайк, то минус

    вот и подобрались к вопросу:
    надо сделать так, чтобы по нажаию лайка, данный студент пропал из общего списка
    как я понял, надо сравнивать таблицы - "candidate" с "voting_results" и если во второй таблице нет имени, которое есть в первой - он выводит оставшейся имена, пока "voting_results" не будет равен с "candidate", НО ПРИ ЭТОМ НАДО УЧИТЫВАТЬ, ЧТО КАЖДЫЙ СТУДЕНТ ИМЕЕТ ГОЛОСОВАТЬ..

    ухх, надеюсь меня поняли...
    Заранее спасибо,
    надеюсь на вашу помощь
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    1. а тек то голосует, они кто? они из этой таблицы? или это люди с улицы? если с улицы, совсем с улицы или они должны быть зарегистрированы?
    2. те кто голосует, сколько раз они могут проголосовать? один раз или сколько угодно?

    и вопрос от себя, просто интересно, что за институт где учат РНР? и как называется факультет.
     
  3. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    1) они студенты университета,
    есть отдельная база, у них там есть свой логин и пароль
    они входят и их перебрасывают на список кандидатов (тот что в скрине)

    2) один раз за каждого человека... тоесть, я студент, зашел со своим студенческим: st120229, ввёл пароль, поставил лайк за андрея - он пропал из общего списка, но результат, что я поставил лайк, записал в другую таблицу...
    зайдя другой студент, он этого андрея должен выдить, - а я нет

    эмм, я не из России, так что мой ответ навряд ли подскажет, но php нас не учили... я сам выбрал php, ибо интересует именно веб-программирование
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    т.е. те кто голосует могут проголосовать очень много раз, а точнее пока не закончится список кандидатов? или все же можно проголосовать определенное количество раз, например 10.
    в чем тогда смысл, зашел раз, проголосовал за всех и все..
     
  5. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    нет, всего один раз,
    я студент (st120229)
    за андрея хочу лайкк
    а инна мне не нравится, я жму дислайк (палец вниз)
    и эти двое для меня больше не показываются,

    а если зашел другой студент , например ты
    то ты можешь голосовать заново,

    это онлайн голосование,
    ток вместо регистрации у меня уже есть определенное количество студентов

    я не говорю, что система должна быть именно по нажатию,

    главное, что один студент может голосовать за весь список, но при этом ставить (плюс/минус/ или 0 (нейтрал, тоесть пропускает этого чувака))

    готов принять любые решения
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    пфф...

    Ладно, я зашел, мой номер студенческого st777 (ну а какой еще?)

    есть список:
    1. Вася
    2. Федя
    3. Тоня
    4. Мальвина
    5. Петрович

    я поставил лайк Мальвине и дислайк Петрович.

    После этого я (со своим студенческим st777) смогу поставить лайк / дислайк допустим Васе? (или еще кому то кроме Мальвины и Петровича)
    То что кто то другой со студенческим st325457645 сможет проголосовать после меня за Мальвину и Петровича это я уже понял.

    И еще такой вопрос, т.е. если я кому то поставил лайк, дислайк я ему уже не могу поставить? (и на оборот)
     
  7. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    или нейтралку, нолик..
    еще не придумал, но должен быть еще третий вариант - проигнорировать,
    НОО ДА, ТЫ МОЖЕШЬ ПРОГОЛОСОВАТЬ ЗА ВАСЮ после того как голоснул за петровича и мальвину

    точно! ты поставил, он пропадает из общего списка


    РАНЬШЕ У МЕНЯ СТОЯЛ ВОТ ТАКОЙ ВОТ вариант,

    [​IMG]

    но там я наткнулся на проблему, что записывает только последнее значение, (тоесть если я андрею поставил лайк, то и всем остальным он записывал лайк)
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    опять 25.

    Допустим я могу ставить только лайки (для легкости объяснения) т.е. я захожу, вижу список всего из 5 персонажей:
    ставлю ВСЕМ им лайки и это нормально? или может у одного студента всего 1 голос?
     
  9. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    прости :с
    видать не поняллл,
    ну, в лучшем случае было бы сделать так, что можно голосовать только за ТРОИХ из одного факультета...

    1. Вася - ИЗ DMF
    2. Федя - ИЗ DMF
    3. Тоня - ИЗ DMF
    4. Мальвина - ИЗ DMF
    5. Петрович - ИЗ DMF
    6. Нина - ИЗ HF

    за васю - лайк
    за федю - лайк
    за петровича - дислайк

    ТРОЕ ИЗ ОДНОГО ФАКУЛЬТЕТА ПРОГОЛОСОВАЛИ,
    остальные (мальвина и тоня) пропали

    дальше другие кандидаты пошли остлальных факультетов,
    всего их пять: DMF, HF, IVF, MMF, SZF
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Мутное какое то голосование, ну да ладно.

    Я вижу это так:

    есть 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):
    1. array('2', ''4);
    и потом при выводе списка ты сверяешь если, ID есть в этом массиве, то запись пропускаешь, если нет, печатешь

    Добавлено спустя 9 минут 17 секунд:
    Что то не понятно?
     
  11. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    ааа как все сложно
    перечитал дюжину раз,
    нифига не понял

    нельзя только ИД
    студенческкий номер,
    и пароль?
    типа кандидаты?
    кандидаты и студенты отличаются,
    кандидат будет штук 20-30
    а студент около 600
    ухх,
    а можешь пожалуйста написать сам код?
    ну или хотя бы часть его?
     
  12. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Код (PHP):
    1. // такой ответ будет если вытащить все содержимое таблиц:
    2. // список студентов
    3. $students = array(
    4. array('id' => '1', 'sn' => 'st777', 'first_name' => 'Семен', 'last_name' => 'Семенов', 'faculty' => 'DMF' ),
    5. array('id' => '2', 'sn' => 'st435', 'first_name' => 'Николай', 'last_name' => 'Николаев', 'faculty' => 'DMF' ) 
    6. );
    7.  
    8. // голосование, оно не совсем так составлено как должно быть, т.к. все в нем перечисленные должны же быть студентами, т.е. быть в таблице $students
    9. $voting = array(
    10. array('id' => '1', 'name' => 'Петя', 'faculty' => 'DMF', 'like' => '0', 'dislike' => '0'),
    11. array('id' => '2', 'name' => 'Вася', 'faculty' => 'DMF', 'like' => '1', 'dislike' => '0'),
    12. array('id' => '3', 'name' => 'Тоня', 'faculty' => 'DMF', 'like' => '0', 'dislike' => '0'),
    13. array('id' => '4', 'name' => 'Федя', 'faculty' => 'DMF', 'like' => '1', 'dislike' => '0')
    14. );
    15.  
    16. // тут учитывается кто за кого голосовал
    17. $xx = array(
    18. array('id' => '1', 'student_id' => '1', 'like' => '2 4', 'dislike' => ''), // это студент Семен Семенов из таблицы $students, он уже поставил 2 лайка за Васю и Федю
    19. array('id' => '1', 'student_id' => '2', 'like' => '', 'dislike' => '') // это студент Николай Николаев из таблицы $students
    20. ); 

    Код (PHP):
    1. //тут пользователь со студенческим st777 хочет поставить еще лайк
    2.  
    3. // сначала мы получаем из $voting его запись т.е. нас интересует за кого он уже голосовал:
    4. $liked = $xx[0]; // - array('id' => '1', 'student_id' => '1', 'like' => '2 4', 'dislike' => '')
    5.  
    6. // из всего этого нас интересует только $liked['like']
    7. $liked = $liked['like']; // - '2 4'
    8.  
    9. // переводим в массив:
    10. $liked = explode(' ', $liked); // т.е. мы получаем массив array( '2', '4' )
    11.  
    12.  
    13. // печатаем таблицу для пользователя :
    14. foreach ($voting as $user)
    15. {
    16.     if ( array_search($user['id'], $liked) !== false )
    17.     {
    18.         continue;
    19.     }
    20.     else
    21.     {
    22.         echo "<div>{$user['name']} | {$user['faculty']} | {$user['like']} | {$user['dislike']} </div>";
    23.     }
    24. } 
     
  13. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    фигасее,

    просмотрел,
    вроде принцип понял,
    но все ужасно сложно,
    ахах
    а полегче вариантов нет? без массива?
     
  14. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    сложно? это самый просто вариант решения вопроса (который приходит в голову) и что такого сложного с массивом? и о каком именно массиве идет речь?
     
  15. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    не понял именно цикл вывода,
    с массивом что как присвает - все понятно,
    а цикл вывода, - как китайский алфавит

    ну и не могу догнать как это сделать с подключением к базе

    может я туплю и задаю не те вопросы,
    ибо изучаю php+mysql чуть больше недели
    но факт остается фактом - не понимаю я :с
     
  16. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ты когда делаешь запрос в БД (например получить все записи в таблице) ты ответ в виде чего получаешь?
     
  17. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    Код (Text):
    1. $query = "SELECT * FROM candidate ORDER by candidate_faculty";
    думаю в виде переменной
    не поверишь - все равно не понимаю как это можно связать /рукалицо/
     
  18. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    В качестве ответа ты получаешь дескриптор, который ты потом переводишь в ассоциативный массив при помощи метода fetch_assoc, где ключ это название столбца, а значение это значение :)

    и оно выгляди так, как я писал выше:
    Код (PHP):
    1. // такой ответ будет если вытащить все содержимое таблиц:
    2. // список студентов
    3. $students = array(
    4. array('id' => '1', 'sn' => 'st777', 'first_name' => 'Семен', 'last_name' => 'Семенов', 'faculty' => 'DMF' ),
    5. array('id' => '2', 'sn' => 'st435', 'first_name' => 'Николай', 'last_name' => 'Николаев', 'faculty' => 'DMF' ) 
    6. );
    7.  
    8. // голосование, оно не совсем так составлено как должно быть, т.к. все в нем перечисленные должны же быть студентами, т.е. быть в таблице $students
    9. $voting = array(
    10. array('id' => '1', 'name' => 'Петя', 'faculty' => 'DMF', 'like' => '0', 'dislike' => '0'),
    11. array('id' => '2', 'name' => 'Вася', 'faculty' => 'DMF', 'like' => '1', 'dislike' => '0'),
    12. array('id' => '3', 'name' => 'Тоня', 'faculty' => 'DMF', 'like' => '0', 'dislike' => '0'),
    13. array('id' => '4', 'name' => 'Федя', 'faculty' => 'DMF', 'like' => '1', 'dislike' => '0')
    14. );
    15.  
    16. // тут учитывается кто за кого голосовал
    17. $xx = array(
    18. array('id' => '1', 'student_id' => '1', 'like' => '2 4', 'dislike' => ''), // это студент Семен Семенов из таблицы $students, он уже поставил 2 лайка за Васю и Федю
    19. array('id' => '1', 'student_id' => '2', 'like' => '', 'dislike' => '') // это студент Николай Николаев из таблицы $students
    20. );  
    можешь считать что это полученные из БД ответ переведенный в ассоциативный массив.
     
  19. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    так и хочется ругнуться, ибо я чайник))

    прости
    буду тупить:

    название столбца в базе?
    типа этого? :

    [​IMG]

    и что такое ключ?

    ахах,
    все стало еще запутанней,
    надо бы пойти массивы повторить,
    узнать про функции, ибо такие слышу первый раз,
    даже не представляю что с ними делать и куда пихать *_*

    блеск
     
  20. 3ay4ka

    3ay4ka Новичок

    С нами с:
    19 сен 2014
    Сообщения:
    27
    Симпатии:
    0
    апдейт
    а можно выводить по одному кандидату и голосовать по одному?
    тоесть вывел первого
    студент проголосовал
    и проходит к следующему?
    как сделать этот проход?
     
  21. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Я бы базу так организовал:
    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