Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Transakcje w PDO
Userr
post
Post #1





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 27.10.2015

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


1. Jeżeli używam transakcji PDO, to w którym momencie powinienem wywołać closeCursor()? W tym przykładzie nie ma w ogóle wywołania closeCursor():

http://thisinterestsme.com/php-pdo-transaction-example/

więc może w przypadku transakcji nie trzeba w ogóle wywoływać closeCursor()?

2. Modyfikując przykład stąd:

http://thisinterestsme.com/php-pdo-transaction-example/

Jeżeli zapytań nie umieszczę "bezpośrednio" pomiędzy funkcjami beginTransaction() i commit(), tylko opakuje je w swoje funkcje (a same zapytania będę właśnie w tych funkcjach), to czy transakcje będę działa poprawnie?

  1. $pdo->beginTransaction();
  2.  
  3. try
  4. {
  5.  
  6. DodajPieniadze();
  7.  
  8. AktualizujPlatnosc();
  9.  
  10. $pdo->commit();
  11.  
  12. }
  13.  
  14. ...........
  15.  
  16. FUNCTION DodajPieniadze()
  17. {
  18. //Query 1: Attempt TO INSERT the payment record INTO our DATABASE.
  19. $sql = "INSERT INTO payments (user_id, amount) VALUES (?, ?)";
  20. $stmt = $pdo->prepare($sql);
  21. $stmt->execute(array(
  22. $userId,
  23. $paymentAmount,
  24. )
  25. );
  26. }
  27.  
  28. FUNCTION AktualizujPlatnosc()
  29. {
  30. //Query 2: Attempt TO UPDATE the user's profile.
  31. $sql = "UPDATE users SET credit = credit + ? WHERE id = ?";
  32. $stmt = $pdo->prepare($sql);
  33. $stmt->execute(array(
  34. $paymentAmount,
  35. $userId
  36. )
  37. );
  38. }
Go to the top of the page
+Quote Post
trueblue
post
Post #2





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

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


1. A będziesz obejmował transakcją SELECT? Po co Ci w takim razie closeCursor?
2. Tak, jeśli funkcje będą mieć dostęp do tego samego obiektu pod zmienną $pdo.


--------------------
Go to the top of the page
+Quote Post
Userr
post
Post #3





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 27.10.2015

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


1. Tak - będzie jeden select i dwa inserty.
2. To będzie wyglądało tak, że będę miał klasę, a kod zapytań będzie umieszczony w metodach tej klasy. Zmienna $pdo będzie składnikiem klasy, więc będzie też znana we wszystkich jej metodach. W takiej sytuacji nie będzie chyba problemu?

Ten post edytował Userr 15.03.2017, 12:13:33
Go to the top of the page
+Quote Post
trueblue
post
Post #4





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

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


Po co obejmujesz SELECT transakcją?


--------------------
Go to the top of the page
+Quote Post
javafxdev
post
Post #5





Grupa: Zarejestrowani
Postów: 95
Pomógł: 7
Dołączył: 27.10.2015

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


@truebule a dlaczego SELECT ma nie być w transakcji?
Go to the top of the page
+Quote Post
trueblue
post
Post #6





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

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


javafxdev,
chce się dowiedzieć jaki to SELECT (czego dotyczy). Nie neguję jego obecności.


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





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 27.10.2015

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


Będę miał SELECT ponieważ zanim dodam ocenę do bazy chcę sprawdzić czy taki uczeń już istnieje, więc będzie to coś w stylu:

  1. SELECT * FROM uczniowie WHERE id = $id


i jeżeli to zapytanie zwróci zero wierszy (nie ma jeszcze takiego ucznia w tabeli) to dodam za pomocą INSERT nowy wiersz (w którym będą dane o tym uczniu) do tabeli uczniowie i dopiero następnie też za pomocą INSERT dodam nowy wiersz z oceną do tabeli oceny.

Jeżeli taki uczeń już istnieje, to dodam tylko ocenę do tabeli oceny.

Ten post edytował Userr 17.03.2017, 10:43:53
Go to the top of the page
+Quote Post
viking
post
Post #8





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


W większości baz jest albo domyślnie, albo można dopisać prosty kod - un duplicate key update więc select jest zbędny.


--------------------
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: 19.08.2025 - 08:59