Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Все те же лайки...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
teddy
Отправлено: 22 Мая, 2013 - 00:01:11
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Доброй ночи уважаемые форумчане. Столкнулся со следующей проблемой: Код, который указан ниже, позволяет пользователям лайкать ту или иную статью не более 1 раза. Мне нужно что бы в итоге можно было вывести ники всех пользователей для каждой статьи, тех, которые ее "лайкнули". Исходя из кода у меня одно поле для добавления логина того кто лайкнул. Следовательно UPDATE перезаписывает каждый раз логин голосующего. Как сделать что бы сохранялись логины всех голосующих? Создать новую таблицу для голосов? Если да, то как потом это все совместить? Объединить таблицы? Если да, то не вижу решения т.к в практике это не применял. Буду рад если поможете

PHP:
скопировать код в буфер обмена
  1.  
  2. <php?
  3. if(isset($_GET['like'])){
  4. $like = $_GET['like'];
  5. $wholike = $_SESSION['success'];
  6.                          
  7.                           $checkvoite = mysql_query("SELECT `id` FROM `articles` WHERE `wholike`='$wholike'");
  8.                           $row = mysql_fetch_assoc($checkvoite);
  9.                          
  10.                                               if($row['id']==$like){
  11.                          
  12.                          
  13.                           $error_voite = "Вы уже голосовали";
  14.                          
  15.                           }
  16.                        
  17.                           if(!isset($error_voite)){
  18.                  
  19.                           $likequery = "UPDATE `articles` SET `likecounter`=`likecounter`+1,`wholike`='$wholike' WHERE `id`='$like'";
  20.  
  21.                           mysql_query($likequery) or die(mysql_error());
  22.                          
  23.                                       header("Location: index.php");
  24.                           exit;
  25.                           }
  26. }
  27. ?>
  28.  

(Отредактировано автором: 22 Мая, 2013 - 02:21:26)

 
 Top
sheff2000
Отправлено: 22 Мая, 2013 - 09:15:03
Post Id


Новичок


Покинул форум
Сообщений всего: 55
Дата рег-ции: Дек. 2011  


Помог: 2 раз(а)




teddy пишет:
Код, который указан ниже, позволяет пользователям лайкать ту или иную статью не более 1 раза


он позволяет лайкнуть одному пользователю только один раз подряд. Если после него лайкнет статью. другой пользователь - то первый может сделать это снова.

teddy пишет:
mysql_query("SELECT `id` FROM `articles` WHERE `wholike`='$wholike'");

"UPDATE `articles` SET `likecounter`=`likecounter`+1,`wholike`='$wholike' WHERE `id`='$like'"


В likecounter Вы храните количество проголосовавших, но при этом в wholike Вы записываете только один единственный логин.
Самое простое решение - это просто дописывать логины проголосовавших в поле wholike, разделяя их каким-нибудь уникальным симовлом - например ;(точка с запятой)

Для это следует изменить строку №7 Вашего кода на:
PHP:
скопировать код в буфер обмена
  1. $checkvoite = mysql_query("SELECT `id`, `wholike` FROM `articles` WHERE `wholike` LIKE '%;$wholike;%'");

при этом часть запроса WHERE `wholike`='$wholike' изменится на `wholike` LIKE '%;$wholike;%'", так как указанное поле будет содержать список имен (логинов) обрамленных знаком ; (например - ";логин1;;логин2;;логин3;")

в итоге массив $row будет содержать как номер статьи, так и список проголосовавших.

Далее строка №19 (Update)преобразуется в такой вид:
PHP:
скопировать код в буфер обмена
  1.  
  2. $wholike = $row['wholike'].';'.$wholike.';';
  3. $likequery = "UPDATE `articles` SET `likecounter`=`likecounter`+1,`wholike`='$wholike' WHERE `id`='$like'";


то есть в переменной $wholike Вы накапливаете список всех логинов, разделяя их знаком ; и добавляя последнего проголосовавшего в конец списка.

Учтите, что показанные изменения приведены в соответствии с уровнем написания Вашего кода и не могут применяться на реальных рабочих проектах, а указанны лишь с целью подтолкнуть Вас на поиск решения задачи.

Более правильным способом, конечно, было бы хранение не имен, а ID пользователей лайкнувших статью в отдельной таблице. К примеру, она (таблица like_articles) может иметь три столбца:
- nomer -- поле-инкремент, порядковый номер записи в таблице
- id_article -- ID статьи
- id_user -- ID проголосовавшего пользователя

связь таблицы со статьями и таблицы с голосами осуществляется по полю с номером статьи.
При голосовании за статью идет поиск пары ключей (id_article, id_user) на предмет их наличия в таблице like_articles.
Если пара будет найдена - значит юзер уже голосовал, если нет - значит он делает это для указанной статьи первый раз. После чего Вам нужно сделать два запроса к Базе данных - добавить код юзвера и номер статьи в таблицу like_articles и увеличить количество голосов в таблице articles

(Отредактировано автором: 22 Мая, 2013 - 09:16:43)

 
 Top
Мелкий Супермодератор
Отправлено: 22 Мая, 2013 - 10:21:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




sheff2000 пишет:
разделяя их каким-нибудь уникальным симовлом - например ;

Ой ни в коем случае. Забудьте эту гадость. Вот ещё, fullscan на любой чих.

Единственный адекватный вариант - отдельная таблица с парой полей, id статьи и id пользователя, первичный ключ на оба поля.


-----
PostgreSQL DBA
 
 Top
teddy
Отправлено: 22 Мая, 2013 - 11:13:51
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




sheff2000 пишет:
он позволяет лайкнуть одному пользователю только один раз подряд. Если после него лайкнет статью. другой пользователь - то первый может сделать это снова.

Это я исправил ночью, для того достаточно было прописать цикл while в результат выборки. Тупанул на ночь глядя ) с запросом там все норм.

По поводу соединения логинов голосующих согласен с Мелким, поверьте, я об этом думал и понял, что это не очень хороший вариант...

sheff2000 пишет:
связь таблицы со статьями и таблицы с голосами осуществляется по полю с номером статьи.
При голосовании за статью идет поиск пары ключей (id_article, id_user) на предмет их наличия в таблице like_articles.

Вот именно то, что я искал ) Буду смотреть что да как, спасибо большое, написали то сколько ) Закатив глазки

(Отредактировано автором: 22 Мая, 2013 - 11:24:07)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB