Ir para conteúdo

POWERED BY:

Arquivado

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

cassiano óliver

Backup mysql via php

Recommended Posts

Boa tarde pessoal,

 

Tenho o script abaixo em php que faz o backup de um banco mysql e salva um arquivo .sql em um diretório.

Bom, isso ele ta fazendo, porém hoje ao tentar importar o arquivo .sql no phpmyadmin, o mesmo dá erro.

 

script

<?php
if(backupmysql()) {
	die("ocorreu um erro efetuando o backup, por favor entre em contato com o administrador do site.");
}
else {
	print "backup efetuado com sucesso!";
};

function backupmysql() {
$my_host = 'localhost';
$my_user = '';
$my_pass = '';
$my_db = '';
$quebra = chr(13).chr(10);

$file_time = date("Y-m-d");

$file = "xxx" . $file_time . ".sql";

$back = fopen($file,"w");

$version = "1.0";
$link = mysql_connect($my_host,$my_user,$my_pass) or die("erro conectando: " . mysql_error());
mysql_select_db($my_db,$link) or die("erro selecionando: " . mysql_error());
$tables = mysql_list_tables($my_db) or die("erro no list_tables: " . mysql_error());

########################
# CABECALHO DO ARQUIVO #
########################

$timebkp = date("d/m/Y, H:i:s",time());
$mysql_version = mysql_get_server_info();
$php_version = phpversion();

fwrite($back,"-- Backup MySQL - cassianodesigner.com$quebra
-- version: $version$quebra
--$quebra
-- Servidor: $my_host$quebra
-- Horario de backup: $timebkp$quebra
-- Versao do MySQL: $mysql_version$quebra
-- Versao do PHP: $php_version$quebra
--$quebra
-- Bando de dados: `$my_db`$quebra
--$quebra$quebra

-- ----------------------------------------------------------$quebra$quebra

");



while ($row = mysql_fetch_row($tables)) {
	$table = $row[0];      // cada uma das tabelas
	mysql_query("OPTIMIZE TABLE `$table`;") or die("erro otimizando tabelas: " . mysql_error());
	$res2 = mysql_query("SHOW CREATE TABLE $table");

	while ($lin = mysql_fetch_row($res2)) { // para cada tabela
		  fwrite($back,"--\n$quebra");
		  fwrite($back,"-- Estrutura da tabela `$table`\n$quebra");
		  fwrite($back,"--\n\n$quebra$quebra");
		  #fwrite($back,"DROP TABLE IF EXISTS `$table`;\n");
		  $new_lin = str_replace("CREATE TABLE `","CREATE TABLE IF NOT EXISTS `",$lin[1]);
		  fwrite($back,"$quebra$new_lin ;\n\n$quebra$quebra");
		  fwrite($back,"--\n$quebra");
		  fwrite($back,"-- Extraindo dados da tabela `$table`\n$quebra");
		  fwrite($back,"--\n\n$quebra$quebra");

		  $res3 = mysql_query("SELECT * FROM $table");

		  if (mysql_num_rows($res3) == 0) {
			 break;
		  };


		  $fields = mysql_list_fields($my_db,$table);
		  $columns = mysql_num_fields($fields);
		  $nc = $columns;
		  $nc--;
		  $fiel = NULL;
		  fwrite($back,"INSERT DELAYED IGNORE INTO `$table` (`");
		  for ($i = 0; $i < $columns; $i++) {
			  $fiel .= mysql_field_name($fields, $i);
			  if ($i < $nc) {
				  $fiel .= ";";
			  };
		  };
		  $newfiel = explode(";",$fiel);
		  fwrite($back,implode("`, `",$newfiel));
		  fwrite($back,"`) VALUES ");

		  $i=1;
		  $rt = mysql_num_rows($res3);
		  $ft = mysql_num_fields($res3);
		  while ($r=mysql_fetch_row($res3)) {
				fwrite($back,"$quebra(");
				for ($x=0; $x < $ft; $x++) {
					 if (mysql_field_type($res3,$x) == 'int' || mysql_field_type($res3,$x) == 'real') {
						 fwrite($back,"$r[$x]");
					 } else {
						 fwrite($back,"\"$r[$x]\"");
					 };

					 $nft = $ft;
					 $nft--;
					 if ($x < $nft) {
						 fwrite($back,", ");
					 };
				};
				fwrite($back,")");

				if ($i < $rt) {
				   fwrite($back,",\n");
				} else {
				   fwrite($back,";\n$quebra");
				};
				$i++;
		  };
	fwrite($back,"\n$quebra");

	};
};
fclose($back);
}
?>

 

Na tabela "sistemas", inseriu o primeiro registro

(001, "Aniversariantes", "<p>Cadastro de aniversariantes com ou sem suporte a imagens.</p>", "<ul>
<li>Cadastro dos aniversariantes.</li>
<li>Envio de imagem. o sistema automaticamente gera uma miniatura a ser exibida na página.</li>
<li>Os aniversariantes são listados de acordo com o mês corrente.</li>
</ul>", 60, "http://www.cassianodesigner.com/sistemas/aniversariantes", "http://www.cassianodesigner.com/sistemas/aniversariantes/admin/", 0)

Deu erro ao inserir o segundo

(002, "Agenda de Eventos (para Sites de Baladas)", "<p>Sistema de agenda com suporte a envio de imagens.<br />Sistema em funcionamento: <a class="link-externo" href="http://www.curtindonabalada.com">www.curtindonabalada.com</a></p>", "<ul>
<li>Cadastro de evento com informações a definir (nome, data, local, etc...).</li>
<li>Formatação de texto com editor html.</li>
<li>Sistema de envio de imagem. </li>
<li>Validação de imagens por extensão e dimensões. ex: pode-se permitir apenas imagens jpg com no má-ximo 800x600px.</li>
</ul>
<p> </p>
<h3>Recursos opcionais:</h3>
<p>Corte de imagens. após o envio da imagem, poderá selecionar uma área da imagem para criar uma pré-visualização da mesma (semelhante ao orkut).<br /><strong>acréscimo:</strong> r$ 80,00.</p>", 220, "http://www.cassianodesigner.com/sistemas/agenda-de-eventos/", "http://www.cassianodesigner.com/sistemas/agenda-de-eventos/admin/", 0)

Não consegui identificar o porquê deste erro. No phpmyadmin apresenta isso:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'link-externo" href="http://www.curtindonabalada.com">www.curtindonabalada.com</a' at line 2

 

Se puderem me ajudar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faltou escapar as aspas dentro do script SQL. Olha só.

 

-- abre aspa dupla -- "<p>Sistema de agenda com suporte a envio de imagens.<br />Sistema em funcionamento: <a class= -- fecha aspa dupla -- "link-externo" -- abre de novo -- href= -- fecha de novo -- "http://www.curtindonabalada.com -- abre de novo -- " >www.curtindonabalada.com</a></p>"
Ou seja, tudo que está fora das aspas será considerado como um comando SQL, o que gerará o erro. Para resolver, addslashes.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora que fui reparei um detalhe...

acrescentei addslashe ao resgatar o texto, porém no banco não é guardado com as "\"??

 

não deveria salvar assim?

"\... texto ...\"

no banco fica assim

"... texto ..."

Mas se eu der um echo no texto antes de enviar para o banco, ele me retorna com as "\" ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na vdd ele não grava no banco com as barras. você tem que tratar com o addslashes antes de gravar no banco e antes de criar o arquivo .sql.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.

 

Então devo escapar no .sql certo?

Fiz vários testes aqui, só que quando acrescento addslashes no .sql, em todas as aspas ele escapa, mas o correto seria escapar só as "aspas" que estão no conteúdo, ex: <a href=\"\"></a>

 

Mas como ele não escapa no banco, como vou escapar somente as aspas de um link ou outra tag html?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, pelo que estive analisando, acredito que o addslashes deve ser colocado no trecho abaixo.

fwrite($back,"\"".addslashes($r[$x])."\"");

É assim que você está fazendo?

 

Carlos Eduardo

PS - Como não resolveu ainda, vou remover o [Resolvido] do título.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela atenção Matias.

 

Na verdade eu usei nessas duas linhas

fwrite($back,"$r[$x]");
fwrite($back,"\"$r[$x]\"");

Só que está escapando tudo...

vou fazer novos testes e posto o código aqui para atender melhor...

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.