Ir para conteúdo

POWERED BY:

Arquivado

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

jnejunior

[Resolvido] backup dinâmico de banco de dados

Recommended Posts

pessoal, estou ajustando um sistema de backup, e estou com problemas na extração dos dados, eles estão saindo assim:

 

INSERT INTO `nivel`( `idNivel` ) VALUES ( 1 )
INSERT INTO `nivel`( `idNivel`,`nivel` ) VALUES ( 1,'administrador' )
INSERT INTO `nivel`( `idNivel`,`nivel`,`idNivel` ) VALUES ( 1,'administrador',2 )
INSERT INTO `nivel`( `idNivel`,`nivel`,`idNivel`,`nivel` ) VALUES ( 1,'administrador',2,'editor' )
INSERT INTO `nivel`( `idNivel`,`nivel`,`idNivel`,`nivel`,`idNivel` ) VALUES ( 1,'administrador',2,'editor',3 )
INSERT INTO `nivel`( `idNivel`,`nivel`,`idNivel`,`nivel`,`idNivel`,`nivel` ) VALUES ( 1,'administrador',2,'editor',3,'membro' )

 

quando o correto seria exibir assim, ou algo parecido:

 

INSERT INTO `nivel` (`idNivel`, `nivel`) VALUES
(1, 'administrador'),
(2, 'editor'),
(3, 'membro');

 

a parte do script que é responsável por esta parte do código é este:

 

if( isset( $_POST['backup'] ) ){
                   $PDO->query( 'USE `'.$_GET['database'].'`' );
                   echo '<textarea cols="150" rows="60">';
                   foreach( $_POST['table'] as $index => $data ){
                        $create = $PDO->query( 'SHOW CREATE TABLE `'.$data.'`' )->fetchAll();
                        foreach( $create as $createTable){
                            echo $createTable[ 'Create Table' ], "\n\n";
                        }
                        $select = $PDO->query( 'SELECT * FROM `'.$data.'`' )->fetchAll();
                        for( $i = 0; $i < sizeOf( $select ); ++$i ){
                             foreach( $select[ $i ] as $field => $value ){
                                 $fields[] = '`'.$field.'`';
                                 if( !is_numeric( $value ) ){
                                     $values[] = sprintf( "'%s'", $value );
                                 }else{
                                     $values[] = intval( $value );
                                 }
                                 printf( 'INSERT INTO `%s`( %s ) VALUES ( %s )', $data, implode( ',', $fields ), implode( ',', $values ) );
                                 echo "\n";
                             }
                        }
                   }
                   echo '</textarea>';
               }

Compartilhar este post


Link para o post
Compartilhar em outros sites

...

Engraçado, pois testei o script que te passei no outro fórum, e está funcionando perfeitamente

olha o retorno:

