terça-feira, 13 de dezembro de 2011

Organizar banco de dados

Esta é uma maneira prática para aqueles que administram bancos de dados, tem que fazer algumas operações manuais e se deparam com campos de identificação (chaves primaria) com valores astronômicos e muitas vezes desnecessários pois esses valores não estão seguidos (1, 2, 4, 8, 10, 17, 23, 88, ...). Isso me incomoda então fiz esse código

<?php
function conectar($local_banco, $usuario_banco, $senha_banco) {
return mysql_pconnect($local_banco, $usuario_banco, $senha_banco);
}
function consulta($query){
$nome_banco = 'banco';
$senha_banco = 'senha';
$usuario_banco = 'usuario';
$local_banco = '127.0.0.1';
if(!$conexao){$conexao = conectar($local_banco, $usuario_banco, $senha_banco);};
if(!$conexao){die('<br />Não foi possível conectar: '.mysql_error());};
$banco = mysql_select_db ($nome_banco, $conexao);
if(!$banco){die('<br />Não foi possível conectar no banco: '.mysql_error());};
$resultado = mysql_query($query, $conexao);
if(!$resultado){die('<br />Não foi possível fazer a consulta: '.mysql_error().'<br />'.$query);};
if (strpos($query, 'SELECT') !== false) {
if (mysql_num_rows($resultado)) {
$i=0;
while($result = mysql_fetch_assoc($resultado)) {
foreach ($result as $key=>$valor){$var[$i][$key] = $valor;}
$i++;
}
return $var;
} else {
return false;
}
}
return;
}
function organizar($banco) {
foreach ($banco as $tabelas) {
$registros = consulta("SELECT * FROM `".$tabelas['tabela']."`");
consulta("TRUNCATE `".$tabelas['tabela']."`");
$campos = false;
foreach($registros as $key => $registro) {
if (!$campos) {
foreach ($registro as $campo => $valor) {
if ($campo != $tabelas['id']) {
$campos .= "`$campo`, ";
}
}
$campos = substr($campos, 0, -2);
}
$valores = NULL;
$verificar = NULL;
foreach ($registro as $campo => $valor) {
if ($campo != $tabelas['id']) {
$valor = str_replace('"', '\"', $valor);
$valores .= "\"$valor\", ";
$verificar .= "`$campo` = \"$valor\" and ";
} else {
$idantigo = $valor;
}
}
$valores = substr($valores, 0, -2);
$verificar = substr($verificar, 0, -5);
consulta("INSERT INTO `".$tabelas['tabela']."` ($campos) VALUES ($valores)");
$idregistro = consulta("SELECT `".$tabelas['id']."` FROM `".$tabelas['tabela']."` WHERE $verificar");
$idregistro = $idregistro[0][$tabelas['id']];
foreach($tabelas['referenciadas'] as $referenciada) {
consulta("UPDATE `".$referenciada['tabela']."` SET `".$referenciada['campo']."` = $idregistro WHERE `".$referenciada['campo']."` = $idantigo $especial");
}
}
}
}
$banco = array(
    0 => array(
        'tabela' => 'tabela a ser organizada',
        //a chave primaria tem que ter a propriedade auto incremento
        'id'=> 'chave primaria da mesma',
        // todas as tabelas que usam da CHAVE PRIMARIA da tabela a ser organizada
        'referenciadas'=> array(
            0 => array(
                'tabela' => 'tabela referenciada',
                'campo' => 'campo referenciado',
                /*Normalmente a tabela referenciada(que recebe a referencia) está ligada a somente uma tabela se assim for apenas o valor da chave primaria da tabela referenciadora serve como parâmetro de busca para achar todos os registros, da tabela referenciada, relacionados com o registro da tabela referenciadora, mas as vezes a tabela referenciada está ligada a mais de uma tabela referenciadora o que exige um segundo campo de verificação, é justamente nesses casos que se usa a variável 'especial' como no exemplo*/
                'especial' => ' and `segundo_campo_de_verificacao` = "valor"'
            )
        )
    )
);
organizar($banco);
?>

Na variavel $banco que está no rodapé da pagina logo antes da linha que chama a função coloque as informações do seu banco de dados, nome de cada tabela a chave primaria e caso tiver tabelas que tenham chave referenciada coloque o nome da tabela e o campo referenciado(que recebe a referencia).

Normalmente a tabela referenciada(que recebe a referencia) está ligada a somente uma tabela se assim for apenas o valor da chave primaria da tabela referenciadora serve como parametro de busca para achar todos os registros, da tabela referenciada, relacionados com o registro da tabela referenciadora, mas as vezes a tabela referenciada está ligada a mais de uma tabela referenciadora o que exige um segundo campo de verificação, é justamente nesses casos que se usa a variável 'especial' como no exemplo.

Mas essa característica é rara até porque pode ser considerado um erro de estruturação do banco, salvo raras exceções. A maioria não utilizará este parâmetro.

0 Comentarios:

Postar um comentário