Я пытаюсь найти, что я делаю неправильно - я не могу понять или найти информацию об этом.
Короче говоря, в таблице 3 строки.
id login mail ip
1 me [email protected] 127.0.0.1
2 me2 [email protected] 4234234
3 me3 [email protected] 4234234
Когда я выполняю запрос на проверку, эти данные уже существуют, но они обрабатываются с конца (как сделать наоборот?)
Например, запрос "пост": логин(me3), почта([email protected]), ip(127.0.0.1) Потом он мне покажет - с конца, то есть ip! я сменила айпи, а он мне по почте показал, а не из логина
Как это исправить - или я что-то не так делаю (логин в 3 строке - почта во второй строке, а IP - в первой) Как сделать так, чтобы все не запускалось с IP (то есть не с конец)
$stmt = $pdo->prepare("SELECT login, email, ip FROM users WHERE login=:login OR email=:email OR ip=:ip");
$stmt->execute(['login' => $login, 'email' => $email, 'ip' => $ip]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row['login']==$login) {
echo "Sorry, username is already taken!";
}
elseif ($row['email']==$email) {
echo "Sorry, the email id is already taken!";
}
elseif ($row['ip']==$ip) {
echo "You have already registered - only one registration is allowed.";
}
else {
echo "All is well!";
}
var_dump ($row);
array(3) { ["login"]=> string(5) "me" ["email"]=> string(12) "[email protected]"
["ip"]=> string(9) "127.0.0.1" }
У меня конечно есть альтернатива - но хотелось бы сделать одним простым способом!
$sqlCheckLogin = $pdo->prepare("SELECT user_login FROM ".DB_PREFIX."users WHERE user_login=:login");
$sqlCheckLogin->execute(['login' => $login]);
if ($sqlCheckLogin->fetchColumn()) {
$message = 'User with this login is already registered! Enter another login.';
}
else
{
$sqlCheckEmail = $pdo->prepare("SELECT user_email FROM ".DB_PREFIX."users WHERE user_email=:email");
$sqlCheckEmail->execute(['email' => $email]);
if ($sqlCheckEmail->fetchColumn()) {
$message = 'User with this e-mail is already registered!';
}
else
{
$sqlCheckIp = $pdo->prepare("SELECT user_ip FROM ".DB_PREFIX."users WHERE user_ip=:ip");
$sqlCheckIp->execute(['ip' => $ip]);
if ($sqlCheckIp->fetchColumn()) {
$message = 'You have already registered on the site, re-registration is prohibited and punishable by the rules of the site!';
}
Я искал примеры - и не нашел информации, поэтому думаю, кто-нибудь здесь может подсказать, в каком направлении двигаться. Как превратить эти 3 запроса в 1?
Лучший вариант - проверить отдельно логин и отдельно проверить почту, теперь я понимаю свою глупость и то, что я так долго не мог найти что-то подобное.
Я, конечно, могу проверить все сразу и вывести информацию о том, что что-то уже есть, но определить, в каком порядке, невозможно. А при отдельном тесте на существование мы точно знаем, что у нас есть, и точно знаем, какую информацию отображать.
Вы пытаетесь сделать это просто, но это не простой процесс.
Вы должны пойти в направлении использования постоянных файлов cookie, подобных вещей Etags, но они также не будут работать, если кто-то использует больше браузеров.. имейте в виду, что в некоторых странах есть законы, запрещающие использование постоянных методов отслеживания. Общий регламент ЕС по защите данных ( GDPR) приходит на ум..
В общем, я думаю, что либо я не так сказал - либо это действительно сложно сделать! Верхний код работает нормально, но наоборот!
да, как говорит @RiggsFolly, это не так просто, протокол HTTP не имеет состояния, что означает, что вы не можете однозначно идентифицировать человека на основе HTTP-запроса, вы можете получить MAC-адрес пользователя с помощью подписанного Java-апплета или с помощью Код подписанный javascript для firefox
@Raymond Nijland Я не понимаю, где cookie или http - я просто хочу проверить, есть ли данные в базе данных или нет - но одним запросом!
@АндрейКаргин, а что не так с твоим запросом WHERE login=:login OR email=:email OR ip=:ip ? ИМХО, это проверка того, что вам нужно.
«Я не понимаю, где cookie или http», ну, я объяснил вам, что теоретически невозможно однозначно идентифицировать человека в коде PHP/SQL, который вы, кажется, делаете здесь.. $message = 'You have already registered on the site, re-registration is prohibited and punishable by the rules of the site!'; верно?.. Вам понадобится MAC-адрес, который не отправляется через Интернет, но вы, скорее всего, можете получить его с помощью подписанного java-апплета или подписанного кода javascript и использовать MAC-адрес для уникальной идентификации сетевой карты, если только они не меняют MAC-адрес вне курса, что возможно в некоторых ОС ..
@RaymondNijland Или моя сетевая карта выходит из строя, и я покупаю новую
@Raymond Nijland IP не имеет к этому никакого отношения! Я просто хочу выполнить один запрос SELECT: логин, электронная почта, ip ОТ пользователей ГДЕ логин =: логин ИЛИ электронная почта =: электронная почта ИЛИ ip =: ip - и показать, что логин или электронная почта уже используются!
"IP тут ни при чем!" если это так, то почему часть OR ip =: ip в SQL?
@АндрейКаргин, что не так с вашей текущей реализацией???
@ Алекс, я думаю, что «когда я выполняю запрос на проверку, эти данные уже существуют, но они обрабатывают их из конец (как сделать наоборот?)», что означает, что проще всего как-то добавить ORDER BY .. Но не уверен, потому что я не вижу или не понимаю его пользователя дело и ожидаемые результаты.
Поскольку вы используете 3 OR в этом запросе, вы всегда рискуете получить более одного результата.
@RaymondNijland но обрабатывает с конца (как сделать наоборот?) Я просто совершенно неправильно понимаю эту фразу. Я не могу перевести это в какой-либо смысл. Вот почему я отметил «непонятно, о чем вы спрашиваете».
"но он обрабатывает его с конца (как сделать наоборот?) Я просто совершенно неправильно понимаю эту фразу. Я не могу перевести ее в какой-либо смысл" ну @Alex вопрос полностью трудно было перевести в какой-то смысл, что топикстартер был ища уникальность в тех столбцах, которые он прокомментировал на ваш ответ, эта идея никогда не приходила мне в голову, когда я читал этот вопрос.
Вы выполняете запрос, который вернет ДВЕ или, может быть, больше строк, но вы запускаете только ОДНУ Fetch и хотите знать, почему ОДНА СТРОКА, которую вы ВЫБИРАЕТЕ, не соответствует вашим ожиданиям?
@ Raymond Nijland Спасибо, этот ORDER BY user_id DESC LIMIT 1 сработал! Моя вина в том, что я заглушил вывод ошибки и вместо user_id просто написал id — я даже местами поменял в select но не получилось!
Допустим, вы исправили свой код, и все работает так, как вы ожидаете. Что происходит, когда кто-то вставляет IP-адрес пока, код проверяет, существует ли этот IP-адрес?
IP не кто не вставляет - это форма регистрации, ip я получаю через функцию function get_ip() filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); или FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 это не полный код @Strawberry
В общем, это действительно сложно сделать - я сделал несколько тестов. ЗАКАЗАТЬ ПО id DESC тоже не помогло!
Лучший вариант - проверить отдельно логин и отдельно проверить почту, теперь я понимаю свою глупость и то, что я так долго не мог найти что-то подобное.






Это не ответ, а просто большой комментарий.
Я до сих пор не могу понять, какова ваша цель. Но я чувствую, что вы хотите проверить уникальность: логин, адрес электронной почты и ip.
Вы можете сделать очень простую реализацию для этого.
https://www.db-fiddle.com/f/JB1EDnr8GBYsTU1z8dRDS/0
ALTER TABLE users ADD UNIQUE unique_login(login);
ALTER TABLE users ADD UNIQUE unique_ip(ip);
ALTER TABLE users ADD UNIQUE unique_email(email);
Как вы можете видеть в скрипте, MySql вернет вам правильное сообщение об ошибке, которое вы можете использовать для вывода.
Еще одна попытка угадать, что именно вы ищете, возможно, вам не нужно elseif, а просто ряд if в любом порядке:
if (empty($row)) {
echo "All is well!";
} else {
if ($row['ip']==$ip) {
$message .= "You have already registered - only one registration is allowed. \n";
};
if ($row['login']==$login) {
$message .= "Sorry, username is already taken! \n";
};
if ($row['email']==$email) {
$message .= "Sorry, the email id is already taken! \n";
};
echo $message;
}
Большое тебе спасибо! Да я просто хочу проверить на уникальность и вывести ошибку, что что-то уже есть.
За исключением того, что некоторые интернет-провайдеры используют DHCP для выделения IP-адресов, поэтому, если OP использует login=:login OR email=:email OR ip=:ip, и я законно вхожу в систему, используя IP-адрес, который использовался кем-то другим, законно входящим в систему, но теперь мне был выделен IP-адрес, который ранее был у другого человека, всегда будет более одного результата в наборе результатов
Или, используя это, ОП получит ложноположительный результат, или это ложноотрицательный результат, в любом случае результат будет ложным/неправильным
@RiggsFolly Я думаю, что OP просто игнорирует реальный мир в данный момент. Он не просит реального решения, он хочет достичь какой-то цели. И, вероятно, он вернется однажды, когда несколько человек из одного и того же офиса / города / местоположения (IP) не смогут зарегистрироваться, если ОП когда-нибудь это поймет.
Откуда вы знаете, что один IP-адрес принадлежит одному человеку? Что, если они используют VPN, живут в общежитии с другими, делят сеть с кем-то...? Что делать, если мой IP динамический, и я получаю новый IP, где уже кто-то зарегистрирован?