Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Powiązane ze sobą zapytania
Forum PHP.pl > Forum > Przedszkole
Lirdoner
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?
CuteOne
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
WebCM
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. }
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.