Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Transakcje w PDO
Forum PHP.pl > Forum > Bazy danych > MySQL
Userr
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. }
trueblue
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.
Userr
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?
trueblue
Po co obejmujesz SELECT transakcją?
javafxdev
@truebule a dlaczego SELECT ma nie być w transakcji?
trueblue
javafxdev,
chce się dowiedzieć jaki to SELECT (czego dotyczy). Nie neguję jego obecności.
Userr
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.
viking
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.
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.