Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
461 / 461 / 6
Регистрация: 08.05.2013
Сообщений: 239
1

Если ip в базе существует, то

07.03.2016, 23:36. Показов 1934. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет.
Подскажите, пожалуйста пару строк кода.
как проверить существует ли такой ip в базе ?
PHP
1
$ip = $_SERVER['REMOTE_ADDR']; // узнаем ip пользователя и присваиваем это значение переменной $ip
Далее нужно узнать если такой ip в базе есть, то
PHP
1
2
echo getEffectiveVotes($id).' РЕЙТИНГ. <span style="color:red">Ваш голос не учтен. С вашего ip - '.$ip.' голосование проходило. Повторно проголосовать вы не можете</span>';
  exit;
Сейчас все работает, НО:
Есть несколько кандидатов, и на данный момент пользователь может оставить свой голос у каждого.
т.е. проверка проходит еще и по id кандидата. Это лишнее.
Я бы хотел, чтобы пользователь смог проголосовать только один раз ВООБЩЕ! и всё.
Для этого нужно сравнить его ip с теми, что есть в базе и вывести соответствующий запрет.

Заранее Спасибо.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2016, 23:36
Ответы с готовыми решениями:

Как правильно сделать вывод 404 ошибки, если id в базе не существует
Здравствуйте. Никак не могу побороть свое незнание php.. Подскажите. Вот есть подобныестраницы:...

Если h-файл существует, подключить его, если не существует, проигнорировать
Как это сделать?

Добавить если не существует, показать если существует (SQL-запрос)
Мир всем и привет Как задать sql запрос в adoquery на существование записи: &quot;если есть...

Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует?
Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он...

15
2169 / 1652 / 840
Регистрация: 10.01.2015
Сообщений: 5,190
07.03.2016, 23:48 2
А что сложного?

Для этого даже IP знать не надо. Например, создаете столбец в БД с нулем (или NULL) по дефолту. Как юзер проголосует - пишите этому юзеру в столбец "1" и все. Юзер больше голосовать не сможет.

Добавлено через 1 минуту
А с IP просто проксю использовать могут.
2
461 / 461 / 6
Регистрация: 08.05.2013
Сообщений: 239
08.03.2016, 07:09  [ТС] 3
Регистрации нет. Проголосовать может любой. Один посетитель, один ip.
Динамические ip, прокси, Thor, VPN и т.д. во внимание не беру. Достаточно будет по ip.
1
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
08.03.2016, 08:06 4
Лучший ответ Сообщение было отмечено Alexander519151 как решение

Решение

Это же обычный запрос:
SQL
1
SELECT COUNT(*) AS `aggregate` WHERE `ip`=?
2
461 / 461 / 6
Регистрация: 08.05.2013
Сообщений: 239
08.03.2016, 08:32  [ТС] 5
Да, запрос простой, но я его не знаю.
У меня вот такой код, благодаря Вам всё работает.
PHP
1
2
3
4
5
6
7
8
9
// проверяем юзера на IP
 
  $ip = $_SERVER['REMOTE_ADDR']; //получаем ip юзера
  $r = mysql_query("SELECT COUNT(*) AS `aggregate` WHERE `ip`=?"); //присваиваем переменной $r все ip из базы
  if ($ip=$r); //если значения переменных равны, то показываем текущий рейтинг, выводим сообщение и прерываем работу функции.
  {
  echo getEffectiveVotes($id).' РЕЙТИНГ. <span style="color:red">Ваш голос не учтен. С вашего ip - '.$ip.' голосование проходило. Повторно проголосовать вы не можете</span>';
  exit;
  }
Спасибо. На локальном сервере всё работает. Сейчас попробую на хостинге.
1
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
08.03.2016, 08:40 6
Цитата Сообщение от Alexander519151 Посмотреть сообщение
...всё работает.
работает?
2
461 / 461 / 6
Регистрация: 08.05.2013
Сообщений: 239
08.03.2016, 08:42  [ТС] 7
Цитата Сообщение от WhiteMind Посмотреть сообщение
работает?
Да, сейчас сделаю на хостинге и проверю там, потом отпишусь.
0
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
08.03.2016, 08:44 8
Цитата Сообщение от Alexander519151 Посмотреть сообщение
$r = mysql_query("SELECT COUNT(*) AS `aggregate` WHERE `ip`=?");
прямо так работает?
2
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
08.03.2016, 08:51 9
Alexander519151, я показал пример с расчётом на то, что он будет использоваться как prepared statement в PDO или MySQLi.
Если Вы используете mysql_* функции, то делать нужно так:
PHP
1
2
$ip = $_SERVER['REMOTE_ADDR']; //получаем ip юзера
$r = mysql_query("SELECT COUNT(*) AS `aggregate` WHERE `ip`='{$ip}'");
Кстати, mysql_* функции устарели. Используйте хотя бы mysqli_*. На новых версиях php те функции не будут работать.

И ещё, IP лучше хранить в поле "INT", преобразовывая IP в число.
2
Hello Kitty
690 / 562 / 402
Регистрация: 12.02.2016
Сообщений: 1,436
Записей в блоге: 1
08.03.2016, 08:53 10
Цитата Сообщение от Para bellum Посмотреть сообщение
$r = mysql_query("SELECT COUNT(*) AS `aggregate` WHERE `ip`='{$ip}'");
и такое работает?
2
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
08.03.2016, 08:59 11
Цитата Сообщение от WhiteMind Посмотреть сообщение
и такое работает?
Ахахаха. Блин, совсем невнимательный стал. Я-ж забыл таблицу указать. Alexander519151, вот правильно:
SQL
1
SELECT COUNT(*) AS `aggregate` FROM `таблица` WHERE `ip`=?
Если Вы так и не решитесь перейти на использование prepared statement, то знак вопроса поменяйте, как показано в сообщении #9.
3
461 / 461 / 6
Регистрация: 08.05.2013
Сообщений: 239
08.03.2016, 09:27  [ТС] 12
Интересно. сразу не обратил внимание, т.к. уже было много голосов (пока тестировал на локальном сервере) и главное было заблокировать повторное голосование.
Повторно голоса не учитывались. А точнее вообще не учитывались. Очистил базу, проголосовал, а мне запрещено. База пустая. Голосовать нельзя.

Вот код, подскажите, пожалуйста, как правильно.

PHP
1
2
3
4
5
6
7
8
9
// проверяем юзера на IP
 
  $ip = $_SERVER['REMOTE_ADDR']; //получаем ip юзера
  $r = mysql_query("SELECT COUNT(*) AS `aggregate` FROM `vote_ip` WHERE `ip`='{$ip}'"); //присваиваем переменной $r все ip из базы
  if ($ip=$r); //если значения переменных равны, то показываем текущий рейтинг, выводим сообщение и прерываем работу функции.
  {
  echo getEffectiveVotes($id).' РЕЙТИНГ. <span style="color:red">Ваш голос не учтен. С вашего ip - '.$ip.' голосование проходило. Повторно проголосовать вы не можете</span>';
  exit;
  }
1
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
08.03.2016, 09:36 13
PHP
1
if ($ip=$r);
Замените на:
PHP
1
if ( mysql_result($r, 0, 'aggregate') )
2
461 / 461 / 6
Регистрация: 08.05.2013
Сообщений: 239
08.03.2016, 10:10  [ТС] 14
Ладно, Господа, всем спасибо.
Сделал так:

-в момент клика удаляем записи до сегодняшней даты.

-получаем ip
-заносим в базу ip, id кандидата и завтрашнюю дату.
-если юзер сегодня голосовал за кандидата, то запрещаем
-если нет то разрешаем, запоминаем за кого, ip и дату.

примерно так.

Остался один момент: Думаю не особо важный, но желательный.
Подключиться к базе на уделенном хостинге.
раньше (5 лет назад) было по другому.

На локальном так:
PHP
1
2
3
4
5
6
7
8
9
10
<?php
    $host = "localhost";
    $user = "er";
    $pass = "er";
    $db = "sedelnikov";
    mysql_connect($host, $user, $pass) or die("MySQL сервер недоступен!".mysql_error());
    mysql_select_db($db) or die("Нет соединения с БД".mysql_error());
    mysql_query("SET NAMES 'cp1251'");
    mysql_query("SET CHARACTER SET 'cp1251'");
