Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nie dodawaj danych z formularza do bazy jeżeli te istnieją - jak ?
x X x
post
Post #1





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 21.01.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował x X x 27.03.2014, 16:53:20
Go to the top of the page
+Quote Post
trueblue
post
Post #2





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
webmaniak
post
Post #3





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

Ostrzeżenie: (0%)
-----


A słowem kluczowym w budowanym zapytaniu powinno być COUNT:
http://www.w3schools.com/sql/sql_func_count.asp

Ten post edytował webmaniak 27.03.2014, 17:12:20
Go to the top of the page
+Quote Post
x X x
post
Post #4





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 21.01.2014

Ostrzeżenie: (0%)
-----


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?

Ten post edytował x X x 27.03.2014, 17:47:11
Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował trueblue 27.03.2014, 17:28:31
Go to the top of the page
+Quote Post
x X x
post
Post #6





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 21.01.2014

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
trueblue
post
Post #7





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A zauważyłeś, że robisz count również na prac_id?
Go to the top of the page
+Quote Post
x X x
post
Post #8





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 21.01.2014

Ostrzeżenie: (0%)
-----


Ale w swojej tabeli nie brałem pod uwagę ID. To co zamieściłem w pierwszym poście to tylko przykładowe dane (IMG:style_emoticons/default/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ś?

Ten post edytował x X x 27.03.2014, 17:46:22
Go to the top of the page
+Quote Post
trueblue
post
Post #9





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował trueblue 27.03.2014, 18:03:34
Go to the top of the page
+Quote Post
x X x
post
Post #10





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 21.01.2014

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
trueblue
post
Post #11





Grupa: Zarejestrowani
Postów: 6 809
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Wydrukuj zmienną, do której przekazujesz wynika z selecta. Będziesz wtedy wiedział na czym oprzeć warunek.
Go to the top of the page
+Quote Post
x X x
post
Post #12





Grupa: Zarejestrowani
Postów: 32
Pomógł: 0
Dołączył: 21.01.2014

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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?

Ten post edytował x X x 28.03.2014, 16:35:52
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.01.2026 - 04:15