4
respostas

PDO

<?php 
include("conexao.php");
require_once("class/responsavel.class.php");
require_once("class/endereco.class.php");

    $verifica_cpf = $pdo -> prepare ("SELECT (cpf) FROM responsaveis WHERE cpf=:cpf");

            $verifica_cpf -> bindValue(":cpf", $_POST["cpf"]);
            $verifica_cpf -> execute();

    if ($verifica_cpf -> rowCount() == 1){
            echo"Usuário já cadastrado!";
    }
    else{

    try{

        $pdo -> beginTransaction();
        $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $end = new Endereco();

            $end -> setRua($_POST["rua"]);
            $end -> setComplemento($_POST["complemento"]);
            $end -> setBairro($_POST["bairro"]);
            $end -> setCidade($_POST["cidade"]);
            $end -> setEstado($_POST["estado"]);
            $end -> setCep($_POST["cep"]);


        $cadastro_end = $pdo -> prepare ("INSERT INTO enderecos (rua, complemento, bairro, cidade, estado, cep) VALUES (:rua, :complemento, :bairro, :ciddade, :estado, :cep)");

            $cadastro_end -> bindValue(":rua", $end -> getRua());
            $cadastro_end -> bindValue(":complemento", $end -> getComplemento());
            $cadastro_end -> bindValue(":bairro", $end -> getBairro());
            $cadastro_end -> bindValue(":ciddade", $end -> getCidade());
            $cadastro_end -> bindValue(":estado", $end -> getEstado());
            $cadastro_end -> bindValue(":cep", $end -> getCep()); 

            $cadastro_end -> execute();

            //Recupera o ultimo id inserido
            $id_end = $pdo->lastInsertId();


        $resp = new Responsavel();

            $resp -> setNome($_POST["nome"]);
            $resp -> setEmail($_POST["email"]);
            $resp -> setDtNascimento($_POST["dt_nascimento"]);
            $resp -> setCpf($_POST["cpf"]);
            $resp -> setRg($_POST["rg"]);
            $resp -> setTelefonePrincipal($_POST["tel_1"]);
            $resp -> setTelefoneSecundario($_POST["tel_2"]);
            $resp -> setEndereco($id_end);

        $cadastro_resp = $pdo -> prepare ("INSER INTO responsaveis (cpf, dt_nascimento_resp, nome_resp, email_resp, tel_principal, tel_secundario, rg_resp, cod_endereco) VALUES (:cpf, :dtnascimento, :nome, :email, :telpri, :telsec, :rg, :endereco)");

            $cadastro_resp -> bindValue(":cpf", $resp -> getCpf());
            $cadastro_resp -> bindValue(":dtnascimento", $resp -> getDtNascimento());
            $cadastro_resp -> bindValue(":nome", $resp -> getNome());
            $cadastro_resp -> bindValue(":email", $resp -> getEmail());
            $cadastro_resp -> bindValue(":telpri", $resp -> getTelefonePrincipal());
            $cadastro_resp -> bindValue(":telsec", $resp -> getTelefoneSecundario());
            $cadastro_resp -> bindValue(":rg", $resp -> getRg());
            $cadastro_resp -> bindValue(":endereco", $resp -> getEndereco());

            $cadastro_resp -> execute();

            $pdo -> commit();

            echo"Cadastro efetuado com sucesso!";

    }

    catch(PDOException $e) {
        $pdo->rollBack();

        echo"Erro! Casso persista entre em contato com o administrador.";
    }


    }

?>
4 respostas

Pessoal Estou tentando gravar os objetos responsavel e endereços.. utilizando o try e cath.. esta gravando certinho.. so que quando simulo um erro em uma das consultas... a excessão nao esta funcionando.. o rollBack.. ele grava em uma tabela.. só.. Alguem pode me ajudar?

Oi Janai, tudo bem? Bom, seu problema pode não estar no seu código. Alguns bancos usam uma estrategia de autocommit implicito. Ou seja, ao fazer um execute da sua queria, ele pode estar realmente salvando. Como são duas queries, talvez o pdo esteja conseguindo dar rollback apenas no último.

A documentação fala dessa questão de autocommit. Verifique as configurações de seu banco de dados.

Link da documentação: http://php.net/manual/en/pdo.rollback.php

Espero ter ajudado.

Como eu resolvo isso? tenho q desabilitar algo? minha versão do PHP é o 7 e o MySQL 5.7

Comecei tem pouco tempo com a orientação a objetos.. e estou travado nessa questão de gravar no banco de dados..

Precisava dar uma solução.. pra isso mesmo que fosse voltar pra programar estrutural.

Acho que o conteudo das aulas em si do alura não tem didatica de forma que pessoas como eu que estao começando a programar aprendam..

Antes de iniciar sua transação, execute o seguinte SQL: SET autocommit = 0;. Isso vai desabilitar o commit automático de cada instrução. Lembre-se de reativar com SET autocommit = 1; após commitar sua transação.

Espero ter ajudado.