Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rpmarques

BeginTransaction commit e rollBack com PDO

Recommended Posts

Buenas, estou migrando os meu "pojetos" de mysql_* para PDO, e me deparei com os begins e commits, minha dúvida é a seguinte, deste modo ele vai fazer o commit "bunitasso"??

Código da Classe:

<?php

class Bairro {

   // Atributo para conexão com o banco de dados   
   private $pdo = null;
   // Atributo estático para instância da própria classe    
   private static $bairros = null;

   private function __construct($conexao) {
      $this->pdo = $conexao;
   }
   
   public static function getInstance($conexao) {
      if (!isset(self::$bairros)):
         self::$bairros = new Bairro($conexao);
      endif;
      return self::$bairros;
   }

   public function insert($rNome) {
      try {
         $this->pdo->beginTransaction();
         $rSql = "INSERT INTO bairros (nome,data_cad) VALUES (:nome,:data_cad)";
         $stm = $this->pdo->prepare($rSql);
         $stm->bindValue(':nome', $rNome);
         $stm->bindValue(':data_cad', date('Y-m-d'));
         $stm->execute();
         if ($stm) {
            $this->pdo->commit();
            Logger('Usuario:[' . LOGIN . '] - Inseriu bairro');
         }
         return $stm;
      } catch (PDOException $erro) {
         $this->pdo->rollBack();
         Logger('Usuario:[' . LOGIN . '] - Erro na linha:' . $erro->getLine() . ' - Mensagem:' . $erro->getMessage());
      }
   }

Código da Classe Conexão:

<?php

DEFINE('USER', 'root');
DEFINE('PASSWORD', 'root');
DEFINE('HOST', 'localhost');
DEFINE('DBNAME', 'imo');
DEFINE('CHARSET', 'utf8');

class Conexao {

   //Atributo estático para instância do PDO   
   private static $pdo;
   // Escondendo o construtor da classe      
   private function __construct() {
      //   
   }

   public static function getInstance() {
      if (!isset(self::$pdo)) {
         try {
            $opcoes = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', PDO::ATTR_PERSISTENT => TRUE);
            self::$pdo = new PDO("mysql:host=" . HOST . "; dbname=" . DBNAME . "; charset=" . CHARSET . ";", USER, PASSWORD, $opcoes);
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         } catch (PDOException $e) {
            print "Erro: " . $e->getMessage();
         }
      }
      return self::$pdo;
   }

}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código é funcional, eu apenas trataria três situações.

1 - Com controle de exceções, não é necessário validar a execução, logo o if abaixo é desnecessário:

if ($stm) {

2 - Em teoria, insert não deve retornar nada. Somente inserir ou, em caso de erro, lançar uma exceção. Logo, acho o return $stmt desnecessário;

3 - Utilize registre ao invés de singleton.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, eu preciso deste if pois dependendo do retorno eu digo pro usuário se deu certo ou não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consigo encontrar fundamentos para isso. Dessa forma, mantenho a minha indagação.

Se falhar, não vai nem chegar ao if, gerará uma exception. O if apenas valida a variável (se não é null) e não a sua execução.

Já o retorno, bem, depende. Por questão de coesão, um insert apenas deve inserir e não retornar.

No link abaixo, você pode ver exemplos/explicação sobre o caso.

http://forum.imasters.com.br/topic/551113-duvida-em-quando-usar-throw-ou-retornar-false/

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.