Пожалуйста, помогите мне выбрать pdo MySQL

Я пытаюсь найти, что я делаю неправильно - я не могу понять или найти информацию об этом.

Короче говоря, в таблице 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?


Результат, всем спасибо!

Лучший вариант - проверить отдельно логин и отдельно проверить почту, теперь я понимаю свою глупость и то, что я так долго не мог найти что-то подобное.

Я, конечно, могу проверить все сразу и вывести информацию о том, что что-то уже есть, но определить, в каком порядке, невозможно. А при отдельном тесте на существование мы точно знаем, что у нас есть, и точно знаем, какую информацию отображать.

Откуда вы знаете, что один IP-адрес принадлежит одному человеку? Что, если они используют VPN, живут в общежитии с другими, делят сеть с кем-то...? Что делать, если мой IP динамический, и я получаю новый IP, где уже кто-то зарегистрирован?

Qirel 22.02.2019 15:19

Вы пытаетесь сделать это просто, но это не простой процесс.

RiggsFolly 22.02.2019 15:23

Вы должны пойти в направлении использования постоянных файлов cookie, подобных вещей Etags, но они также не будут работать, если кто-то использует больше браузеров.. имейте в виду, что в некоторых странах есть законы, запрещающие использование постоянных методов отслеживания. Общий регламент ЕС по защите данных ( GDPR) приходит на ум..

Raymond Nijland 22.02.2019 15:30

В общем, я думаю, что либо я не так сказал - либо это действительно сложно сделать! Верхний код работает нормально, но наоборот!

Андрей Каргин 22.02.2019 15:32

да, как говорит @RiggsFolly, это не так просто, протокол HTTP не имеет состояния, что означает, что вы не можете однозначно идентифицировать человека на основе HTTP-запроса, вы можете получить MAC-адрес пользователя с помощью подписанного Java-апплета или с помощью Код подписанный javascript для firefox

Raymond Nijland 22.02.2019 15:36

@Raymond Nijland Я не понимаю, где cookie или http - я просто хочу проверить, есть ли данные в базе данных или нет - но одним запросом!

Андрей Каргин 22.02.2019 15:39

@АндрейКаргин, а что не так с твоим запросом WHERE login=:login OR email=:email OR ip=:ip ? ИМХО, это проверка того, что вам нужно.

Alex 22.02.2019 15:42

«Я не понимаю, где 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-адрес вне курса, что возможно в некоторых ОС ..

Raymond Nijland 22.02.2019 15:42

@RaymondNijland Или моя сетевая карта выходит из строя, и я покупаю новую

RiggsFolly 22.02.2019 15:47

@Raymond Nijland IP не имеет к этому никакого отношения! Я просто хочу выполнить один запрос SELECT: логин, электронная почта, ip ОТ пользователей ГДЕ логин =: логин ИЛИ электронная почта =: электронная почта ИЛИ ip =: ip - и показать, что логин или электронная почта уже используются!

Андрей Каргин 22.02.2019 15:49

"IP тут ни при чем!" если это так, то почему часть OR ip =: ip в SQL?

Raymond Nijland 22.02.2019 15:51

@АндрейКаргин, что не так с вашей текущей реализацией???

Alex 22.02.2019 15:51

@ Алекс, я думаю, что «когда я выполняю запрос на проверку, эти данные уже существуют, но они обрабатывают их из конец (как сделать наоборот?)», что означает, что проще всего как-то добавить ORDER BY .. Но не уверен, потому что я не вижу или не понимаю его пользователя дело и ожидаемые результаты.

Raymond Nijland 22.02.2019 15:54

Поскольку вы используете 3 OR в этом запросе, вы всегда рискуете получить более одного результата.

RiggsFolly 22.02.2019 15:56

@RaymondNijland но обрабатывает с конца (как сделать наоборот?) Я просто совершенно неправильно понимаю эту фразу. Я не могу перевести это в какой-либо смысл. Вот почему я отметил «непонятно, о чем вы спрашиваете».

Alex 22.02.2019 16:00

"но он обрабатывает его с конца (как сделать наоборот?) Я просто совершенно неправильно понимаю эту фразу. Я не могу перевести ее в какой-либо смысл" ну @Alex вопрос полностью трудно было перевести в какой-то смысл, что топикстартер был ища уникальность в тех столбцах, которые он прокомментировал на ваш ответ, эта идея никогда не приходила мне в голову, когда я читал этот вопрос.

Raymond Nijland 22.02.2019 16:03

Вы выполняете запрос, который вернет ДВЕ или, может быть, больше строк, но вы запускаете только ОДНУ Fetch и хотите знать, почему ОДНА СТРОКА, которую вы ВЫБИРАЕТЕ, не соответствует вашим ожиданиям?

RiggsFolly 22.02.2019 16:04

@ Raymond Nijland Спасибо, этот ORDER BY user_id DESC LIMIT 1 сработал! Моя вина в том, что я заглушил вывод ошибки и вместо user_id просто написал id — я даже местами поменял в select но не получилось!

Андрей Каргин 22.02.2019 16:06

Допустим, вы исправили свой код, и все работает так, как вы ожидаете. Что происходит, когда кто-то вставляет IP-адрес пока, код проверяет, существует ли этот IP-адрес?

Strawberry 22.02.2019 16:31

IP не кто не вставляет - это форма регистрации, ip я получаю через функцию function get_ip() filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); или FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 это не полный код @Strawberry

Андрей Каргин 22.02.2019 16:40

В общем, это действительно сложно сделать - я сделал несколько тестов. ЗАКАЗАТЬ ПО id DESC тоже не помогло!

Андрей Каргин 22.02.2019 16:50

Лучший вариант - проверить отдельно логин и отдельно проверить почту, теперь я понимаю свою глупость и то, что я так долго не мог найти что-то подобное.

Андрей Каргин 22.02.2019 17:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
22
85
1

Ответы 1

Это не ответ, а просто большой комментарий.

Я до сих пор не могу понять, какова ваша цель. Но я чувствую, что вы хотите проверить уникальность: логин, адрес электронной почты и 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;
  }

Большое тебе спасибо! Да я просто хочу проверить на уникальность и вывести ошибку, что что-то уже есть.

Андрей Каргин 22.02.2019 15:43

За исключением того, что некоторые интернет-провайдеры используют DHCP для выделения IP-адресов, поэтому, если OP использует login=:login OR email=:email OR ip=:ip, и я законно вхожу в систему, используя IP-адрес, который использовался кем-то другим, законно входящим в систему, но теперь мне был выделен IP-адрес, который ранее был у другого человека, всегда будет более одного результата в наборе результатов

RiggsFolly 22.02.2019 15:43

Или, используя это, ОП получит ложноположительный результат, или это ложноотрицательный результат, в любом случае результат будет ложным/неправильным

RiggsFolly 22.02.2019 15:44

@RiggsFolly Я думаю, что OP просто игнорирует реальный мир в данный момент. Он не просит реального решения, он хочет достичь какой-то цели. И, вероятно, он вернется однажды, когда несколько человек из одного и того же офиса / города / местоположения (IP) не смогут зарегистрироваться, если ОП когда-нибудь это поймет.

Alex 22.02.2019 15:47

Другие вопросы по теме