Я не буду отвечать , почему ваш код не работал должным образом, потому что я точно не знаю.Спасибо за отличный ответ @Paul Spiegel, он объяснил почему.
В этом ответе я просто предлагаю вам использовать встроенные функции MySQL вместо PHP.
Этокак я обрабатываю IP-адреса в своих приложениях, и до сих пор у меня нет проблем с этой моделью.
Я храню IP-адреса в столбце varbinary(16)
и выполняю преобразования, используя встроенные функции MySQL
inet6_aton для преобразования IP-строк в двоичные
inet6_ntoa для преобразования двоичных в IP-строки
Поэтому замените этот код
//query 1
$ip = inet_pton($_SERVER['REMOTE_ADDR']);
$stmt = $db->prepare("SELECT * FROM `votes` WHERE ip=?");
$stmt->execute([$ip]);
на этот
//query 2
$stmt = $db->prepare("SELECT * FROM `votes` WHERE ip=INET6_ATON(?)");
$stmt->execute([$_SERVER['REMOTE_ADDR']]);
Нет необходимости говорить, что НЕ делайте так (запрос 3) -
//query 3
$stmt = $db->prepare("SELECT * FROM `votes` WHERE INET6_NTOA(ip)= ?");
$stmt->execute([$_SERVER['REMOTE_ADDR']]);
(поскольку База данных будет ненавидеть вас за то, что она будет выполнять преобразование для каждой IP-записи в таблице)
Из своего короткого опыта я обнаружила, что всякий раз, когда у меня естьвозможность позволить базе данных делать что-то вместо прикладного уровня (PHP), пусть база данных сделает это немедленноiately.Сделайте MySQL толстым, а PHP - тощим =), как говорят жирная модель и тощий контроллер.
Когда вы выполняете большую часть своей работы внутри базы данных, это сделает вашу базу данных лучше работающей независимо от кода PHP (этоне требуется), что делает вашу базу данных более переносимой.
Например, если вы хотите превратить свою систему из облачной веб-системы, использующей PHP
, в локальную систему, котораяиспользует .net
языки, разработчики .net
будут любить вас за то, что вы сделаете их меньше, потому что большая часть работы уже написана и выполнена MySQL.
Другой пример, ваше приложение успешно работает, и теперь у вас большеклиенты, которым нужно ваше приложение, вы просто получите другой сервер и установите MySQL только на нем, а поскольку большая часть работы выполняется базой данных, ваше приложение масштабируется проще, чем установка полного веб-сервера, и выполняйте масштабирование также для PHP,