Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Periscuelo

Cascata de Dados no PHP

Recommended Posts

Ola galera do fórum imasters, tive um problema com relação a cadastro multiplo em banco de dados no PHP e depois de muito pesquisar com a ajuda do amigo xxmatagbxx e do meu amigo Pedro Augusto que é programador também nesta área cheguei a uma solução na qual quero compartilhar com todos caso necessitem.

 

OBS: Neste tutorial eu presuponho que vocês já entendam sobre programação PHP, MySQL e configuração de Servidores Apache para as duas linguagens, por tanto não entrarei em detalhes quanto a códigos de conexões com banco de dados e etc. Também presuponho que você saiba que deve averiguar configurações de routers e firewalls para que não tenhamos problemas com portas e tudo de certo, e é claro que você saiba faze-lo.Agradeço a compreensão de todos.

 

Meu problema era o seguinte: Meu cliente possui um sistema com banco de dados em MySQL no qual ele me pede sempre que efetue alguns cadastros novos. Até ai seria facil, bastaria abrirmos o phpmyadmim e castrar o dado desejado na tabela deseja. Porém além do banco de dados do sistema interno, meu cliente possui 5 Sites na internet cada com Hospedagem de Banco de Dados MySQL e todos os bancos tem estruturas iguais, ou seja, O Banco de dados da Rede Interna e o Banco de dados de cada site possuem as mesmas tabelas com os mesmos campos. Sendo assim eu tinha que entrar no phpmyadmim do meu banco de dados da Rede Interna e Cadastrar um novo setor cujo a tabela se chama ev_nome_setor, possui 2 campos e a chave primária é o Campo = id Tipo= INT(20) Opção Nulo=Não e com a propriedade Extra = auto_increment . O Outro Campo = nome Tipo= varchar(40) Opção Nulo=Não.

Ai que vinha o problema, pois sendo o mensionado acima, eu tinha que cadastrar um Setor no campo nome, usar um select no mesmo para achar o registro que havia acabado de inserir, e exportar o arquivo sql, para assim, acessar todos os bancos dos 5 sites digitar login e senha de cada um e importar o arquivo sql que havia exportado anteriormente. Com este trabalho eu fazia com que o Mesmo setor fosse cadastrado no sistema da rede interna e no Banco de dados de cada site para que cada administrador de cada site conseguisse usar o registro como bem entendesse.

 

Resumindo, eu tinha que cadastrar a mesma coisa em 6 Bancos de Dados diferentes. Isto significava para mim entrar no phpmyadmin de cada um(sendo cada banco de dados num domínio diferente) e digitar o usuário e senha de cada um(que são todos diferentes) para conseguir efetuar o cadastro que meu cliente solicitou. Imagine você abrir 6 sites digitar 6 usuários 6 senhas e efetuar 6 cadastros, por mais que seja pequeno o cadastro te toma tempo e paciência.

 

Pensei então em fazer um programa que cadastrasse automaticamente por meio de um formulário o Setor desejado nos 6 Bancos de Dados ao mesmo tempo. Para isso fiz um tópico no fórum no qual alguns amigos me ajudaram como mensionado no começo deste tutorial e vou agora disponibilizar para vocês como fazer para efetuar um Cadastro de Dados em Cascata, lembrando que os Servidores Web Hospedeiros de Banco de Dados em MySQL bloqueiam as opções de conexões simultâneas (no caso se ter uma pagina que faça conexão com banco de dados em um ftp e tentar desta mesma pagina se conectar a outro banco de dados em outro ftp) e também a opção allow_url_fopen vem setada como Off. Mas para implementar nosso programa demos uma sacaneada no Servidor do terra apartir do código que vocês poderão ler abaixo.

 

Bom chega de encher linguiça e vamos aos códigos. Primeiro faremos o formulário como abaixo e salvaremos o mesmo com o nome de cadastrosetor.php.

 

<? include("cadsetor.php"); ?><html><head><title>Cadastro de Setores no Sistema Interno e nos Sites da Empresa</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"></head><body> <form action="cadsetor.php" method="post" name="cadsetor"> <table border=0 bordercolor=black cellpadding=1 cellspacing=1 id="home" align="center"> <tr><td id="home" colspan=2></td></tr> <tr> <td id="home" width=581><div align="center">Coloque abaixo o Setor que deseja incluir na Base de Dados do Sistema Interno e Sites da Empresa. </div></td> </tr> <tr></tr> <tr><td><p></p></td></tr> <tr> <td id="home"><div align="center">   <input type="text"  name="incsetor" size="50" maxlength="49" border="1">    <font color=Black size=1></font></div> </td> </tr> <tr><td><p></p></td></tr> <tr> <td id="home"><div align="center">    <input type="submit" name="incluir" value="Incluir Setor">   </div> </td>  </tr> </table></form></body></html>
Está pagina tem de ficar no Servidor da Rede Interna que é aonde fica o sistema interno da empresa pois é la que será cadastrado o primeiro registro.

 

Agora iremos fazer o código que irá fazer o serviço junto ao formulário e salvar o mesmo como cadsetor.php e colocar está página junto aonde você deixou a pagina cadastrosetor.php, pois os 2 se complementam.

 

<?// Reportar todos os erros exceto E_NOTICE// Este é o valor padrão no php.inierror_reporting(E_ALL ^ E_NOTICE);?><? //Função de cascata de dados.if ($contador==1) header("Location: http://www.dominio2.com.br/setorload2.php?exportid=$exportid&exportnome=$exportnome");if ($contador==2) header("Location: http://www.dominio3.com.br/setorload3.php?exportid=$exportid&exportnome=$exportnome");if ($contador==3) header("Location: http://www.dominio4.com.br/setorload4.php?exportid=$exportid&exportnome=$exportnome");if ($contador==4) header("Location: http://www.dominio5.com.br/setorload5.php?exportid=$exportid&exportnome=$exportnome");if ($contador >4) echo "Setores Cadastrados com sucesso em todos os sites, Clique<a href='http://ipdoservidordaredeinterna/cadastrosetor.php'> Aqui </a> para Continuar Cadastrando!"; // Continuação da  da Função de cascata de dados mais abaixo.// Conexão com o banco de dados do Sistema Interno$conexbdsis = mysql_connect("localhost", "usuário", "senha");if (!$conexbdsis) {   die('Não pude conectar: ' . mysql_error());}mysql_select_db("nomedobancodedados");?><? if ($incluir=="Incluir Setor") {$oldsetor = mysql_query("SELECT nome FROM ev_nome_setor WHERE nome = '$incsetor'");$res = mysql_fetch_array($oldsetor);if ($res==0) {$includesetor = mysql_query("INSERT INTO ev_nome_setor (nome) VALUES ('$incsetor')");$newsetor= mysql_query("SELECT * FROM ev_nome_setor WHERE nome = '$incsetor'");$export=mysql_fetch_array($newsetor);$fechaconex = mysql_close($conexbdsis) or die ('Não foi possivel fechar a conexão com o MySQL do Sistema Interno' . mysql_error());// Continuação da  da Função de cascata de dados.// Código que burla o bloqueio da função fopen() no servidor terraini_set("allow_url_fopen",1);// Fim do código que burla o bloqueio da função fopen() no servidor terraif (!isset($contador)) header("Location: http://www.dominio1.com.br/setorload1.php?exportid=$export[id]&exportnome=$export[nome]");// Fim da Função de cascata de dados no começo do código.}else{  die('Este Setor já existe no Banco de Dados ' . mysql_error());}}?>
No código acima podemos observar o código que burla o servidor do terra para podermos cascatear os dados. Aonde está escrito dominio1, dominio2, dominio3, dominio4 e dominio5 vocês devem trocar pelo endereço do website de vocês aonde o banco de dados se encontra hospedado. Aonde está escrito setorload1.php, setorload2.php, setorload3.php, setorload4.php e setorload5.php serão as páginas nas quais nós faremos o código abaixo para que o cadastro em cascata funcione nos outros sites. ex: no ftp do dominio1 (ftp.dominio1.com.br) você fará o upload do arquivo setorload1.php, no ftp do dominio2 (ftp.dominio2.com.br) você fará o upload do arquivo setorload2.php e assim por diante.

O Código acima faz iniciar um contador que manda o conteudo da variavel $export para a próxima pagina, separando por campos para que possamos fazer abaixo a inclusão dos dados identicos ao cadastro do banco de dados da rede interna.

 

OBS: Lógicamente onde está escrito 'nomedobancodedados' você irá colocar o nome do seu banco de dados, aonde está escrito 'usuário' você irá colocar o usuário utilizado para fazer login no banco de dados, aonde está escrito 'senha' você irá colocar a senha utilizada para fazer login no banco de dados. Se por um acaso seu banco de dados não possui senha deixe a parte da senha assim "" (com 2 aspas) pois assim vocês estará indicando que não possui senha no seu banco de dados e onde está escrito o nome da tabela (ev_nome_setor) você irá colocar o nome da sua tabela. Neste caso eu estou usando ev_nome_setor como um exemplo, que alias foi citado acima como possuidor de 2 campos, 1 é o 'id' e o outro é o 'nome'.

 

Está pagina que faremos agora será salva como setorload1.php e terá de ficar no ftp do dominio1 (ftp.dominio1.com.br) como citado acima e as demais serão salvas respectivamente como também já foi citado. A mesma vai efetuar o cadastro identico que foi feito no banco de dados da rede interna no banco de dados do dominio1.

 

<? // Conexão com o banco de dados do Dominio1$conexbddominio1 = mysql_connect("localhost", "usuário", "senha");if (!$conexbddominio1) {   die('Não pude conectar: ' . mysql_error());}mysql_select_db("nomedobancodedados");?><? if ($conexbddominio1) {if ($exportnome=="") {die('Não é possivel incluir um setor em branco no Banco de Dados ' . mysql_error());}else{$includesetor = mysql_query("INSERT INTO ev_nome_setor (id , nome) VALUES ('$exportid' , '$exportnome')");mysql_close($conexdominio1) or die ('Não foi possivel fechar a conexão com o MySQL do Dominio1' . mysql_error());ini_set("allow_url_fopen",1);header("Location: http://ipdeinternetdoservidordaredeinterna/cadsetor.php?contador=1&exportid=$exportid&exportnome=$exportnome");}}?>
No código acima podemos observar que nós pegamos $exportid e $exportnome que foi enviada pela pagina cadsetor.php e inserimos no banco de dados do dominio1, porém existe no código header desta página nós fizemos com que ele voltasse a mesma váriável para a página cadsetor.php novamente, só que desta vez dissemos que a váriavel $contador=1. Isso implicará nos if's contidos no começo da página cadsetor.php que fára assim a cascata de dados, abrindo a página do dominio2 que ficará como no código abaixo.

 

OBS: Onde está escrito 'ipdeinternetdoservidordaredeinterna' você irá colocar assim ex: 200.123.145.52, lembrando que este ip é um exemplo. Você deverá colocar o ip da sua internet no lugar do citado.

 

Está pagina que faremos agora será salva como setorload2.php e terá de ficar no ftp do dominio2 (ftp.dominio2.com.br) como citado acima e as demais serão salvas respectivamente como também já foi citado. A mesma vai efetuar o cadastro identico que foi feito no banco de dados da rede interna e dominio1 no banco de dados do dominio2.

 

<? // Conexão com o banco de dados do Dominio2$conexbddominio2 = mysql_connect("localhost", "usuário", "senha");if (!$conexbddominio2) {   die('Não pude conectar: ' . mysql_error());}mysql_select_db("nomedobancodedados");?><? if ($conexbddominio2) {if ($exportnome=="") {die('Não é possivel incluir um setor em branco no Banco de Dados ' . mysql_error());}else{$includesetor = mysql_query("INSERT INTO ev_nome_setor (id , nome) VALUES ('$exportid' , '$exportnome')");$fechaconex = mysql_close($conexbddominio2) or die ('Não foi possivel fechar a conexão com o MySQL do Dominio2' . mysql_error());ini_set("allow_url_fopen",1);header("Location: Location: http://ipdeinternetdoservidordaredeinterna/cadsetor.php?contador=2&exportid=$exportid&exportnome=$exportnome");}}?>
Novamente no código acima vemos que o cadastro foi efetuado identico ao dos bancos de dados anteriores e novamente nós jogamos as váriaveis $exportid e $exportnome e jogamos para a página cadsetor.php mas desta vez a váriavel $contador=2.

 

OBS: Os códigos a seguir são basicamente os mesmos alterando apenas o banco de dados e o valor da variável $contador. Sendo assim fica aqui firmado MAIS UMA VEZ que cáda página tem de ser salva em seu respectivo ftp, setorload3.php no ftp do dominio3 (ftp.dominio3.com.br) setorload4.php no ftp do dominio4 (ftp.dominio4.com.br) e assim por diante.

 

setorload3.php

 

<? // Conexão com o banco de dados do Dominio3$conexbddominio3 = mysql_connect("localhost", "usuário", "senha");if (!$conexbddominio3) {   die('Não pude conectar: ' . mysql_error());}mysql_select_db("nomedobancodedados");?><? if ($conexbddominio3) {if ($exportnome=="") {die('Não é possivel incluir um setor em branco no Banco de Dados ' . mysql_error());}else{$includesetor = mysql_query("INSERT INTO ev_nome_setor (id , nome) VALUES ('$exportid' , '$exportnome')");$fechaconex = mysql_close($conexbddominio3) or die ('Não foi possivel fechar a conexão com o MySQL do Dominio3' . mysql_error());ini_set("allow_url_fopen",1);header("Location: Location: http://ipdeinternetdoservidordaredeinterna/cadsetor.php?contador=3&exportid=$exportid&exportnome=$exportnome");}}?>
setorload4.php

 

<? // Conexão com o banco de dados do Dominio4$conexbddominio4 = mysql_connect("localhost", "usuário", "senha");if (!$conexbddominio4) {   die('Não pude conectar: ' . mysql_error());}mysql_select_db("nomedobancodedados");?><? if ($conexbddominio4) {if ($exportnome=="") {die('Não é possivel incluir um setor em branco no Banco de Dados ' . mysql_error());}else{$includesetor = mysql_query("INSERT INTO ev_nome_setor (id , nome) VALUES ('$exportid' , '$exportnome')");$fechaconex = mysql_close($conexbddominio4) or die ('Não foi possivel fechar a conexão com o MySQL do Dominio4' . mysql_error());ini_set("allow_url_fopen",1);header("Location: Location: http://ipdeinternetdoservidordaredeinterna/cadsetor.php?contador=4&exportid=$exportid&exportnome=$exportnome");}}?>
setorload5.php

 

<? // Conexão com o banco de dados do Dominio5$conexbddominio5 = mysql_connect("localhost", "usuário", "senha");if (!$conexbddominio5) {   die('Não pude conectar: ' . mysql_error());}mysql_select_db("nomedobancodedados");?><? if ($conexbddominio5) {if ($exportnome=="") {die('Não é possivel incluir um setor em branco no Banco de Dados ' . mysql_error());}else{$includesetor = mysql_query("INSERT INTO ev_nome_setor (id , nome) VALUES ('$exportid' , '$exportnome')");$fechaconex = mysql_close($conexbddominio5) or die ('Não foi possivel fechar a conexão com o MySQL do Dominio3' . mysql_error());ini_set("allow_url_fopen",1);header("Location: Location: http://ipdeinternetdoservidordaredeinterna/cadsetor.php?contador=5");}}?>
Notemos que no setorload5.php só enviamos a váriavel $contador no valor = 5 pois sendo ele o último banco de dados a ser cadastrado, não necessitamos mais da cascata.

 

OBS:Não pode haver espaços em branco no código, se não poderá ocasionar um erro no header e sua cascata não funcionará. Faça o código de cada página junto como postado acima

 

Feito os códigos como explicado acima e hospedado cada um em seu devido lugar, com certeza irá funcionar.

 

Caso tenho mais sites e mais bancos, simplesmente adicionem mais if's no cadsetor.php e se atentem ao valor que cada setorload.php vai passar na váriavel $contador.

 

Espero ter contribuido em algo com este tutorial. Qualquer duvida postem ae.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Periscuelo, bom li seu artigo e tenho algo a te perguntar.Percebi o refresh na página, incrementando o contador em 1, bom se você tem 6 banco de dados e na atualização da 5 da problema, quando essa correção vai ser feita, e quando a 6 vai ser modificada?.Ao meu ver tem que existir uma tabela onde você registra todos os eventos cadastrados, então pode-se controlar se foi modificada determinada database remota.To aberto a esclarecimentos.Flw grande abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Periscuelo, bom li seu artigo e tenho algo a te perguntar.Percebi o refresh na página, incrementando o contador em 1, bom se você tem 6 banco de dados e na atualização da 5 da problema, quando essa correção vai ser feita, e quando a 6 vai ser modificada?.Ao meu ver tem que existir uma tabela onde você registra todos os eventos cadastrados, então pode-se controlar se foi modificada determinada database remota.To aberto a esclarecimentos.Flw grande abraço.

Amigo Sublyer eu agora é que não entendi sua duvida, da forma em que postei o tutorial, não existe problema em nenhuma das conexões com o banco de dados e se houver algum ele vai parar o cadastro na respectiva página EX: Se deu problema no 4 cadastro ele vai retornar a seguinte url: "http://ipdeinternetdoservidordaredeinterna/cadsetor.php?contador=4". Sinalizando assim que ao chegar no 4 cadastro houve um erro. Existem algumas ferramentas de erro já implementadas no código como você mesmo pode ver com relação a conexão do banco de dados, que será exibido na tela e assim o refresh para. Não existe a possibilidade de pular um cadastro que tenha dado erro e você não saber que isto aconteceu. São 6 bancos de dados sim 1 do sistema e os outros 5 são os dominios externos na qual eu também realizei o mesmo cadastro. O código da forma que está não permite nenhum echo portanto não posso dar um printf no que está sendo feito. Mas garanto que erros no meio do código são detectados facilmente. Qualquer duvida tamos ae.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom se quando ocorre a 4 inclusão der erro, e o problema não for da programação em si, mas sim por exemplo do link de internet ficar fora do ar em 3 dias. como será incluso esse SQL no 4° banco de dados?você terá que reiniciar o script depois de 3 dias correto, e como o script sabe que a atualização dessa SQL parou no 4° banco de dados?flw grande abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom se quando ocorre a 4 inclusão der erro, e o problema não for da programação em si, mas sim por exemplo do link de internet ficar fora do ar em 3 dias. como será incluso esse SQL no 4° banco de dados?você terá que reiniciar o script depois de 3 dias correto, e como o script sabe que a atualização dessa SQL parou no 4° banco de dados?flw grande abraço.

Agora sim eu entendi amigo Sublyer. Se isto acontecer lógicamente irá dar o erro de pagina não encontrada novamente exibindo a url "http://www.domino4.com.br/setorload4.php". Sendo assim você saberá que não foi cadastrado no 4 nem nos próximos bancos de dados pois o refresh parou. Lógicamente neste caso fariamos então o cadastro pelo phpmyadmin manualmente ou se deu erro logo no começo por exemplo no cadastro numero 2, excluiriamos os cadastros anteriores que foram concluidos com sucesso para que quando o site fora do ar retornar ao normal possamos incluir os cadastros corretamente em cada banco de dados. Ai ficaria a critério de cada um achar o melhor a se fazer. Achei interessante sua observação mas a implementação de um código que verificasse se existe já o dado cadastrado e quantos foram cadastrados em cada banco de dados seria um tanto quanto complicada. Mas se eu descobrir algo que resolva esta questão estarei implementando neste turorial. Valew a sugestão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é mais ou menos isso.. não terminei.. tenho que trabalhar :-)..da um toque no meu e-mail ae depois que a gente troca idéiaBom me desculpe mas ainda tenho uma implementação ao script, vamos supor que os banco de dados são meus e eu não quero fazer nenhuma inclusão sozinho, não quero ter que ficar enviando toda vez se der erro, quero que o proprio script faça a inclusão e correção se houver erro, quero observar a seguinte solução.Criação de 3 tabelas de controle de inclusão e correção dos SQL enviados1° - tabela registro_query (contem as sqls) que_id // identificador que_comando // comando sql a ser executado que_status // status do sql ( 1= nao enviado,2= enviado) que_data // data da inclusão do registro2° - tabela registro_sql_inclusas ( contem as sqls inclusas relacionadas com o servidor a que foram inclusas) sql_inc_id // identificador que_id // relacionamento com a query. sql_inc_servidor // identificador do servidor (servidor 1 = 1, servidor 2 =2 e etc) sql_status // status do inclusão ( 1= nao enviado,2= enviado) sql_data // data da inclusão do registro3° - tabela registro_sql_erros (contem as sqls) err_id // identificador err_servidor // servidor que deu erro err_data // data do erro err_status // status do erro (1= nao corrigido,2= corrigido)///////////////////////////////////////////////////////////////////////////////////////////////// Lógica do sistema // declaracao de variaveis globais int $i = 0, $servidores = 6,$varSaida = 1; // definindo conexao local $conexao_local=mysql_connect("localhost","teste","teste") or die($varSaida=1); // seleciona database local $database_local = mysql_select_db("teste",$conexao_local); // grava registro na tabela "registro_query" $inserir=mysql_query("insert into registro_query(que_comando,que_status,que_data) values("'select * from teste',1,'2006-10-02'")",$conexao_local); for($i=0;$i<= $servidores; $i++){ // seleciona configuracoes switch ($i){ case 0: $host='123'; $user='123'; $senha='123'; $database ='123'; break; case 1: $host='123'; $user='123'; $senha='123'; $database ='123'; break; case 2: $host='123'; $user='123'; $senha='123'; $database ='123'; break; case 3: $host='123'; $user='123'; $senha='123'; $database ='123'; break; case 4: $host='123'; $user='123'; $senha='123'; $database ='123'; break; case 5: $host='123'; $user='123'; $senha='123'; $database ='123'; break; } // iniciando a conexao com o host $conexao_sql=mysql_connect($host,$user,$senha) or die($varSaida=1); // seleciona a base de dados $database_sql=mysql_select_db =($database,$conexao_sql) or die($varSaida=1); // executando a query if($varSaida == 1){ // grava erro na tabela "registro_sql_erro" com status = 1 // informa erro ao responsavel pela execução do script } else{ // grava sql na tabela que se necessita // informa sucesso no servidor i, ao responsavel pela execução do script }; }

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.