Transação PHP DOP

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, authorse book_authors.

Para fazer isso, você precisa:

  • Obtenha o ID do autor se o autor existir; caso contrário, insira o autor na authorstabela.
  • Insira o livro na booksmesa.
  • Insira o link entre livro e autor na book_authorstabela.

Para organizar o código, colocaremos todas as funções no functions.phparquivo 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 authorstabela:

<?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 authorstabela 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 bookstabela:

<?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_authorstabela:

<?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 e PDO::rollback()reverter uma transação.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *