Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: логика функции мне нравится мне не нравится
 
 автор: ZetRider   (16.03.2012 в 12:17)   письмо автору
 
 

Добрый день, пишу для сайта Like функцию.

Не могу додумать какое нужно условие в следующем коде.

Сейчас работает так:
Если действие + и пользователь ранее не голосовал то прибавляем + 1 к посту
Если действие - и пользователь ранее голосовал то убавляем у поста -1 так же удаляем запись о том что пользователь голосовал ранее.

Но если у поста стоит 0 и пользователь сразу хочет поставить отрицательный голос при этом ранее не голосовал за него, такое условие не пройдет, так как в базе данных нет записи о том что он голосовал.

Вот код функции:
<?php
/* Like для постов */
function like_this_post($post_id=''$action=''){
global 
$user_ID// ID пользователя
    
if($user_ID 0) {
        if(
$post_id != '') {
            
$post_id intval($post_id);
            
$count get_post_meta($post_id'like_this_post''true'); // получаем данные сколько у поста голосов
            
if(empty($count)) { $count 0; }
                
            if(
$action == 'user_like_post_plus' && search_user_like($user_ID$post_id'post') == true) { // search_user_like проверяет голосовал ли ранее пользователь, если записей в базе нет возвращает true
                
$meta_value $count 1;
                
update_user_like($user_ID$post_id'post''1'); // добавляем в базу запись о том что пользователь проголосовал за пост
                
update_post_meta($post_id'like_this_post'$meta_value); // обновляем показатель у записи
                
return get_count_post_like($post_id); // возаращаем количество голосов за пост
            
}elseif($action == 'user_like_post_minus' && search_user_like($user_ID$post_id'post') == false) { // если пользователь нажал минус и он уже ранее голосовал
            /*
            В этом месте условие работает не верно, если пользователь ранее не голосовал за пост то он не сможет сразу поставить рейтинг минус...
            */
                
$meta_value $count 1;
                
update_user_like($user_ID$post_id'post''0');
                
update_post_meta($post_id'like_this_post'$meta_value);
                return 
get_count_post_like($post_id);
            }else {
                return 
get_count_post_like($post_id);
            }
        }
    }
}
?>


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

  Ответить  
 
 автор: Lotanaen   (16.03.2012 в 13:00)   письмо автору
 
   для: ZetRider   (16.03.2012 в 12:17)
 

а зачем удалять запись? Вы изначально делайте запись таким образом: если пользователь "за", то с полем 1, а если "против", то -1. А потом просто изменяйте это поле с +1 на -1 либо наоборот, в зависимости от действий пользователя.

  Ответить  
 
 автор: ZetRider   (16.03.2012 в 19:29)   письмо автору
 
   для: Lotanaen   (16.03.2012 в 13:00)
 

Спасибо, действительно зачем удалять.

Ключевым в Вашем ответе оказались сами значения которые записываются для пользователя.

Пробовал записывать: 1 да 0 нет

С нулем не работало даже если пользователь вообще не голосовал т.к. запрос и так возвращал 0 :)
А условие было вида: Если ставит минус и его оценка ранее не равна нулю

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования