Realizando backup automático do banco em servidor de hospedagem linux com PHP

Publicado em 15/05/2018 | () comentários


Servidores de hospedagem Linux possuem, geralmente, um painel de controle CPANEL para administração da hospedagem. Apesar da rotina de backup automático do servidor, que é executada automaticamente e semanalmente pelo serviço contratado, a mesma não garante a recuperação e segurança dos dados, assim como não garante a restauração caso alguma invasão ou problema tenha ocorrido no servidor.

É muito aconselhado que você realize periodicamente o backup do seu banco de dados e mantenha o seu código fonte seguro com controle de versão. Neste tutorial você aprenderá a garantir a segurança de seu banco de dados MySQL em um servidor Linux utilizando um simples código PHP e uma tarefa CRON.

Código PHP para realizar o backup

O código abaixo realiza uma cópia completa de seu banco de dados, gera um arquivo SQL em um diretório no servidor e em seguida compacta ele para economizar espaço. 

<?php

//define os parâmetros de conexão do banco
$dbname = ""; //nome do banco
$dbhost = ""; //geralmente localhost
$dbuser = ""; //usuário do banco
$dbpass = ""; //senha do banco

//define o nome do arquivo e onde será salvo o backup
$filename = date('Ymdhms').$dbname;
$path = "../bkp/";

//cria a pasta onde os backups serão salvos caso ela não exista
if(!is_dir($path)){
	mkdir($path, 0751); //cria a pasta
}

// conectando ao banco
$con = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname) or die(mysql_error());

// gerando um arquivo sql. Como?
// a função fopen, abre um arquivo, que no meu caso, será chamado como: nomedobanco.sql
// note que eu estou concatenando dinamicamente o nome do banco com a extensão .sql.
$back = fopen($path.$filename.".sql","w");

// aqui, listo todas as tabelas daquele banco selecionado acima
$query = mysqli_query($con,"SHOW TABLES");
while($dados = mysqli_fetch_row($query))
{
    $res[] = $dados[0];
}

//Em seguida, vamos, verificar quais são as tabelas daquela base, lista-las, e em um laço for, vamos mostrar cada uma delas, e resgatar as funções descriação da tabela, para serem gravadas no arquivo sql mais adiante.
// resgato cada uma das tabelas, num loop
foreach ($res as $key => $value) {

	$table = $value;
	// usando a função SHOW CREATE TABLE do mysql, exibo as funções de criação da tabela,
	// exportando também isso, para nosso arquivo de backup
	$res2 = mysqli_query($con, "SHOW CREATE TABLE $table");
	// digo que o comando acima deve ser feito em cada uma das tabelas
		while ( $lin = mysqli_fetch_row($res2)){

		// instruções que serão gravadas no arquivo de backup
		fwrite($back,"\n#\n# Criacao da Tabela : $table\n#\n\n");
		fwrite($back,"$lin[1] ;\n\n#\n# Dados a serem incluidos na tabela\n#\n\n");

		//Teremos então de pegar os dados que estão dentro de cada campo de cada tabela, e abri-los também para serem gravados no nosso arquivo de backup.
		// seleciono todos os dados de cada tabela pega no while acima
		// e depois gravo no arquivo .sql, usando comandos de insert
		$res3 = mysqli_query($con, "SELECT * FROM $table");
		while($r=mysqli_fetch_row($res3)){
			$sql="INSERT INTO $table VALUES (";
			//Agora vamos pegar cada dado do campo de cada tabela, e executar tarefas como, quebra de linha, substituição de aspas, espaços em branco, etc. Deixando o arquivo confiável para ser importado em outro banco de dados.
			// este laço irá executar os comandos acima, gerando o arquivo ao final,
			// na função fwrite (gravar um arquivo)
			// este laço também irá substituir as aspas duplas, simples e campos vazios
			// por aspas simples, colocando espaços e quebras de linha ao final de cada registro, etc
			// deixando o arquivo pronto para ser importado em outro banco

			for($j=0; $j<mysqli_num_fields($res3);$j++)
			{
				if(!isset($r[$j]))
				$sql .= " \"\",";
				elseif($r[$j] != "")
				$sql .= " \"".addslashes($r[$j])."\",";
				else
				$sql .= " \"\",";
			}
			$sql = preg_replace("~,$~", "", $sql);
			$sql .= ");\n";
			fwrite($back,$sql);
		}
	}

}

//E finalmente, vamos fechar (internamente, no servidor) o arquivo que geramos, dando um nome para o mesmo, e gerando o arquivo que será então disponibilizado para download.

// fechar o arquivo que foi gravado
fclose($back);

// gerando o arquivo para download, com o nome do banco e extensão sql.
$arquivo = $path.$filename.".sql";

ob_start();

//zipa o arquivo
$zip = new ZipArchive(); 
if( $zip->open( $path.$filename.".zip" , ZipArchive::CREATE )  === true){
    $zip->addFile( $path.$arquivo ) ;
    $zip->close();
}

//deleta o arquivo .sql e mantém somente o zipado
unlink($arquivo);

?>

Criando uma tarefa para executar o backup automático

A tarefa CRON do linux é semelhante ao Tarefas agendadas do Windows Microsoft. Você poderá agendar um dia, horário e periodicidade que um comando é executado automaticamente. Acesse o CPANEL e procure por TRABALHOS CRON (ou "cron", ou "Tarefas cron").


Será mostrada uma janela onde deverá ser agendada a execução de um comando. 

No meu caso deixei programado para que o backup seja realizado todos os dias as 4 horas da manhã, pois considero um bom horário de maneira que este processo não sobrecarregue o servidor enquanto ele está sendo utilizado pelos usuários.

Portanto o agendamento ficou assim:

Minuto: 0 | Hora: 4 | Dia: * | Mês: * | Dia da semana: *

O comando é o caminho onde ficou hospedado o arquivo PHP que realiza o backup com o inicializador php e o parâmetro -f do shell. O caminho deve ser baseado na raiz do servidor:

Exemplo: 

php -f public_html/seu_site/cron/backup.php

Sillicon Valey Conference - grande evento sobre inovação trás gigantes ao Brasil

Publicado em 12/04/2018 | () comentários


StarSe realizará evento de inovação e tecnologia em Maio de 2018. Com palestrantes da Uber, Stanford University, Grabr, NASA, NVidia e da própria StarSe, o evento promete ser imprescindível para amantes da inovação.

Ingressos variam entre R$349 a R$499 por pessoa e as inscrições podem ser realizadas neste link.

Como compartilhar o calendário do Outlook online com o Google Agenda

Publicado em 12/04/2018 | () comentários


Controlar suas tarefas em agendas eletrônicas é um facilitador indispensável. A Microsoft possui um ótimo controle de agenda, o Outlook Calendário, assim como a Google possui um excelente e integrado controle de agendas, o Google Agenda. Caso você precise utilizar os dois recursos, mas queira gerenciar tudo a pertir de uma única agenda, sugerimos utilizar o Google Agenda, que possui integrações mais completas com o Android e Google Now.

Como gerar o link de agenda compartilhada no Outlook Calendar?

O Outlook lançou uma versão BETA com novos recursos e visual moderno, porém, para acessar diversos recursos você precisará acessar a versão antiga do Outlook.

1. Acesse o endereço: https://outlook.live.com/calendar/

2. Desabilite o teste da versão beta desmarcando a opção: Versão beta do Outlook (Caso esta opção não apareça, é porque seu Outlook já está na versão antiga).

3. Clique na engrenagem para acessar as opções e em seguida clique em Opções


4. No menu esquerdo acesse Calendários Compartilhados > Publicação de calendário

5. No campo Selecione um calendário, escolha o calendário que deseja compartilhar e na opção Mostrar disponibilidade, títulos e locais clique em CRIAR

6. O link do seu calendário será compartilhado e será mostrado em dois formatos: HTML e ICS.

7. Copie a URL da opção ICS

8. Acesse o Google Agenda em: https://calendar.google.com

9. Na coluna esquerda, clique em + Adicionar outras agendas e escolha a opção Do URL

10. Na janela que se abrirá, cole o URL copiado do Outlook e clique em ADICIONAR AGENDA

11. Sua agenda do Outlook será mostrada dentro do Google Agenda. Acesse as configurações da agenda e renomeie ela, adicione uma cor e pronto. Todos os eventos do seu Outlook aparecerão no Google Agenda.

Para saber mais sobre Outlook, clique aqui.

Removendo o Composer do menu de contexto do Windows 10

Publicado em 11/04/2018 | () comentários

Composer é uma ferramenta para gerenciamento de dependências para o PHP. Com algumas poucas linhas de configurações você define todas as bibliotecas de terceiros ou mesmo suas que deseja utilizar em seu projeto, porém, se você instalou e não se interessou pelo Composer, após desinstalar você terá uma surpresa: O menu de contexto do composer permanece no Windows 10.


Para remover definitivamente este menu, será necessário excluir um registro do Windows.

1. Acesse a janela de execução do Windows pressionando WINDOWS + R ou navegando pelo menu Iniciar

2. Escreva regedit e execute

3. Navegue até o seguinte caminho:

\HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\

4. Exclua o registro ComposerSetup


Categoria: php windows

Como remover extensão .php e criar URL amigável

Publicado em 04/04/2018 | () comentários

Se você deseja que suas páginas web sejam acessadas sem a extensão .PHP, basta seguir o seguinte procedimento:

1. Abra o bloco de notas e coloque seguinte conteúdo dentro:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
2. Salve o arquivo sem extensão (não utilize a extensão .txt) na raiz do seu site e pronto.

Ao acessar as páginas do seu site sem a extensão .php tudo funcionará normalmente.

Obs.: Este redirecionamento só funciona em servidor Linux.


Categoria: php desenvolvimento

Executando uma instrução INSERT, DELETE ou UPDATE SQL dentro do VBA

Publicado em 27/10/2017 | () comentários

O VBA possui nativo várias funções que executam operações prontas de obtenção (SELECT) de dados, podendo estas funções somar, obter, contar valores de um campo em uma tabela com determinado critério. Estas funções nativas do VBA basicamente são: DLOOKUP, DCOUNT, DSUM, etc, porém, para executar operações de modificação (INSERT, DELETE, UPDATE) nos registros, é necessário criar instruções em SQL agregada ao VBA.

Criando uma instrução SQL dentro do VBA

Para criar a instrução SQL dentro do VBA basta utilizar o comando:

CurrentDb.execute()

Este comando executa uma instrução SQL no banco de dados atual. A maneira correta de se declarar a instrução é declarando uma variável que define o banco desejado (pois é possível executar esta ação em um banco externo) e a função execute

Dim banco As DAO.Database
Set banco = CurrentDb
banco.Execute ("AQUI VAI O SQL")

Dentro do argumento EXECUTE, deverá ser colocado o SQL.

Exemplo prático

No exemplo abaixo iremos realizar um INSERT na tabela cad_pessoa, inserindo nas colunas dataRegistro, ativo e nome. Cada um destes campos conterá um conteúdo diferente e deve ser declarado corretamente dentro do SQL:

CampoTipo de conteúdoOrigem do valor
dataRegistroData (Date)Valor dinâmico, informado através da função Now() do VBA. A data deve ser envolvida com aspas simples e hashtag.
ativoNúmero (Integer)Valor fixo. No caso é o número 1. Números podem ser declarados sem aspas dentro do SQL
nomeTexto (String)

Valor coletado a partir de um campo no formulário. O campo se chama txtNome. Como o campo é texto, deve ser envolvido com aspas simples dentro do SQL.

A instrução SQL ficará da seguinte maneira:

banco.Execute ("INSERT INTO cad_pessoa (dataRegistro, ativo, nome) VALUES  ('#" & Now() & "#', 1, " & Nz(Me.txtNome.value) & ")")

No código acima, o trecho em cinza corresponde ao corpo da declaração da função EXECUTE. Os trechos em azul correspondem ao SQL e os trechos em vermelho são declarações VBA. Concatene o valor de origem VBA com SQL através do símbolo &, lembrando de fechar e abrir com aspas duplas. 

Categoria: access vba sql

Obtendo caminho completo (path) de uma tabela no banco de dados ACCESS

Publicado em 06/10/2017 | () comentários

Considerando que sua aplicação ACCESS está vinculada em apenas um banco de dados (tabelas separadas da aplicação), a função CurrentDb possui um recurso extra para se obter o caminho completo das tabelas. Pegando o caminho de uma tabela, saberemos o caminho de todas.

Coloque a linha de código abaixo dentro de qualquer evento do ACCESS e ela retornará o caminho da tabela. Este caminho será exatamente onde as tabelas da sua aplicação estão salvas.

Obs: substitua o trecho destacado pelo nome de qualquer uma de suas tabelas.

Obtendo caminho completo

A função CurrentDb referencia ao banco atual e a instrução TableDefs referencia a tabela específica do banco atual. Em seguida a instrução Connect retorna o path da tabela

CurrentDb.TableDefs("nome_tabela").Connect

Obtendo parte do caminho

A função Mid retorna parte de uma string. No caso, estamos retornando a partir do caractere 5, contado da esquerda pra direita.

Mid(CurrentDb.TableDefs("nome_tabela").Connect, 10)

Categoria: access vba função

Criando validação de formulário com VBA

Publicado em 26/07/2017 | () comentários

A validação do preenchimento de campos de um formulário no ACCESS utilizando VBA é muito simples.

No evendo AO CLICAR do botão SALVAR, insira o seguinte código:

'validação dos campos
'caso um dos campos não esteja preenchido, a ação para dentro do sub
If Nz(Me.campo1) = "" Then
    MsgBox "Preencha o campo", vbCritical
    Exit Sub
ElseIf Nz(Me.campo2) = "" Then
    MsgBox "Preencha o campo", vbCritical
    Exit Sub
ElseIf Nz(Me.campo3) = "" Then
    MsgBox "Preencha o campo", vbCritical
    Exit Sub
ElseIf Nz(Me.campo4) = "" Then
    MsgBox "Preencha o campo", vbCritical
    Exit Sub
Else

    'salva data e usuario de alteração/registro
   DoCmd.RunCommand acCmdSaveRecord
 
End If

Funcionamento

Ao clicar no botão SALVAR, a validação passa por todos os campos (destaque em azul). Caso um dos campos esteja vazio, a mensagem dentro de MSGBOX é apresentada e o código para de ser executado com EXIT SUB.

Caso nenhum dos campos obrigatórios esteja vazios, o IF passa direto para o ELSE e salva o registro com o comando: DoCmd.RunCommand acCmdSaveRecord


Categoria: vba access

PROCV - retornando colunas à esquerda do valor procurado

Publicado em 23/07/2017 | () comentários

A PROCV é uma das funções mais utilizadas e interessantes do Excel. Muitos acham a função um pouco complexa, mas aqui neste tutorial você irá perceber que ela não é tão complexa assim.

A PROCV basicamente procura um valor na primeira coluna de uma matriz (matriz_tabela) selecionada e retorna uma coluna específica (num_indice_coluna) quando o valor procurado for encontrado. Você pode retornar qualquer coluna da matriz, bastando especificar a coluna desejada no argumento num_indice_coluna.

A desvantagem do PROCV

A única desvantagem da PROCV é justamente retornar somente valores à direita da matriz. O valor procurado será sempre a primeira coluna da matriz e os valores retornados serão sempre os que existirem da primeira coluna para a direita, nunca será possível retornar valores que estão à esquerda da coluna

Como fazer o PROCV retornar as colunas à esquerda da matriz?

A solução é muito simples, porém iremos substituir o PROCV por duas outras funções: 

Nesta fórmula iremos executar a mesma ação que o PROCV, porém:

  • A função ÍNDICE irá indicar a coluna de retorno (azul)
  • A função CORRESP irá realizar a busca do valor na coluna procurada (amarela)

A fórmula

A fórmula ficará da seguinte maneira:

=ÍNDICE(coluna_retorno; CORRESP( valor_procurado ; coluna_procurada ; 0 ))

Resumindo: O ÍNDICE irá demarcar a coluna que queremos retornar e o CORRESP irá procurar o valor na coluna que queremos procurar, ao encontrar o CORRESP irá indicar ao ÍNDICE em qual linha está o valor desejado. Desta forma você pode colocar a coluna de retorno em qualquer posição da matriz, à direita ou à esquerda da coluna procurada. 


No exemplo acima, procuramos o valor 28 da célula I4 na coluna D e ao encontrar retornamos o valor 26 que corresponde a mesma linha que 28.