Lirdoner
2.08.2012, 11:19:10
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
2.08.2012, 12:22:50
Przykład z manuala
<?php
/* Begin a transaction, turning off autocommit */
$dbh->beginTransaction();
/* Change the database schema and data */
$sth = $dbh->exec("DROP TABLE fruit");
$sth = $dbh->exec("UPDATE dessert
SET name = 'hamburger'");
/* Recognize mistake and roll back changes */
$dbh->rollBack();
/* Database connection is now back in autocommit mode */
?>
Innymi słowy, możesz wykonać kilka zapytań do bazy w trakcie jednej transakcji
WebCM
2.08.2012, 12:26:17
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:
try
{
$db->beginTransaction();
$zapytanie = $db->prepare('INSERT INTO tabela (pole) VALUES (:pole)');
$zapytanie->execute(array('pole' => 'wartość')); $id = $db->lastInsertId(); //lub: $db->lastInsertId('nazwa_sekwencji');
$db->query('INNE ZAPYTANIE');
$db->commit();
}
catch(PDOException $e)
{
$db->rollBack();
}