Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL][MySQL]Wykrywanie dodania rekordu do bazy MySQL, Po dodaniu rekordu do bazy wykonuje się funksja sumująca ...
maverickoti
post
Post #1





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 5.04.2013

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


Witam.

Mam taki problem. Mianowicie mam jedną bazę z paroma tabelami. I w jednej tabeli zawarte są punkty użytkowników. Punkty dodawane są za pomocą wpisów do tabeli np:
id | punkty
01 | 20
02 | 5
01 | 10

Ja widać user 01 posiada 30 pkt (20+10) a użytkownik 02 posiada 5 pkt

Teraz potrzebuje, rozwiązania, która "wykryje" dodanie nowego rekodru, zsumuje rekordy i wynik doda do tabeli w tej samej bazie.

Potrafię to zrobić przy pomocy ręcznego wywołania funkcji, lecz potrzebuje to zautomatyzować, by funkcja aktywowała się za każdym razem jak zostanie dodany nowy rekord. Zaznacze, że punkty można dodawać w różny sposób (poprzez kupienie ich, ręczne dodanie z panelu administratora, wpisanie kodu w panelu klienta). Wynik oczywiście jest taki sam, czyli nowy rekord z punktami.

Ma ktoś jakąś konstruktywną sugestję jak to rozwiązać? Może użyć CRON? Da się by cron aktywował operacją w momencie dodania rekordu do bazy?
Go to the top of the page
+Quote Post
Turson
post
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


O ile się nie mylę to możesz użyć triggera w bazie danych na akcję dodania nowego rekordu
Go to the top of the page
+Quote Post
tzm
post
Post #3





Grupa: Zarejestrowani
Postów: 675
Pomógł: 58
Dołączył: 17.12.2013

Ostrzeżenie: (10%)
X----


if($query) - czy zapytanie wykonano
Go to the top of the page
+Quote Post
maverickoti
post
Post #4





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 5.04.2013

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


Witam

Poszedłem za sugestią Turson'a i dzisiaj rano postanowiłem napisac swój pierwszy trigger. Oczywiście nie obeszło się problemów. Po,mprzeczytaniu paru tutków coś tam nakreśliłem.
  1. CREATE TRIGGER transfer AFTER UPDATE
  2. ON pob1_djcf_users_points
  3. FOR EACH ROW
  4. BEGIN
  5. DECLARE points FLOAT;
  6. DECLARE userid int;
  7. SET points:=LAST_INSERT_ID();
  8. SET userid:=LAST_INSERT_ID();
  9. /*
  10. 1. wyciągnie wartosc 'points' @points
  11. */
  12.  
  13. ...
  14. UPDATE `pob1_users` SET `Jaki_posiada_transfer` = `Jaki_posiada_transfer` + points WHERE `id`=userid;
  15. END


W związku z tym potrzebuje paru wskazówek. Mianowicie:
1. Czy trzeba na początku deklarować zmienną? Widziałem w niekturych przykładach, że zmienna nie była deklarowana. (DECLARE points FLOAT;)
2. W niekturych przykładach na początku zmiennej występowała @. Więc zmienna powinna wyglądać tak: points czy tak @points ?
3. Dzięki takiemu wyrażeniu "LAST_INSERT_ID();" pobieram wartość id ostatniego rekordu. A jak pobrać wartość komórki z ostatniego rekordu? Mam to zrobić normalnym zapytaniem jakie stosuje w php czy jest jakiś magiczny zwrot?


Z góry dzięki za wszelkie odpowiedzi.
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie wiem co ty za tutki tam czytales..... a czemu nie manuala?
Podstawy:
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
Przyklady
http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html

nie AFTER UPDATE tylko AFTER INSERT... zdaje sie dodajesz rekordy i to chcesz przechwycic
LAST_INSERT_ID do niczego ci nie jest potrzebne. Wszelkie wkladane dane do tabeli są w NEW - ale to jest napisane w pierwszym linku co ci podalem.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
maverickoti
post
Post #6





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 5.04.2013

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


Wielkie dzięki za pomoc.

Przyswoiłem sobie wiedzę z linków od ciebie i oczywiście udało się za pierwszym razem biggrin.gif Dla zainteresowanych mój pierwszy trigger wygląda następująco :
  1. CREATE TRIGGER transfer AFTER INSERT
  2. ON pob1_djcf_users_points
  3. FOR EACH ROW
  4. BEGIN
  5. SET @points = NEW.points;
  6. UPDATE pob1_users SET Jaki_posiada_transfer = Jaki_posiada_transfer + @points WHERE id = NEW.userid;
  7. END


Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




SET @points = NEW.points;
nie ma sensu tworzyc zmiennej @points.... mozesz od razu dzialac na NEW.points tak jak robisz to z NEW.userid


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
maverickoti
post
Post #8





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 5.04.2013

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


zauważyłem z tym points, że ta linijka jest niepotrzebna, ale chciałem zobaczyć czy zadziałą smile.gif

Tak mi się spodobały triggery, że postanowiłem napisać następny iii znowu ściana. Coś namieszłaem z pętlą chyba. Możecie na to zerknąć:
  1. BEGIN
  2. SET @gen_nr_aukcji = NEW.gen_nr_aukcji;
  3. SET @gen_ilosc_kodow = NEW.gen_ilosc_kodow;
  4.  
  5. SET @gen_dni_new = NEW.gen_dni_new;
  6. SET @gen_trans_new = NEW.gen_trans_new;
  7. SET @dzien = date(d);
  8. SET @miesiac = date(m);
  9. SET @rok = date(y);
  10. SET @full_data = date();
  11.  
  12. FOR nazwa_petli IN 1..@gen_ilosc_kodow loop
  13. @random_kod(10000, 99999);
  14. @wygenerowany_kod = @gen_dni_new . @dzien . @random_kod . @rok . @miesiac . @gen_trans_new;
  15. INSERT INTO aaa_kody VALUES ('','@gen_nr_aukcji','@wygenerowany_kod','@full_data');
  16. end loop;
  17. END


trigger to before insert
Dodam tylko, że (@gen_dni_new . @dzien . @random_kod . @rok . @miesiac . @gen_trans_new;) to są wartości liczbowa a ja nie chcę ich dodawać tylko je połączyć w jeden ciąg liczbowy.

Błąd jaki otrzymuje:
"/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ');

for nazwa_petli in 1..@gen_ilosc_kodow loop
@random_kod(10000, 99999);' at line 10 */"

Ten post edytował maverickoti 23.06.2014, 21:51:10
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #9





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


1. Zmiene się deklaruje między innymi po to, by mieć jakieś wartości "startowe" nawet jak nic się nie ma... Np.
DECLARE points FLOAT DEFAULT 0;
2. Twoje triggery nie są odpowrne na wartości NULL....
3. Łączenie stringów to tzw konkatenacja - trudny wyraz, ale wart zapamiętania.
SET @wygenerowany_kod = CONCAT(Coalesce(@gen_dni_new, '') , Coalesce(@dzien, '') , Coalesce(@random_kod, '') , Coalesce(@rok, '') , Coalesce(@miesiac, '') , Coalesce(@gen_trans_new, ''));

EDIT: Jesli jeszcze by nie poszło, to dodaj CAST, czyli... SET @wygenerowany_kod = CONCAT(Cast(Coalesce(@gen_dni_new, '') As Char), ...

Ten post edytował mmmmmmm 23.06.2014, 22:17:42
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jak dla mnie to w komunikacie bledu macie wyraznie pokazane, ktorej linii tyczy sie blad... jest to linia 10 i chodzi zapewne o funkcję DATE(). Prosze zajrzec do manuala MYSQL jak w MYSQL uzywa sie funkcji DATE i nie mylic jej z funkcją DATE w PHP.... To sa dwie rózne rzeczy. PHP <> MYSQL

ps: oczywiscie uzywanie kropek, jak to ma miejsce w PHP, zapewne też jest błędem w MYSQL wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 10:26