Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá galera, estou iniciando com PDO, e estou tendo problemas no meu codigo de testes.
<?php
include_once('conexao.php');
$sql='INSERT INTO teste(nome) VALUES (:nome)';
try {
$bd->beginTransaction();
$query = $bd->prepare($sql);
$query->bindValue(':nome','Flavio',PDO::PARAM_STR);
$query->execute();
$query2 = $bd->prepare("UPDATE teste SET nome = 'Novo' WHERE id=2");
$query2->execute();
$bd->commit();
echo 'ok rodou';
} catch (PDOException $e) {
$bd->rollback();
echo $e->getMessage();
}
?>
O codigo acima deveria alterar o banco somente se as duas querys estivessem corretas, porém se eu colocar uma query errada, ele executa e grava a q está correta, ou seja ele não faz rollBack como deveria.
se alguem puder me ajudar !
Amigo testei novamente, mas mesmo usando somente o exec ou query não deu certo.
Veja o exemplo do codigo que modifiquei abaixo para fazer os testes.
Existe uma linha com erro e mesmo assim o rollBack nao acontece.
O banco que estou utilizando para os testes é o mysql.
<?php
include_once('conexao.php');
try {
$bd->beginTransaction();
$bd->exec("INSERT INTO teste(nome) VALUES ('Flavio')");
$bd->exec("INSERT INTO test(nome) VALUES ('Douglas')"); //Linha incorreta pois a tabela test não existe no banco
$bd->commit();
echo 'ok rodou';
} catch (PDOException $e) {
$bd->rollBack();
echo $e->getMessage();
}
?>
Descobri o problema, eu estou utilizado uma tabela mysql do tipo MyISAM (as quais não possuem suporte a transactions), por isso o rollBack não estava funcionando !
Alterei a de testes para InnoDB e funcionou na hora. Portanto o exemplo de codigo do topico acima está correto, fiquem a vontade para utilizar.
Obrigado a todos pela ajuda vlw !
Amigo eu vou tentar.
Andei pesquisando exemplos de beginTransaction e prepare
e observei que em nenhum exemplo aparece o Statment prepare e execute
juntamente com beginTransaction e commit
cheguei a ler este trecho no php.net
>
From Oracle example:
<?
PDOStatement has no beginTransaction(), nor commit(). Please fix documentation.
Sendo assim eu acredito que se você retirar o prepare e o execute e utilizar somente o exec("sua query")ou se desejar que ele retorne um Statement usar o query("sua query") você obterá o resultado desejado.
Faça alguns testes.
Abraços.