Совет по плагину Democracy Polls
Уважаемый разработчик, я доработал ваш код для своего сайта и хотел бы поделиться с вами. Думаю, что ваше название пока не очень оправдано. Чтобы его полностью оправдать, предлагаю сделать глобальный параметр "Проверять на динамический ip", ведь, как известно, у обычных пользователей динамический ip меняет только последние цифры (после последней точки), поэтому я добавил такую проверку.
Файл class.DemPoll.php:
function get_logs_voted_data(){ global $wpdb; $user_ip = ip2long( $_SERVER['REMOTE_ADDR'] ); $ipfen = $_SERVER['REMOTE_ADDR'] ; list($van, $two, $three) = explode('.', $ipfen); $AND = $wpdb->prepare('AND shortip1 = %d AND shortip2 = %d AND shortip3 = %d', $van, $two, $three); // нужно проверять пользователя и IP отдельно! А то есил пользователь не залогинен у него id 0 и он будет совпадать со всеми другими незалогиненными пользователями if( $user_id = get_current_user_id() ){ //$AND = $wpdb->prepare('AND userid = %d', $user_id ); // только для пользователей, IP не учитывается, т.е. если вы голосовали как посетитель, а потом залогинились, то можено будет голосовать еще раз // $AND = $wpdb->prepare('AND (userid = %d OR ip = %d OR shortip = %d )', $user_id, $user_ip, $ipshortfen); $AND = $wpdb->prepare('AND ( userid = %d OR ( shortip1 = %d AND shortip2 = %d AND shortip3 = %d ) )', $user_id, $van, $two, $three); } // Ищем пользвоателя или IP в базе $sql = $wpdb->prepare("SELECT * FROM $wpdb->democracy_log WHERE qid = %d $AND", $this->id ); $res = $wpdb->get_results( $sql ); if( $res ) $res = array_shift( $res ); return $res; } ... protected function add_logs(){ if( ! $this->id ) return false; global $wpdb; $user_ip = ip2long( $_SERVER['REMOTE_ADDR'] ); $ipfen = $_SERVER['REMOTE_ADDR'] ; list($van, $two, $three) = explode('.', $ipfen); $data = array( 'ip' => $user_ip, 'qid' => $this->id, 'aids' => $this->votedFor, 'userid' => (int) get_current_user_id(), 'date' => current_time('mysql'), 'expire' => $this->expire_time(), 'shortip1' => $van, 'shortip2' => $two, 'shortip3' => $three, ); //wp_die(print_r( $data )); $foo = $wpdb->insert( $wpdb->democracy_log, $data ); }
По сути можете проверять и по ип, но в случае, если будет отключена проверка на динамику, а так можно и без точного совпадения обойтись, ведь ip и так совпадет!
Только надо добавить еще вставку столбцов автоматически в таблицу, ведь у меня это локальное решение и я все ручками сделал.
Спасибо за понимание,
Никита Димитрюк.
Спасибо за идею! Очень может быть что скоро внесу эту функцию. Только не так как вы предложили.
Зачем разделять на 3 части и записывать их отдельно, если при проверке все равно запрос с AND
Почему в одно поле не записали как
xxx.xxx.xxx
?Думаю вообще убрать это преобразование в
ip2long()
. Еще до этого хотел, а с этим подавно...