Posts tagged MySQL
Exportar estruturas MySql dinamicamente com PHP
0Após alguns comentarios resolvi dar uma pesquisada para atender a galera seguidora do blog aí vai o codigo:
<?php $host = "";#CONFIGURE SEU HOST AQUI $user = "";#USUARIO DO BANCO DE DADOS $pass = "";#SENHA DO BANCO DE DADOS $db = "";#BASE QUE OS DADOS SERAO EXPORTADOS $arquivoSQL = "BasedeDados.txt";#ARQUIVO TXT NO QUAL VOCE QUER GUARDAR OS INSERTS, PODE SER .SQL TAMBÉM #SE O ARQUIVO NAO EXISTIR ELE SERÁ CRIADO. $clausulaSQL = DumpSQL($host, $user, $pass, $db);#AQUI EU CHAMO A FUNÇAO DumpSQL, QUE GUARDA NA VARIAVEL #$clausulaSQL OS DADOS NA FORMA DE INSERT INTO. escreveNoTXT($clausulaSQL, $arquivoSQL);#ESCREVE NO ARQUIVO BasedeDados.txt O VALOR DA VARIAVEL $clausulaSQL. function escreveNoTXT($consultasSQL, $arquivoSQL){ //ARQUIVO TXT $arquivo = $arquivoSQL; //TENTA ABRIR O ARQUIVO TXT if (!$abrir = fopen($arquivo,"w")){ $retorno = "ERRO AO ABRIR"; }else{ $retorno = true; } //ESCREVE NO ARQUIVO TXT if (!fwrite($abrir,$consultasSQL)){ $retorno = "ERRO AO ESCREVER"; }else{ $retorno = true; } //FECHA O ARQUIVO fclose($abrir); return $retorno; } function DumpSQL($host, $user, $pass, $db){ mysql_connect( $host,$user, $pass) or die(mysql_error( )); mysql_select_db($db) or die(mysql_error( )); #mysql_list_tables PEGA TODAS AS TABELAS DA BASE DE DADOS $res = mysql_list_tables($db) or die(mysql_error()); while($row = mysql_fetch_row($res)){ $table = $row[0]; #CADA TABELA DA BASE DE DADOS $res3 = mysql_query("SELECT * FROM $table"); while($r=mysql_fetch_row( $res3)){ #AQUI OCORRE A EXTRAÇAO DOS DADOS DA TABELA $sql="INSERT INTO $table VALUES ('"; $sql .= implode("','",$r); $sql .= "');\n"; $back.=$sql; } } $data = date("d/m/Y"); $back .= "\n\n--Backup feito em $data"; mysql_free_result($res); return $back; } ?>
Obrigado e até mais pessoal.
Crédito para Rafael Sales
PHP/MySQL – Trabalhando com Valores Monetários com precisão de casas decimais
12PHP/MySQL – Trabalhando com Valores Monetários com precisão em casas decimais.
Esses dias me deparei com um problema no trabalho, estava desenvolvendo um sistema de administração interno para empresa onde envolvia cálculos monetários. O problema ocorreu quando tentei gravar no banco um numero com mais de 8 dígitos e 2 casas decimais de precisão. Primeiramente tentei usar o tipo de dados DOUBLE mas ele truncava as casas decimais. Exp.: eu inseria no banco 3.456.234.678,98 e na consulta ele me trazia 3.456.234.679,00
Moral da historia, ele estava truncando as casas decimais. Testei com o tipo FLOAT e obtive os mesmos resultados do tipo DOUBLE. Então depois de pesquisar na internet e nada encontrar que solucionasse meu problema, resolvi ler o manual do MySQL e encontrei o seguinte:
“Os tipos de dados FLOAT e DOUBLE são usados para representar aproximadamente dados de valores numéricos.”
Mais adiante no manual encontrei o tipo DECIMAL que dizia:
“Os tipos de dados DECIMAL e NUMERIC são usados para armazenar dados de valores numéricos com precisão. Eles são usados por valores para os quais é importante preservar a exatidão como, por exemplo, dados monetários.”Esse era o cara que eu estava procurando ![]()
Sem mais delongas vamos ao que interessa a implementação. Não vou entrar em muitos detalhes quem estiver interessado em saber mais sobre os tipos de dados que o MySQL suporta pode consultar o manual nos links abaixo:
Manual de Referência do MySQL 4.1 / 6.2.1. Tipos Numéricos – em português
http://dev.mysql.com…1/pt/index.html
MySQL 5.5 Reference Manual / 10.2. Numeric Types – em inglês
http://dev.mysql.com…5/en/index.html
Implementação:
MySQL
No MySQL configure sua tabela para receber o tipo de dado DECIMAL.
DECIMAL(M,D) onde M é o numero de dígitos e D o numero de casas decimais.
Exp.: salário DECIMAL(5,2) ele ira suportar a faixa numérica de -999.99 to 999.99
Se não for especificado nada entre parênteses ele assume o valor padrão M é 10. Ok depois de configurado o MySQL devidamente vamos ao PHP.
PHP
Primeiramente devemos remover a virgula e substituir ela por ponto porque o MySQL usa o padrão americano para gravar os dados. Escrevi uma pequena função para fazer isso:
function moeda($get_valor) {
$source = array('.', ',');
$replace = array('', '.');
$valor = str_replace($source, $replace, $get_valor); //remove os pontos e substitui a virgula pelo ponto
return $valor; //retorna o valor formatado para gravar no banco
}
//Chamada da função
$valor_final=moeda($_POST['valor']);
Ok tudo gravado no banco muito bonito, mas agora quando você fizer um SELECT ele não ira trazer o valor com deve. Para isso precisamos usar a função do PHP number_format()
Abaixo a solução:
$valor_servico = ' R$ ' . number_format($l['valor_servico'], 2, ',', '.');
O que exatamente faz essa linha? number_format pega o valor da variável $l que foi buscada no banco, separa as ultimas 2 casas a direita com uma virgula depois a cada 3 casa ele coloca um ponto a seguir concatena co valor com R$ para ficar bonitinho e armazena o resultado na variável $valor_servico
Pronto, não entrei em muitos detalhes mas acho que consegui passar o conceito para vocês.
Até a próxima.
Problemas de acentuação em PHP/MySQL.
0PHP/MySQL codificação de caracteres – Acentuação.
Esses dias fiquei apanhando para acertar a codificação dos caracteres no sistema, depois de muita pesquisa na net, o pessoal sempre falando a mesma coisa, não encontrei a solução, então depois de horas tentando consegui resolver o problema. Não vou entrar em detalhes então vamos à receita do bolo:
1º Colocar o cabeçalho no código php:
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
</head>
2º A conexão que o php faz com o banco também deve conter o cabeçalho:
header(“Content-Type: text/html; charset=ISO-8859-1″,true);
Isso pode ser inserido no arquivo que faz a conexão com o banco ou dentro do documento php.
Até ai nenhuma novidade.
3º Verificar em qual codificação o MySQL esta trabalhando:
mysql> status;
————–
mysql Ver 14.12 Distrib 5.0.84, for pc-linux-gnu (i686) using readline 6.0
Connection id: 28
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: /usr/bin/less
Using outfile: ”
Using delimiter: ;
Server version: 5.0.84-log Gentoo Linux mysql-5.0.84-r1
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 46 min 41 sec
Threads: 2 Questions: 897 Slow queries: 0 Opens: 86 Flush tables: 1 Open tables: 45 Queries per second avg: 0.320
Como você pode notar
Server characterset: utf8 <= Servidor esta com utf8
Db characterset: utf8 <= O banco que esta sendo usado no momento esta com utf8
Client characterset: latin1 <= Aqui é o pulo do gato o Cliente tem que ser o mesmo que o apache esta enviando, se estiver setado utf8 vai dar problema.
Conn. characterset: latin1 <= E a conexão também.
Mas como alterar isso ???
4º Alterando as configs do /etc/mysql/my.cnf – “Estou supondo que você esteja usando Linux, algumas distros de Linux podem mudar o diretório do arquivo de configuração, se você esta usando windows ou outro sistema operacional verifique onde fica o arquivo.”
[mysql]
character-sets-dir=/usr/share/mysql/charsets
#default-character-set=utf8 <=comentar as linhas com utf8 e inserir as linhas com latin1
default-character-set=latin1
[mysqladmin]
character-sets-dir=/usr/share/mysql/charsets
#default-character-set=utf8
default-character-set=latin1
[mysqlcheck]
character-sets-dir=/usr/share/mysql/charsets
#default-character-set=utf8
default-character-set=latin1
[mysqldump]
character-sets-dir=/usr/share/mysql/charsets
#default-character-set=utf8
default-character-set=latin1
[mysqlimport]
character-sets-dir=/usr/share/mysql/charsets
#default-character-set=utf8
default-character-set=latin1
[mysqlshow]
character-sets-dir=/usr/share/mysql/charsets
#default-character-set=utf8
default-character-set=latin1
5º Alterar as configs do /etc/php/apache2-php5/php.ini – “Estou supondo que você esteja usando Linux, algumas distros de Linux podem mudar o diretório do arquivo de configuração, se você esta usando windows ou outro sistema operacional verifique onde fica o arquivo.”
; As of 4.0b4, PHP always outputs a character encoding by default in
; the Content-type: header. To disable sending of the charset, simply
; set it to be empty.
;
; PHP’s built-in default is text/html
;default_mimetype = “text/html” <= comentar essa e descomentar a de baixo
default_charset = “iso-8859-1″
mais abaixo
; MySQL extensions default connection charset settings
mysql.connect_charset = latin1 <= descomentar essa
mysqli.connect_charset = latin1 <= e essa linha para setar o PHP para trabalhar com latin1
;pdo_mysql.connect_charset = utf8
6º Agora tudo ok e funcionando perfeitamente.
Até a próxima.




Comentários