Tak jak w temacie, chcę dodać do bazy rekord, jeżeli ten nie istnieje, a jeżeli istnieje zwrócić false, próbowałem już setki rozwiązań z stackoverflow i za każdym razem wywala błąd
SELECT CASE WHEN EXISTS ( SELECT * FROM users WHERE login = :login OR mail = :mail ) THEN INSERT INTO users (login,mail,name,city,avatar,ip_addr,reg_date,last_log_date,active,permissions,famous,rang,banned,warns) VALUES (:login,:mail,:password,0,0,"$ip","$date",0,0,0,0,0,0,0, )) ELSE CAST(0 AS BIT) END
INSERT INTO users (login,mail,password,name,city,avatar,ip_addr,reg_date,last_log_date,active,permissions,famous,rang,banned,warns) VALUES (:login,:mail,:password,0,0,0,"$ip","$date",0,0,0,0,0,0,0 ) SELECT DISTINCT login FROM users WHERE NOT EXISTS (SELECT 1 FROM users WHERE login = :login)
Złap wyjątek dla insert i zamień sobie wtedy odpowiedź na false.
A możesz nieco jaśniej? Bazy danych to zdecydowanie nie jest moja mocna strona, zresztą dlatego teraz pisze, żeby podszlifować umiejętności.
try { zapytanie insert które w przypadku zduplikowania danych (maila lub loginu) zwróci wyjątek } catch (\PDOException $e) { return false; }
No dobrze, rozumiem o co chodzi, tylko jak mam zwrócić ten wyjątek. zresztą wolałbym zrobić to w jednym zapytaniu, bo mam obiekt z metodami odnoszącymi się do bazy danych, a w tych metodach chcę tylko dołaczać zapytanie jako file_get_contents, żeby nie było pomieszanych zapytań z PHP, bo będzie to nieczytelne.
Konkretnie mam wysyłany json przez ajax do pliku controller.php, w nim switcha i dołączanie odpowiednicyh plików, jeżeli dane przejdą przez walidacje, to tworzy obiekt wspomnianej bazy danych, a zapytania są w folderze queries.
Sposób dołączania zapytania nie ma żadnego znaczenia. Błędne zapytanie spowodfuje automatyczne rzucenie wyjątku - dla PDO $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Nie wystarczy
Czyli według Ciebie lepsze będzie zignorowanie? To wygląda na rejestrację. Nie ma znaczenia jaki błąd sypnie baza. Ważny jest efekt końcowy czyli brak rekordu.
Wytłumaczę ci najprościej jak się da. Baza danych porównuje zbiory. Zbiór twoich danych wejściowych (daną wejściową jest rekord) ze zbiorem danych z tabeli.
Utwórz sobie taki zbiór i go go porównaj z tabelą. Jesli go nie znajdzie, to wtedy dodaj.
Czyli po kolei
Utworzenie zbioru jednoelementowego:
SELECT :login AS login, :mail AS mail, :password AS pass, :ip AS ip, :DATA AS date
SELECT * FROM (SELECT :login AS login, :mail AS mail, :password AS pass, :ip AS ip, :DATA AS date) AS sub LEFT JOIN users AS u ON u.login=sub.login WHERE u.login IS NULL
INSERT INTO users(login, mail, pass, ip, date) SELECT sub.* FROM (SELECT :login AS login, :mail AS mail, :password AS pass, :ip AS ip, :DATA AS date) AS sub LEFT JOIN users AS u ON u.login=sub.login WHERE u.login IS NULL
Ło matko.. najlepiej jak by napisać do tego jeszcze jakiś mikroserwis który będzie to sprawdzał...
Do Autora tematu. Załóż 2 indeksy Unique w Bazie na pola `email` i `username` i wykonuj normalny INSERT bez żadnych pierdoł.
W przypadku próbu wrzucenia rekordu nie unikalnego po prostu się nie stworzy a PDO wyrzuci Exceprion który musisz złapać.
Tu masz przykład:
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)