CREATE TABLE `usuarios` (
 `uid` mediumint(16) NOT NULL AUTO_INCREMENT,
 `nome` varchar(20) NOT NULL,
 `sobrenome` varchar(32) NOT NULL,
 `email` varchar(75) NOT NULL,
 `senha` varchar(40) NOT NULL,
 `estado` char(2) NOT NULL,
 `cidade` varchar(49) NOT NULL,
 `endereco` varchar(52) NOT NULL,
 `bairro` varchar(46) NOT NULL,
 `genero` enum('Masculino','Feminino') NOT NULL,
 `cpf` varchar(14) NOT NULL,
 `cnpj` varchar(19) NOT NULL,
 `rg` varchar(18) NOT NULL,
 `cadastrado` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`uid`),
 UNIQUE KEY `email` (`email`),
 KEY `nome` (`nome`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 CHECKSUM=1 ROW_FORMAT=DYNAMIC

INSERT INTO `usuarios`
(`uid`,`nome`,`sobrenome`,`email`,`senha`,`estado`,`cidade`,`endereco`,`bairro`,`genero`,`cpf`,`cnpj`,`rg`,`cadastrado` ) 
VALUES ( 1,'Andrey ','Knupp Vital','andreykvital@gmail.com','aeiou','','','','','Masculino','','','','2011-06-18 19:27:28' )

 

Apenas troquei o 'printf', pra baixo do 'foreach', foi erro meu, não tinha percebido, mais mesmo assim

ele está funcionando normalmente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey testei aqui de novo mas olha só como saiu:

 

INSERT INTO `nivel` ( `idNivel` , `nivel` ) VALUES (1, 'administrador') INSERT INTO `nivel` ( `idNivel` , `nivel` , `idNivel` , `nivel` ) VALUES (1, 'administrador', 2, 'editor') INSERT INTO `nivel` ( `idNivel` , `nivel` , `idNivel` , `nivel` , `idNivel` , `nivel` ) VALUES (1, 'administrador', 2, 'editor', 3, 'membro')

 

 

for ($i = 0; $i < sizeof($select); ++$i){ 							foreach ($select[$i] as $campo => $valor){ 								$campos[] = '`'.$campo.'`'; 								if (!is_numeric($valor)){ 									$valores[] = sprintf("'%s'", $valor); 								} else { 									$valores[] = intval($valor); 								} 								echo "\n"; 							} 							printf('INSERT INTO `%s` ( %s ) VALUES (%s)', $dados, implode(' , ', $campos), implode(', ', $valores)); 						}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei o script e estava dando o mesmo problema descrito pelo jnejunior.

 

Achei estranho, pois para você funciona perfeitamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

No outro tópico você disse que continuava com erro, então alterei acrescentando:

unset( $fields );
unset( $result );

 

<!doctype html>
<html>
   <head>
       <meta http-equiv="content-type" content="text/html; charset=utf-8" />
   </head>
   <body>
       <?php
               $PDO = new PDO( 'mysql:host=localhost', 'root', '' );
               $PDO->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
               $PDO->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC );
       ?>
       <form method="GET">
           Selecione o banco de dados: <select name="database" onchange="this.form.submit()">
           <?php
               foreach( $PDO->query( 'SHOW DATABASES' )->fetchAll() as $index => $data ){
                   if( $_GET['database'] == $data['Database'] ){
                       echo '<option value="'.$data['Database'].'" selected>', $data['Database'], '</option>';
                   }else{
                       echo '<option value="'.$data['Database'].'">', $data['Database'], '</option>';
                   }
               }
           ?>
           </select><br />
        </form>
        <form method="POST">
                <?php 
                   if( !empty( $_GET['database'] ) ){
                       echo 'Selecione as tabelas: <br /> 
                            <select name="table[]" multiple="multiple">';
                       $Tables = $PDO->query( 'SHOW TABLES FROM `'.$_GET['database'].'`' )->fetchAll();
                       for( $i = 0; $i < sizeOf( $Tables ); ++$i ){
                            foreach( $Tables[ $i ] as $index => $data ){
                                echo '<option value="'.$data.'">'.$data.'</option>';
                            }
                       }
                       echo '</select><br />';
                       echo '<input type="submit" value="Fazer Backup" name="backup">';
                   }
                ?> 
       </form>
       <?php
               echo '<pre>';
               if( isset( $_POST['backup'] ) ){
                   $PDO->query( 'USE `'.$_GET['database'].'`' );
                   echo '<textarea cols="150" rows="60">';
                   foreach( $_POST['table'] as $index => $data ){
                        $create = $PDO->query( 'SHOW CREATE TABLE `'.$data.'`' )->fetchAll();
                        foreach( $create as $createTable){
                            echo $createTable[ 'Create Table' ], ";\n\n";
                        }
                        $select = $PDO->query( 'SELECT * FROM `'.$data.'`' )->fetchAll();
                        for( $i = 0; $i < sizeOf( $select ); ++$i ){
                             foreach( $select[ $i ] as $field => $value ){
                                 $fields[ $field ] = '`'.$field.'`';
                                 if( !is_numeric( $value ) ){
                                     $values[  ] = sprintf( "'%s'", $value );
                                 }else{
                                     $values[  ] = ( float ) $value;
                                 }
                             }
                             $result[ ] = sprintf( '( %s )', implode( ', ', $values ) );
                             unset( $values );
                        }
                        printf( "INSERT INTO `%s`( %s ) \nVALUES \n%s;\n", $data, implode( ',', $fields ), implode( ", \n", $result ) );
                        printf( "\n" );
                        unset( $fields );
                        unset( $result );

                   }
                   echo '</textarea>';echo $insert;
               }
       ?>
   </body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Era de uns testes que estava fazendo :huh:, esqueci de remover, estava meio na correria. :ermm:

 

Já atualizei o post ;)

 

Boa observação :D

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.