?>
на удаленном указываем другие данные пользователь, пароль, база с идентификатором хостинга и сам host базы.
Сейчас не могу подключиться.
PHP
1
2
3
4
5
6
7
8
9
10
<?php
    $host = "er.mysql";
    $user = "er";
    $pass = "WPSC8Xn_";
    $db = "er_sedelnikov";
    mysql_connect($host, $user, $pass) or die("MySQL сервер недоступен!".mysql_error());
    mysql_select_db($db) or die("Нет соединения с БД".mysql_error());
    mysql_query("SET NAMES 'cp1251'");
    mysql_query("SET CHARACTER SET 'cp1251'");
?>
первые 3 ответа в google одинаковые и говорят именно так.

кстати вот весь код.
файл с кандидатами (Omsk_Women_2016.php)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<!DOCTYPE html>
<html><!-- InstanceBegin template="/Templates/Sedelnikov(main_template_php).dwt.php" codeOutsideHTMLIsLocked="false" -->
<head>
    <meta charset="windows-1251">
    <!-- InstanceBeginEditable name="doctitle" -->
        <title>ПРОЕКТ "Женщины прииртышья 2016" Голосование</title>
    <!-- InstanceEndEditable -->
        <?php include("../../blocks/meta.php");?>
    <!-- InstanceBeginEditable name="head" -->
        <!--=== подключение к базе начало ===-->
        <?php
            include("../../connect/connect.php");
        ?>
        <!--=== подключение к базе конец ===-->
        <script src="../../js/jQuery.js"></script>
        <script src='../../js/jquery.pack.js'></script>
        <script src="../../js/jQuery_voting.js"></script>
 
 
    <!-- InstanceEndEditable -->
</head>
 
<body>
<?php include("../../blocks/sw.php");?>
<?php include("../../blocks/menu.php");?>
 
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td width="320" align="left" valign="top">
                <!-- InstanceBeginEditable name="sidebar_L" -->
                    <?php include ("../../blocks/sidebar_L_category.php");?>
                <!-- InstanceEndEditable -->
            </td>
            <td width="100%" align="left" valign="top">
                <div id="content">
                    <!-- InstanceBeginEditable name="content" -->
                    <h1>
                        ПРОЕКТ "Женщины прииртышья 2016<br>
                        Голосование
                    </h1>
                    <h2>
                        ВАЖНО !<br>
                        Вы можете проголосовать только один раз за каждого кандидата. ЗА или ПРОТИВ.<br>
                        Внимательно изучите все кандидатуры и примите правильное решение, проголосовав за или против.<br>
                    </h2>
                    <?php
                        /**
                        Display the results from the database
                        **/
                        $q = "SELECT * FROM entries";
                        $r = mysql_query($q);
                        
                        if(mysql_num_rows($r)>0) //table is non-empty
                            {
                                while($row = mysql_fetch_assoc($r))
                                    {
                                        $net_vote = $row['votes_up'] - $row['votes_down']; //this is the net result of voting up and voting down
                                        $all_vote = $row['votes_up'] + $row['votes_down'];
                    ?>
                    <div id='all-news'>
                        <span class='link'>
                            <?php echo $row['content']; ?>
                        </span>
                        <div id="clear"></div>
                        <span class='votes_count' id='votes_count<?php echo $row['id']; ?>'>
                            
                        </span>
                        <span class='vote_buttons' id='vote_buttons<?php echo $row['id']; ?>'>
                            <a href='javascript:;' class='vote_up' id='<?php echo $row['id']; ?>'>Vote Up!</a>
                            <a href='javascript:;' class='vote_down' id='<?php echo $row['id']; ?>'>Vote Down!</a>
                        
                        <?php echo $net_vote; ?><strong><?php echo "&nbsp;РЕЙТИНГ"; ?></strong><br>
                        <?php echo $row['votes_up']; ?><?php echo "&nbsp;ЗА"; ?><br>
                        <?php echo $row['votes_down']; ?><?php echo "&nbsp;&nbsp;&nbsp;ПРОТИВ"; ?><br>
                        <?php echo $all_vote; ?><?php echo "&nbsp;ВСЕГО"; ?><br>
                        </span><br>
                    </div>
                    <?php
                                    }
                            }
                    ?>
                    <!-- InstanceEndEditable -->
                </div>
            </td>
        </tr>
    </tbody>
</table>
<div id="clear"></div>
<?php include("../../blocks/statistics.php");?>
<?php include("../../blocks/footer.php");?>
</body>
<!-- InstanceEnd --></html>
файл обработчик votes.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<!doctype html>
<html>
<head>
<meta charset="windows-1251">
<title>ПРОЕКТ "Женщины прииртышья 2016" Голосование</title>
<?php include("../../connect/connect.php");?>
</head>
 
