Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nie dodawaj danych z formularza do bazy jeżeli te istnieją - jak ?
Forum PHP.pl > Forum > PHP
x X x
Chciał bym napisać obsługę wyjątku, który sprawdzi, czy dodawane dane do bazy danych istnieją. Jeżeli tak - wyświetli komunikat, że takie dane już istnieją i zapytanie nie zostanie wykonane.

Powiedzmy, że mam takie zapytanie:

  1. <?php
  2.  
  3. $insert = "INSERT INTO tabela VALUES ('".$_POST['imie']."', '".$_POST['nazwisko']."', '".$_POST['email']."')";
  4.  
  5. $insert_osoba = parent::getDB()->run($insert);
  6.  
  7. echo 'potwierdzenie dodania';
  8.  
  9. ?>


Co teraz zrobić? Znalazłem taką funkcję jak mysql_insert_id(), ale nie wiem czy tutaj ją mogę wykorzystać. Wtedy zapytanie powinno zawierać jeszcze słowo IGNORE.

Tabela tabela pole ID ma unikatowe i uzupełniane automatycznie. Wartość tego pola nie jest przekazywana w formularzu, tylko powyższe dane.

Dodam, że mój formularz jest umieszczony w pętli foreach, więc w zapytaniu wykorzystuje jeszcze zmienną $i, ale to nie jest teraz istotne.
trueblue
Załóż index unikalny na jednym lub więcej pól, lub przed insertem zrób select sprawdzający czy istnieje rekord z takimi wartościami.
webmaniak
A słowem kluczowym w budowanym zapytaniu powinno być COUNT:
http://www.w3schools.com/sql/sql_func_count.asp
x X x
Gdy tworzyłem tabelę dopisałem coś takiego na końcu:

  1.  
  2. CONSTRAINT tabela_unique UNIQUE (
  3. prac_id,
  4. imie,
  5. nazwisko,
  6. email
  7. )
  8.  


czyli wziąłem pod uwagę wszystko.

Kwestę z selectem rozważałem, ale chyba nie jest to zbyt poprawna opcja ? Oczywiście da jakiś rezultat, ale można to zrobić chyba inaczej.

Zapytanie SQL:

  1.  
  2. SELECT COUNT(DISTINCT imie, nazwisko, email) AS PRACOWNIK FROM tabela
  3. /* usunąłem z zapytania prac_id */
  4.  


przypisać to do jakiejś zmiennej, i jeżeli jest większe od 0 tzn że taki wpis juz istnieje?
trueblue
Jeśli założyłeś również na prac_id, które jest autonumerem, to rekord dodawany do tabeli będzie unikalny w stosunku do każdego innego w tabeli.
Chyba, że dodawałbyś rekord z prac_id i taka wartość oraz wartości pozostałych pól istniałyby w tabeli.

Z COUNT nie mieszaj, i tak Twoim założeniem jest aby w bazie istniały unikalne (pojedyncze rekordy), więc po co zliczać. Jeśli już to zwykły select z warunkami.
x X x
No tak, rzeczywiście. Zaraz to zmienię. Zauwazyłem, że zapytanie z count nie zlicza ilości powtórzeń ale pokazuje mi tylko 0 lub 1 jeżeli wartości istnieją w bazie. Tak ma być?
trueblue
A zauważyłeś, że robisz count również na prac_id?
x X x
Ale w swojej tabeli nie brałem pod uwagę ID. To co zamieściłem w pierwszym poście to tylko przykładowe dane wink.gif Możliwe iż dostałem taki wynik dlatego, iż pole id również było zaznaczone jako unikatowe. Właśnie to zmieniłem, chciałem wrzucić insertem poprzednie dane, w których dane się dublowały i dostaję komunikat w MySQL że dane się dublują.

Edit:

Okej, zmieniłem strukture tabeli, dałem zapytanie. Po pierwsze teraz system automatycznie wykrywa czy dane isnieją i nie dodaje ich do bazy, a za pomocą zapytania z COUNT mogę sprawdzić czy wpis istnieje czy nie. Teraz tylko prosty IF i działam.

Pytanie, czy można to zrobić inaczej, skuteczniej, bez niepotrzebnego pobierania danych z tabeli. Jakąś funkcją czy czymś?
trueblue
Po pierwsze nie rób COUNT, bo albo dostaniesz 1, albo 0, dlatego, że z założenia masz tam unikatowe rekordy. Po co więc męczyć bazę i zliczać.
Zrób coś takiego:
  1. SELECT 1 FROM tabela WHERE imie='tu imie',nazwisko='tu nazwisko',email='tu email'
  2. /* zamiast select email,imie,nazwisko */

Ale jeszcze lepiej gdybyś sprawdził co dostajesz w $insert_osoba w przypadku duplikatu i błędnego zapytania, bo to może rozwiązać kwestię dodatkowego dopytywania bazy czy użytkownik istnieje.
x X x
A jak się odnieść do wyniku wykonania tego zapytania? Zakładając, że używam COUNT i zakładając, że zrobię zwykłego selecta ? Przy COUNT dałem sprawdzenie czy 1 lub 0, ale to nie działa, a przy zwykłym SELECT dać sprawdzenie czy NULL ?
trueblue
Wydrukuj zmienną, do której przekazujesz wynika z selecta. Będziesz wtedy wiedział na czym oprzeć warunek.
x X x
Udało mi się zrobić! Zrobiłe zwykłego selecta, tak jak pisałeś trueblue i po prostu sprawdzam czy wynik jest !empty. Jeżeli tak dostaje komunikat, jeżeli nie dane dodają się do bazy smile.gif Dzięki za to!

Mam jeszcze jedno szybkie pytanie - muszę zrobić walidację wpisywanych danych w inpucie typu tekstowego, mają to być tylko zadeklarowane wartości ocen takiego typu: 2, 3, 3.5, 4, 4.5, 5, ZAL - próbowałem zrobić to patternem ale tam niestety nie da się tego zrobić. Może jakieś rady na zakończenie ? Podobno odpowiada za to funkcja w PHP in_array?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.