Palavra:   

Revista PHP / PHP

Douglas Lira

Exclusão Segura

Para inaugurar a sessão de artigos, segue ai uma boa dica de banco de dados. Não existe nada pior do que excluir um registro “A” e o registro “B” perder sua referencia. Existem varias formas de evitar esse tipo de erro, nesse artigo irei ensinar uma rotina que é capaz de analisar o registro e verificar se o mesmo está associado a outro evitando perder referencia.

 

1 - Lógica

 

            - Verificar todas as tabela do banco de dados

            - Verificar se existe o campo

- Verificar se o campo contém valor que se deseja excluir

- Se existir conta mais um e retorna false

- Se não, excluir o registro com segurança e retorna true

 

2 – Funções do PHP utilizadas

 

            - Mysql_connect

            - Mysql_select_db

- Mysql_num_fields

            - Mysql_query

            - Mysql_fetch_row

            - Mysql_fetch_assoc

            - Mysql_fetch_field

 

3 – Comentários

 

         Existem outros métodos mais eficazes capaz de fazer isso, e minha opinião a forma mais eficaz é unir REGRA de banco de dados e uma boa rotina de exclusão. Até Breve!!


4 – Função

  1. /***************************************************************
  2. * Descricao:
  3. * Função para verificar registros relacionados, caso exista
  4. * itens relacionados, retorna falso
  5. * Atributos:
  6. * $tabelaCheck = Nome da Tabela Princial [String]
  7. * $campoCheck = Campo que deseja Verificar [String]
  8. * $idCheck = Valor que deseja Verificar [int]
  9. * Observação:
  10. * A tabela que deseja verificar, não a que existe o relaciona-
  11. * mento e sim a tabela onde existe o registro principal
  12. *
  13. * By Douglas Lira – curisco_filezzim@hotmail.com
  14. ****************************************************************/
  15. function checkExclude($tabelaCheck,$campoCheck,$idCheck) {
  16. // Iniciando Classe de Conexão
  17. mysql_connect(“localhost”,”root”,””);
  18. mysql_select_db(“bando_de_dados”);
  19. // Pegando os Dados
  20. $tabela = $tabelaCheck;
  21. $campo = $campoCheck;
  22. $id = $idCheck;
  23. // Contador
  24. $check = 0;
  25. // Criando o SQL
  26. $queryListaTabela = mysql_query(“SHOW TABLES FROM BANDO_DE_DADOS”);
  27. // Listando as Tabelas
  28. while ($row = mysql_fetch_row($queryListaTabela)) {
  29. // Excluido da Pesquisa o tabela referencia
  30. if($row[0] != $tabela) {
  31. // Fazendo a Seleção e Verificando se Existe o campo
  32. $sqlSelect = "SELECT * FROM ".$row[0];
  33. $querySelect = mysql_query($sqlSelect);
  34. // Contador
  35. $i = 0;
  36. // Fazendo a Listagem
  37. while ($i < mysql_fetch_field($querySelect)) {
  38. // Armazenando Buffer
  39. $meta = mysql_fetch_field($querySelect,$i);
  40. // Verificando se Existe esse Campo
  41. if($meta->name == $campo) {
  42. // Verificando se Existe algum item com esse ID
  43. $sqlCheck = "SELECT ".$campo." FROM ".$row[0]." WHERE ".$campo." = '".$id."' ";
  44. $queryCheck = mysql_query($sqlCheck);
  45. // Check
  46. while($rows = mysql_fetch_assoc($queryCheck)) {
  47. $check++;
  48. }
  49. }
  50. //
  51. $i++;
  52. }
  53. }
  54. }
  55. // Verificando
  56. if($check > 0) {
  57. // Enviando o Resultado
  58. return false;
  59. } else {
  60. // Excluindo a Informação
  61. $sqlExclude = "DELETE FROM ".$tabela." WHERE ".$campo." = '".$id."' ";
  62. $queryExclude = mysql_query($sqlExclude);
  63. // Enviando o Resultado
  64. return true;
  65. }
  66. }
  67.  

Opções de Interação

Comentários

Garantir no BD e no Código
Por: Cristian, 22/10/2008   16:43:08
Uso PostgreSQL e como é comum já ele mesmo faz cascade... porem tb uso startTransaction via codigo.. garantindo assim a exclusão...
EXATO!!
Por: Douglas, 28/09/2008   13:27:29
Concordo plenamente GREG!! parabéns pelo comentário é sempre bom programar da melhor forma, de fato criei essa "funcionalidade" para garantir uma exclusão segura mesmo, visto que muitos deixam de fazer relacionamento, detalhes que no final contribui para um bom funcionamento e desempenho de um sistema, valeu!!
Referências
Por: Greg, 28/09/2008   01:28:32
Vale lembrar que a maioria dos bancos já possue capacidade de fazer relacionamentos.
No MySQL, basta utilizar tableas INNODB para ter acesso completo às fucnionalidades de relacionamento.
Embora essa função de fato funcione, nada substitui planejamento e boas práticas de programação.
Programar corretamente é sempre a melhor opção, a segunda sendo utilizar as funções relacionais do banco de dados. Desta forma você evita chamadas desnecessárias ao banco, e reduz a carga no servidor.