Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema ao cadastrar dados usando transação


Rafael Laurindo

Pergunta

2 respostass a esta questão

Posts Recomendados

  • 0

Olhem o código. No final de tudo depois de demorar alguns segundos, ele só cadastra os dados na tabela Pessoa e GenPessoa em Login não.

A tela é esta. Está bem simples, só para testes.

<?php

//usar o require_once para chamar este arquivo externamente
$login = $_POST['txtLogin'];

require_once '../lib/sample/Main.php';

$main = new sample_Main();
$_db = $main->get_conn();

$cidades = "
select *
from cidade
";


if ($login)
{
$genPessoa = new sample_GenPessoa();
$genPessoa = $genPessoa->retornaGenPessoa($login);

$nome = $genPessoa['nome'];
$email = $genPessoa['email'];
$sexo = $genPessoa['sexo'];
$naturalidade = $genPessoa['id_cidade'];
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Teste</title>
<script>
function validarLogin(login){
//usar ajax
}
</script>
</head>
<body>
<div align="right"><a href="#" onclick="">Sair</a></div>
<!--<form method="POST" action="../lib/sample/Login.php">-->
<form method="POST" action="../lib/sample/GenPessoa.php">
<fieldset>
<legend>Dados da Pessoa</legend>
Nome: <input type="text" name="txtNome" maxlength="10" value="<?= $nome ?>" />
<br/>
login: <input type="text" name="txtLogin" id="txtLogin" maxlength="45" value="<?= $login ?>"/><!-- onblur="validarLogin(this.id)" -->
<br/>
senha: <input type="password" name="txtSenha" maxlength="45" value="<?= $senha ?>" />
<br/>
Sexo:
<br />
M <input type="radio" name="rbSexo" value="M" <?php if($sexo == 'M') echo "checked=\"checked\"" ?> />
<br/>
F <input type="radio" name="rbSexo" value="F" <?php if($sexo == 'F') echo "checked=\"checked\"" ?> />
<br/><br/>
Naturalidade:
<select name="cbNaturalidade">
<option value="">selecione...</option>
<?php
$stmt = $_db->query($cidades);
while ($cidade = $stmt->fetch())
{
if($naturalidade == $cidade['id'])
echo "<option value=\"$cidade[id]\" selected=\"selected\">$cidade[nome]</option>";
else
echo "<option value=\"$cidade[id]\">$cidade[nome]</option>";
}
?>
</select>
<br /><br />
<input type="submit" id="submit" name="submit" value="Salvar"/>
</fieldset>
</form>
</body>
</html>[/codebox]

Login.php

[code]<?php require_once 'Main.php'; class sample_Login {     public         $login,         $senha;     protected         $_db;     public function __construct()     {         $main = new sample_Main();         $this->_db = $main->get_conn();     }          public function obterLogin()     {         $this->login = $_POST['txtLogin'];         $this->senha = md5($_POST['txtSenha']);     }          public function adicionarLogin($id)     {         $this->obterLogin();         $add = "             insert into login(id_pessoa, login, senha)             values('$id', '$this->login', '$this->senha')         ";         $stmt = $this->_db->prepare($add);         if ($stmt->execute()){             return true;         }         return false;     }          }[/code]
Pessoa.php
[code]<?php abstract class sample_Pessoa {     protected         $_db,         $id=NULL,         $nome,         $id_cidade;              abstract function obterPessoa();          abstract function adicionarPessoa($query_pessoa);      }[/code]

GenPessoa.php

[codebox]<?php

require_once 'Main.php'; //Responsável por fazer a conexão com o banco

class sample_GenPessoa extends sample_Pessoa
{
public
$sexo;

public function __construct()
{
$main = new sample_Main();
$this->_db = $main->get_conn();
if(!empty($_POST['submit']))
$this->adicionarGenPessoa();
}

public function obterPessoa()
{
$this->nome = $_POST['txtNome'];
$this->id_cidade = $_POST['cbNaturalidade'];
}

public function adicionarPessoa(){
$this->obterPessoa();

$add = "
insert into pessoa(id, nome, id_cidade)
values ('$this->id', ?, ?)
";
$stmt = $this->_db->prepare($add);
$stmt->bindParam(1, $this->nome, PDO::PARAM_STR);
$stmt->bindParam(2, $this->id_cidade, PDO::PARAM_INT);

if ($stmt->execute()){
$id = "
select max(id)
from pessoa
";

if ($this->id = $this->_db->query($id)->fetchColumn()){
return true;
}
return false;
}
return false;
}

public function obterGenPessoa(){
$this->sexo = $_POST['rbSexo'];
}

private function adicionarGenPessoa()
{
$this->_db->beginTransaction(); //inicia uma transação. Método da classe PDO (PHP Data Object) do PHP

$this->obterGenPessoa();

$query_pessoa = "
insert into pessoa(id, nome, id_cidade)
values ('$this->id', ?, ?)
";

if(!$this->adicionarPessoa($query_pessoa))
$this->_db->rollback();

$add = "
insert into genPessoa(id_pessoa, sexo)
values ('$this->id', ?)
";
$stmt = $this->_db->prepare($add);
$stmt->bindParam(1, $this->sexo, PDO::PARAM_STR);
if (!$stmt->execute())
$this->_db->rollBack();

$login = new sample_Login();
//aparentemente o script trava aqui. Se eu comentar esse último if funciona normalmente.
if (!$login->adicionarLogin($this->id))
$this->_db->rollBack();
else
echo 'Todos os dados foram cadastrados com sucesso!';

$this->_db->commit(); //encerra a transação
}

}

$genPessoa = new sample_GenPessoa();

Existem outros métodos, mas não vem ao caso, pois somente estes estão envolvidos no problema em questão.

Editado por Rafael Laurindo
Link para o comentário
Compartilhar em outros sites

  • 0

Bom galera, eu mesmo resolvi depois de muito lutar. Quando a classe Login é utilizada ela estava criando uma conexão também, conflitando assim as duas, solução usar o Design Pattern Singleton na classe Connection e na classe Main. Abraços até a próxima.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...