Resumo : neste tutorial, você aprenderá como realizar uma transação de banco de dados a partir de PHP usando a API PDO.
Introdução à transação PHP PDO
Para iniciar uma transação no PDO, você utiliza o PDO::beginTransaction()
método:
$pdo->beginTransaction();
Linguagem de código: PHP ( php )
O beginTransaction()
método desativa o modo de confirmação automática. Isso significa que as alterações feitas no banco de dados por meio do objeto PDO não terão efeito até que você chame o PDO::commit()
método.
Para confirmar uma transação, você chama o PDO::commit()
método:
$pdo->commit();
Linguagem de código: PHP ( php )
Se quiser reverter a transação, você pode chamar o PDO::rollback()
método:
$pdo->rollback();
Linguagem de código: PHP ( php )
O PDO::rollback()
método reverte todas as alterações feitas no banco de dados. Além disso, retorna a conexão ao modo autocommit.
O PDO::beginTransaction()
método lança uma exceção se o banco de dados não suportar transações.
Exemplo de transação DOP
Suponha que você precise inserir dados em três tabelas: books
, authors
e book_authors
.
Para fazer isso, você precisa:
- Obtenha o ID do autor se o autor existir; caso contrário, insira o autor na
authors
tabela. - Insira o livro na
books
mesa. - Insira o link entre livro e autor na
book_authors
tabela.
Para organizar o código, colocaremos todas as funções no functions.php
arquivo e incluiremos no script principal.
A get_author_id()
função a seguir localiza o autor pelo nome e sobrenome e retorna o ID do autor se o autor existir na authors
tabela:
<?php
function get_author_id(\PDO $pdo, string $first_name, string $last_name)
{
$sql = 'SELECT author_id
FROM authors
WHERE first_name = :first_name
AND last_name = :last_name';
$statement = $pdo->prepare($sql);
$statement->bindParam(':first_name', $first_name, PDO::PARAM_STR);
$statement->bindParam(':last_name', $last_name, PDO::PARAM_STR);
if ($statement->execute()) {
$row = $statement->fetch(PDO::FETCH_ASSOC);
return $row !== false ? $row['author_id'] : false;
}
return false;
}
Linguagem de código: HTML, XML ( xml )
A insert_author()
função a seguir insere um novo autor na authors
tabela e retorna o ID do autor:
<?php
function insert_author(\PDO $pdo, string $first_name, string $last_name): int
{
$sql = 'INSERT INTO authors(first_name, last_name)
VALUES(:first_name, :last_name)';
$statement = $pdo->prepare($sql);
$statement->bindParam(':first_name', $first_name, PDO::PARAM_STR);
$statement->bindParam(':last_name', $last_name, PDO::PARAM_STR);
$statement->execute();
return $pdo->lastInsertId();
}
Linguagem de código: HTML, XML ( xml )
A insert_book()
função a seguir insere um novo livro na books
tabela:
<?php
function insert_book(\PDO $pdo, string $title, string $isbn, string $published_date, int $publisher_id): int
{
$sql = 'INSERT INTO books(title, isbn, published_date, publisher_id)
VALUES(:title, :isbn, :published_date, :publisher_id)';
$statement = $pdo->prepare($sql);
$statement->bindParam(':title', $title, PDO::PARAM_STR);
$statement->bindParam(':isbn', $isbn, PDO::PARAM_STR);
$statement->bindParam(':published_date', $published_date, PDO::PARAM_STR);
$statement->bindParam(':publisher_id', $publisher_id, PDO::PARAM_INT);
$statement->execute();
return $pdo->lastInsertId();
}
Linguagem de código: HTML, XML ( xml )
A função a seguir insere uma nova linha na book_authors
tabela:
<?php
function insert_book_author(\PDO $pdo, int $book_id, int $author_id)
{
$sql = 'INSERT INTO book_authors(book_id, author_id)
VALUES(:book_id, :author_id)';
$statement = $pdo->prepare($sql);
$statement->bindParam(':book_id', $book_id, PDO::PARAM_INT);
$statement->bindParam(':author_id', $author_id, PDO::PARAM_INT);
$statement->execute();
}
Linguagem de código: HTML, XML ( xml )
O script a seguir usa as funções acima para realizar uma transação:
<?php
require 'functions.php';
$pdo = require 'connect.php';
$book = [
'title' => 'Eternal',
'isbn' => '9780525539766',
'published_date' => '2021-03-23',
'publisher_id' => 2,
];
$author = [
'first_name' => 'Lisa',
'last_name' => 'Scottoline',
];
try {
$pdo->beginTransaction();
// find the author by first name and last name
$author_id = get_author_id(
$pdo,
$author['first_name'],
$author['last_name']
);
// if author not found, insert a new author
if (!$author_id) {
$author_id = insert_author(
$pdo,
$author['first_name'],
$author['last_name']
);
}
$book_id = insert_book(
$pdo,
$book['title'],
$book['isbn'],
$book['published_date'],
$book['publisher_id']
);
// insert the link between book and author
insert_book_author($pdo, $book_id, $author_id);
// commit the transaction
$pdo->commit();
} catch (\PDOException $e) {
// rollback the transaction
$pdo->rollBack();
// show the error message
die($e->getMessage());
}
Linguagem de código: HTML, XML ( xml )
Resumo
- Use o
PDO::beginTransaction()
método para iniciar uma nova transação. - Use o
PDO::commit()
método para confirmar uma transação ePDO::rollback()
reverter uma transação.