![]() ![]() |
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:
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 |
|
|
|
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.
|
|
|
|
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 |
|
|
|
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:
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:
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 |
|
|
|
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 |
|
|
|
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ć?
|
|
|
|
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?
|
|
|
|
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 |
|
|
|
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:
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 |
|
|
|
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 ?
|
|
|
|
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.
|
|
|
|
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 |
|
|
|
![]() ![]() |
|
Aktualny czas: 16.01.2026 - 04:15 |