Как вернуть в запросе INSERT-SELECT, который существовал в условии WHERE - PullRequest
0 голосов
/ 29 ноября 2018

вы видите, у меня есть этот запрос:

 $sql = "INSERT INTO visitor( visitor_username, email, PASSWORD ) 
       SELECT * FROM ( SELECT '$username', '$email','$password') 
       AS tmp WHERE NOT EXISTS 
      (SELECT admin.admin_username, admin.email FROM admin AS admin 
      WHERE admin.admin_username = '$username' OR admin.email = '$email' 
      UNION SELECT staff.staff_username, staff.email FROM staff 
      AS staff WHERE staff.staff_username = '$username' OR 
      staff.email = '$email' ) LIMIT 1";

в основном, если значения (visitor_username, email) не существует в таблице admin / staff, мы вставляем значения, это работает довольно хорошо и быстро,но хорошее решение не всегда приносит радуги.

, если мы не можем вставить какие-либо значения в таблицу, я возвращаю это сообщение об ошибке

echo "User already exists. Please choose a different email address or username.";

Так как я не могу определить, какое из них существовало, я хотел бычтобы в конкретном случае возвращалась ошибка для имени пользователя или адреса электронной почты.

Должен ли я разделить запрос (один выбор, затем вставить) или есть какой-либо другой способ, которым я не нахожу онлайн, чтобы сделать то же самоеquery?

Моя цель - вернуть конкретное сообщение об ошибке с этим запросом, например:

«Ошибка: имя пользователя уже существует» или «Ошибка: электронная почта уже существует».

Спасибо за проверку и пытаться помочь мне заранее!

1 Ответ

0 голосов
/ 29 ноября 2018

Я бы создал два запроса или одну функцию MySQL, которая будет возвращать некоторый ответ.В случае, если вы решите использовать функцию MySQL, вот как это сделать (настройте следующий запрос для вашей цели):

delimiter $$;
  create function `function_name`() returns integer deterministic
  begin
    select count(*) into a from `table` where 1 = 1;
    if a > 0 then
      insert into `table`(`col1`, `col2`) values('val1', 'val2');
      select if(last_insert_id() > 0, 'response_200', 'response_500') into b from dual; 
      return b;
    else
      return 'response_501';
    end if;
  end $$
delimiter ;

Эта функция будет вызываться как запрос ниже, и вы получите только одну запись содин из вышеперечисленных выходов:

select `function_name`() as `response`;
...