Solucionado (ver solução)
Solucionado
(ver solução)
14
respostas

Por que não se testa o sucesso da deleção?

Alguém sabe por que motivo não testamos se o delete deu certo, da mesma forma que fizemos com a inclusão?

Na inclusão fizemos:

if (insereProduto($conexao, $nome, $preco))

e no delete não.

14 respostas

Acredito que ele não fez o teste pois só é possível apagar produtos que existem! Acredito que o único problema que poderia dar ao apagar um produto é se o ID do produto não existisse, mas como todo produto adicionado ganha automaticamente um ID então este erro não acontecerá.

Não concordo. Você pode abrir o browser 2 vezes. Numa delas vc deleta o registro. Na outra sessão qdo for deletar, já não existe mais e dá erro...

Mas obrigado pela força!!

Realmente Sidnei, não tinha pensado por este lado. Mas acredito que isso possa ser tratado na segunda parte do curso. Pelo que vi vai ter session e usuário.

No meu código eu faço um teste só pra ver se não deu nenhum tipo de erro na execução da query e funcionou perfeitamente.

Elton, entra em duas páginas e escolhe o mesmo produto para deletar ( 1 em cada página).

Quando você deletar o segundo, deverá ocorrer erro.

O seu teste pega este erro?

Deve ser feito algum tipo de controle de concorrência look, ou algo mais simples mas não muito performático verificar se o registro existe antes de remover, mas ideal é ter um tratamento de exceção que capture e exiba uma msg para usuário.

Chubaka, sei que a intenção é ajudar, mas eu queria saber o motivo de não se testar o erro na deleção. E você está falando em como resolver (controle de lock) possíveis erros.

Abraço

solução!

Olá,

você poderia retornar um booleano do método que realiza o delete, e assim desta forma saber se houver erro ou não, mas maioria das vezes basta tratar a exceção.

Caso o delete ocorra com sucesso não haverá exceção, se não vai levantar exceção dai vc vai tratar.

Sidnei, não existe a necessidade de se testar erro em delete pois caso já tenha sido excluído uma vez, na segunda tentativa de exclusão apenas não vai excluir de novo, mas não ocorrerá erro. Caso isso ocorra o máximo que poderá acontecer e no resultado da query voltar falando 0 rows afected....

Por este motivo não tem sentido testar a exclusão, poia a intenção de excluir foi realizada e caso seja dois usuarios simultâneos realizando a mesma ação, ficará transparente para eles pois os dois verão que foi excluído.

A resposta do @Lucas esta correta. O que acontece no delete é que quando voce enviar duas querys para executar com o mesmo comando o que vai acontecer é (por exemplo)

delete from tb_produtos where id_produto = 1

1 row affected

delete from tb_produtos where id_produto = 1

0 row affected

Dessa forma voce nem vai saber se foi realmente deletado na primeira tentativa ou na segunda de acordo com o que voce sugeriu (abrir duas paginas). O que voce teria que validar ai seria o retorno de linhas afetadas, mas isso vai depender do driver e do suporte que o driver tem para pegar essa informação.

Agora começo a concordar com vocês Chubaka, Lucas e Luiz. Mas, eu acho que sim devemos testar, pois pode haver outros tipos de erro em uma deleção.

Aí eu acho que a solução do Chubaka é a mais coerente com o que penso.

Eu sou novo neste mundo PHP, estou fazendo a trilha e não conhecia nada até iniciar a trilha; por isto, Chubaka te peço uma dica: Como são os procedimentos de levantar uma exceção e tratar esta exceção caso seja levantada?

Muito obrigado pelo força que me deram. Ainda não vou encerrar o tópico porque talvez o Chubaka queira falar sobre as exceções :)

Abraços

Olá Sidnei,

Acredito que o primeiro caminho seja aprender a lidar com o comando try e depois avaliar com a árvore de exceção que é fornecida pela API. Poderá ver mais detalhes em: http://php.net/manual/pt_BR/language.exceptions.php

Concordo com o @Éder também, visto que no delete pode ocorrer erros em duas situações principalmente:

  • Conexão invalida.
  • Erro de relacionamento.

Em ambos os casos retornar um boolean com um 'false' não vai dizer muito sobre como resolver o problema. Então é melhor deixar o erro aparecer e saber porque deu errado ao invés de disfarçar com uma mensagem do tipo 'Erro excluindo '

Bom, agora que compreendi, vou encerrar o tópico.

Parece que o caminho é tratar as exceções. Obrigado pelas dicas de todos que me levaram ao conhecimento das exceções - Luiz, Lucas e Chubaka.

E ao Eder que deu o caminho onde procurar!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software