<body>
 
 
 
<?php
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
$day = date("Y-m-d H:i:s");
mysql_query ("DELETE FROM vote_ip WHERE date_resp < '$day'");
 
function getAllVotes($id)
    {
    /**
    Returns an array whose first element is votes_up and the second one is votes_down
    **/
    $votes = array();
    $q = "SELECT * FROM entries WHERE id = $id";
    $r = mysql_query($q);
    if(mysql_num_rows($r)==1)//id наден в таблице
        {
        $row = mysql_fetch_assoc($r);
        $votes[0] = $row['votes_up'];
        $votes[1] = $row['votes_down'];
        }
    return $votes;
    }
 
function getEffectiveVotes($id)
    {
    /**
    Returns an integer
    **/
    $votes = getAllVotes($id);
    $effectiveVote = $votes[0] - $votes[1];
    return $effectiveVote;
    }
 
$id = $_POST['id'];
$action = $_POST['action'];
 
//get the current votes
$cur_votes = getAllVotes($id);
 
 
 
// проверяем юзера на IP
$ip = $_SERVER['REMOTE_ADDR']; 
$r = mysql_query("SELECT * FROM vote_ip WHERE id_resp = '$id' AND ip = '$ip'");
if(mysql_num_rows($r)==1)
{
echo getEffectiveVotes($id).' РЕЙТИНГ. <span style="color:red">Ваш голос не учтен. С вашего ip - '.$ip.' голосование проходило. Повторно проголосовать вы сможете завтра</span>';
exit;
}
 
//ok, now update the votes
 
if($action=='vote_up') //voting up
{
    $votes_up = $cur_votes[0]+1;
    $q = "UPDATE entries SET votes_up = $votes_up WHERE id = $id";
}
elseif($action=='vote_down') //voting down
{
    $votes_down = $cur_votes[1]+1;
    $q = "UPDATE entries SET votes_down = $votes_down WHERE id = $id";
}
$r = mysql_query($q);
if($r) 
    {
    $effectiveVote = getEffectiveVotes($id);
    echo $effectiveVote." РЕЙТИНГ";
    
    $date_resp = date("Y-m-d",time()+ 1*24*60*60); // запоминаем завтрашнююю дату
    mysql_query("INSERT INTO vote_ip (id_resp, ip, date_resp) VALUES ('$id','$ip','$date_resp')");
    // В таблицу vote_ip заносим id статьи, ip посетителя и завтрашнюю дату-время
    
    }
elseif(!$r) //voting failed
    {
    echo "Ошибка!";
    }
 
}
 
 
 else
 {
    header("Location: index.php"); exit;
  }
  
?>
</body>
</html>
Пропишем правильные строки для подключения к базе и всё, я думаю достаточно.
1
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
08.03.2016, 10:23 15
Цитата Сообщение от Alexander519151 Посмотреть сообщение
SQL
1
SELECT * FROM vote_ip WHERE id_resp = '$id' AND ip = '$ip'
А что с COUNT не получилось?
2
461 / 461 / 6
Регистрация: 08.05.2013
Сообщений: 239
08.03.2016, 10:55  [ТС] 16
Нет, никак не получалось.
Хотел просто: запомнили ip и все. повторно с этого ip голосовать нельзя. И не нужно проверять дату и время.
Еще бы к базе подключиться (на хостинге).

Добавлено через 26 минут
Всё разобрался, подключился. Всё работает.
Использовал код приведенный мной выше.
К базе подключился. Внимательнее нужно быть.
1
08.03.2016, 10:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2016, 10:55
Помогаю со студенческими работами здесь

Добавление записи, если не существует, обновление. если существует
Доброго времени суток! Ситуация такая: Есть файл в который приходит ид ($content_id), нужно...

существует ли в языке Си функция replace? и если существует то как работает?
А если её нет то каким образом можно изменить числа входящие в массив?

Определить существует ли треугольник с такими длинами сторон и, если существует, будет ли он прямоугольным
помогите проверить правильно ли составил программу. т.к на семерке проверить возможности нет ( ...

Определить существует ли треугольник со сторонами а, b, c и если существует, то является ли он равностонним равнобедренным или разносторонним
Определить существует ли треугольник со сторонами а, b, c и если существует, то является ли он...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru