Icepick.pt Posted February 17, 2013 at 11:43 AM Report #495779 Posted February 17, 2013 at 11:43 AM (edited) Olá pessoal Tenho estado a utilizar o PDO para interagir com a base de dados, e ultimamente tenho começado a utilizar tramsações para impor a execução de várias operações de uma vez só. No script em anexo estou a ter uma dificuldade: - as queries de SQL estão correctas, se eu não as espatifar tudo corre bem e ambas as operações são escritas na base de dados- - se eu espatifar uma das queries, era de esperar que a outra querie não fosse executada, uma vez que estamos dentro de uma transação. Contudo, o facto é que a exceção é identificada, o erro é reportado no echo final, mas a querie correcta acaba por ser escrita na mesma, em lugar de ser feito o rollback. Alguem me explica porquê? try { // habilita as excepções $dbwrite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // inicia a transacção $dbwrite->beginTransaction(); // realiza a primeira operação de escrita $stringUpdate=" update tabela1 set campo1= :conteudo1_, campo2= :conteudo2_, campo3= :conteudo3_ where umaCondicaoQualquer "; $pedido=NULL; $pedido=$dbwrite->prepare($stringUpdate); // limpa as variáveis que vai escrever na bd $pedido->bindParam(':conteudo1_', $_POST['post1'], PDO::PARAM_INT); $pedido->bindParam(':conteudo2_', $_POST['post2'], PDO::PARAM_INT); $pedido->bindParam(':conteudo3_', $_POST['post3'], PDO::PARAM_STR); $pedido->execute(); // realiza a segunda operação de escrita $stringUpdate=" update tabela2 set campoA= :conteudoA_, campoB= :conteudoB_, campoC= :conteudoC_ where outraCondicaoQualquer"; $pedido=NULL; $pedido=$dbwrite->prepare($stringUpdate); // limpa as variáveis que vai escrever na bd $pedido->bindParam(':conteudoA_', $_POST['postA'], PDO::PARAM_INT); $pedido->bindParam(':conteudoB_', $_POST['postB'], PDO::PARAM_INT); $pedido->bindParam(':conteudoC_', $_POST['postC'], PDO::PARAM_STR); $pedido->execute(); // finaliza a escrita das duas operações $dbwrite->commit(); } // se ocorreu uma excepção catch (Exception $e) { // desfaz toda a operação $dbwrite->rollBack(); echo $e; } Edited February 17, 2013 at 07:44 PM by Icepick.pt
pmg Posted February 17, 2013 at 11:52 AM Report #495784 Posted February 17, 2013 at 11:52 AM Alguem me explica porquê? Sem indentacao é dificil perceber o codigo 😞 What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
mjamado Posted February 17, 2013 at 01:22 PM Report #495806 Posted February 17, 2013 at 01:22 PM Qual é o motor usado nas tabelas? "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
Icepick.pt Posted February 17, 2013 at 07:46 PM Author Report #495880 Posted February 17, 2013 at 07:46 PM Não sei porquê, não consigo transpor as tabulações do notepad++ para aqui. Já coloquei espaços, mas não está muito melhor. O motor é MySQL.
HappyHippyHippo Posted February 17, 2013 at 07:54 PM Report #495885 Posted February 17, 2013 at 07:54 PM Não sei porquê, não consigo transpor as tabulações do notepad++ para aqui. alterna o modo de edição do post, no primeiro botão do editor da resposta, para poderes colocar código sem perda de indentação IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Icepick.pt Posted February 17, 2013 at 08:25 PM Author Report #495887 Posted February 17, 2013 at 08:25 PM (edited) Aí vai i código agora, correctamente indentado ( digo eu...) Obrigado, yoda. try { // habilita as excepções $dbwrite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // inicia a transacção $dbwrite->beginTransaction(); // realiza a primeira operação de escrita $stringUpdate=" update tabela1 set campo1= :conteudo1_, campo2= :conteudo2_, campo3= :conteudo3_ where umaCondicaoQualquer "; $pedido=NULL; $pedido=$dbwrite->prepare($stringUpdate); // limpa as variáveis que vai escrever na bd $pedido->bindParam(':conteudo1_', $_POST['post1'], PDO::PARAM_INT); $pedido->bindParam(':conteudo2_', $_POST['post2'], PDO::PARAM_INT); $pedido->bindParam(':conteudo3_', $_POST['post3'], PDO::PARAM_STR); $pedido->execute(); // realiza a segunda operação de escrita $stringUpdate=" update tabela2 set campoA= :conteudoA_, campoB= :conteudoB_, campoC= :conteudoC_ where outraCondicaoQualquer"; $pedido=NULL; $pedido=$dbwrite->prepare($stringUpdate); // limpa as variáveis que vai escrever na bd $pedido->bindParam(':conteudoA_', $_POST['postA'], PDO::PARAM_INT); $pedido->bindParam(':conteudoB_', $_POST['postB'], PDO::PARAM_INT); $pedido->bindParam(':conteudoC_', $_POST['postC'], PDO::PARAM_STR); $pedido->execute(); // finaliza a escrita das duas operações $dbwrite->commit(); } // se ocorreu uma excepção catch (Exception $e) { // desfaz toda a operação $dbwrite->rollBack(); // apresenta a excepção echo $e; } Edited February 17, 2013 at 09:38 PM by yoda
yoda Posted February 17, 2013 at 09:38 PM Report #495889 Posted February 17, 2013 at 09:38 PM (edited) Obrigado? Não disse nada 😄 edit : quando quiseres colocar código, dentro da tag code mete algo que identifique a linguagem, ex : code=php Edited February 17, 2013 at 09:39 PM by yoda before you post, what have you tried? - http://filipematias.info sense, purpose, direction
mjamado Posted February 18, 2013 at 12:47 AM Report #495901 Posted February 18, 2013 at 12:47 AM O motor é MySQL. O MySQL não é um motor, é o DBMS. O motor há-de ser MyISAM, InnoDB, Memory... Qual é? "Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.
Icepick.pt Posted February 18, 2013 at 09:12 AM Author Report #495906 Posted February 18, 2013 at 09:12 AM (edited) Boa, mjamado! Uma das tabelas era MyISAM e a outra era InnoDB. Mudei a que era MyISAM para InnoDB et voilá, a transação já funciona. Claro que depois fui pesquisar a net nesta perspectiva e encontrei a resposta: O motor MyISAM não suporta transações. http://en.wikipedia.org/wiki/MyISAM Obrigado. Edited February 18, 2013 at 09:14 AM by Icepick.pt
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now