Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL]Powiązane ze sobą zapytania
Lirdoner
post 2.08.2012, 11:19:10
Post #1





Grupa: Zarejestrowani
Postów: 500
Pomógł: 1
Dołączył: 29.09.2009

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


Witam, Przy rejestracji użytkownika muszę wprowadzić kilka rekordów do oddzielnych tabel.
Najpierw do tabeli użytkowników, potem do tabeli z kodem aktywacyjnym a na końcu do jeszcze jednej.
Do tych dwóch ostatnich tabel potrzebuję id właśnie wprowadzonego użytkownika. To nie będzie problemem (pdo->lastInstertId). Tylko teraz chciałbym mieć pewność, że jeżeli nie wykona się pierwsza zapytania to nie wykona się i drugi i trzecia, a jeżeli np. nie wykona się 3 to nie wykona się i pierwsze i drugie.
Da radę takie coś zrobić? Czytałem coś żeby użyć do tego transakcji, ale jak wtedy pobrać id użytkownika wprowadzonego właśnie do bazy?
Go to the top of the page
+Quote Post
CuteOne
post 2.08.2012, 12:22:50
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Przykład z manuala
  1. <?php
  2. /* Begin a transaction, turning off autocommit */
  3. $dbh->beginTransaction();
  4.  
  5. /* Change the database schema and data */
  6. $sth = $dbh->exec("DROP TABLE fruit");
  7. $sth = $dbh->exec("UPDATE dessert
  8. SET name = 'hamburger'");
  9.  
  10. /* Recognize mistake and roll back changes */
  11. $dbh->rollBack();
  12.  
  13. /* Database connection is now back in autocommit mode */
  14. ?>


Innymi słowy, możesz wykonać kilka zapytań do bazy w trakcie jednej transakcji
Go to the top of the page
+Quote Post
WebCM
post 2.08.2012, 12:26:17
Post #3





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


Możesz pobrać ID użytkownika nawet wewnątrz transakcji. Jeżeli używasz MySQL, wybierz typ tabel InnoDB, bo MyISAM nie obsługuje transakcji. Wygląda to tak:
  1. try
  2. {
  3. $db->beginTransaction();
  4. $zapytanie = $db->prepare('INSERT INTO tabela (pole) VALUES (:pole)');
  5. $zapytanie->execute(array('pole' => 'wartość'));
  6. $id = $db->lastInsertId(); //lub: $db->lastInsertId('nazwa_sekwencji');
  7. $db->query('INNE ZAPYTANIE');
  8. $db->commit();
  9. }
  10. catch(PDOException $e)
  11. {
  12. $db->rollBack();
  13. }


Ten post edytował WebCM 2.08.2012, 12:29:06


--------------------
„Jesteśmy różni, pochodzimy z różnych stron Polski, mamy różne zainteresowania, ale łączy nas jeden cel. Cel ten to Ojczyna, dla której chcemy żyć i pracować.” Roman Dmowski
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 Wersja Lo-Fi Aktualny czas: 8.06.2024 - 10:58