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
Форумы портала PHP.SU :: Версия для печати :: Все те же лайки...
Форумы портала PHP.SU » » Вопросы новичков » Все те же лайки...

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

1. teddy - 22 Мая, 2013 - 00:01:11 - перейти к сообщению
Доброй ночи уважаемые форумчане. Столкнулся со следующей проблемой: Код, который указан ниже, позволяет пользователям лайкать ту или иную статью не более 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.  
2. sheff2000 - 22 Мая, 2013 - 09:15:03 - перейти к сообщению
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
3. Мелкий - 22 Мая, 2013 - 10:21:43 - перейти к сообщению
sheff2000 пишет:
разделяя их каким-нибудь уникальным симовлом - например ;

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

Единственный адекватный вариант - отдельная таблица с парой полей, id статьи и id пользователя, первичный ключ на оба поля.
4. teddy - 22 Мая, 2013 - 11:13:51 - перейти к сообщению
sheff2000 пишет:
он позволяет лайкнуть одному пользователю только один раз подряд. Если после него лайкнет статью. другой пользователь - то первый может сделать это снова.

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

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

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

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

 

Powered by ExBB FM 1.0 RC1