Fazer consulta no MySQL e formatar ResultSet usando PHP e HTML

Uncategorized No Comments »

Dando continuidade ao ultimo post Pegar dados via POST e inserir no banco de dados MySQL com PHP.
Agora vamos mostrar os dados inseridos. Desta vez usei CSS para que o resultado fique um pouco melhor para visualizar.
Crie um arquivo com o nome listar.php e insira o código abaixo.

<?php
	// Fazendo a conexão com o servidor MySQL
	// mysql_pconnect("server", "login", "senha")
	$conexao = mysql_pconnect("localhost","root","root") or die('falha ao conectar');
	// Seleciona o banco de dados.
	mysql_select_db("test",$conexao) or die('falha ao selecionar db');

	// Executa Query.
	$sql = 'SELECT codigo, nome, preco, quantidade FROM tb_produtos';
	$result = mysql_query($sql);
?>
<html>
	<head>
	<title>Formulario de Produtos</title>
	<style type="text/css">
		table caption {
		color:#1E398D;
		padding:5px 0;
		text-align:left;
		text-transform:uppercase;
		}
		table thead {
		border:1px solid #D2D2D2;
		}

		table tbody {
		border:1px solid #D2D2D2;
		}

		table thead th {
		background:#EEECCC;
		border-left:1px solid #F0F0F0;
		height:45px;
		padding:5px;
		text-transform:uppercase;
		}

		table tbody td, table tbody th {
		font-family:Verdana,Arial,Helvetica,sans-serif;
		font-size:10px;
		padding:5px;
		text-transform:uppercase;
		}
	</style>
	</head>
	<body>
		<table cellspacing="0" summary="Resultados da lista de produtos." >
			<caption>Produtos</caption>
			<thead>
				<tr>
					<th>Código</th>
					<th>Nome</th>
					<th>Preço</th>
					<th>Quantidade</th>
				</tr>
			</thead>
			<tbody>
			<?php // Verifico se existe registros no banco.
			if(mysql_num_rows($result) > 0) {
				// Aqui é feita a busca de cada registro encontrado jogando o resultado em um array por nome de campo da tabela.
				while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
					// É possivel verificar todos os valores do  usando a função var_dump($row);
					// Basta tirar o comentario # para debugar.
					// a tag pre serve para pre formatar o texto - irá manter a quebra de linha e espaços. Facilita na hora de debugar.
					#echo '<pre>';
					#var_dump($row);
					#echo '</pre>';
				?>
				<tr>
					<td><?php echo $row['codigo']; ?></td>
					<td><?php echo $row['nome']; ?></td>
					<td><?php echo $row['preco']; ?></td>
					<td><?php echo $row['quantidade']; ?></td>
				</tr>
			<?php
				}
			} else { ?>
				<tr>
					<td colspan="4"><p>Nenhum registro encontrado.</p></td>
				</tr>
			<?php
			}
			// Libera toda a memória associada ao result.
			mysql_free_result($result);
			?>
			</tbody>
		</table>
	</body>
</html>

Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutorias aqui apresentados.

Pegar dados via POST e inserir no banco de dados MySQL com PHP

HTML, MySQL, PHP 1 Comment »

Exemplo básico para pegar valores via POST de um formulário HTML e inserir no banco de dados MySQL.

<?php
// Verifica se foi postado algo para inserir dados no banco.
if($_POST) {
// Fazendo a conexão com o servidor MySQL
// mysql_pconnect("server", "login", "senha")
$conexao = mysql_pconnect("localhost","root","root") or die('falha ao conectar');
// Verifica se o banco de dados existe antes de criar.
$query = 'CREATE DATABASE IF NOT EXISTS test';

if(!mysql_query($query,$conexao)) {
echo 'falha ao criar banco<br />';
die; // Com o die eu já paro de executar o script caso ocorra erro.
}

mysql_select_db("test",$conexao) or die('falha ao selecionar db');

// Verifica se a tabela existe antes de criar.
$query = "CREATE TABLE  IF NOT EXISTS tb_produtos (
pk_produtos int not null auto_increment primary key,
codigo     varchar(255),
nome       varchar(255),
preco      decimal(12,2),
quantidade int(11))";

if(!mysql_query($query,$conexao)) {
echo 'falha ao criar tabela<br />';
die; // Com o die eu já paro de executar o script caso ocorra erro.
}

// É possivel verificar todos os valores do POST usando a função var_dump($_POST);
// Basta tirar o comentario # para debugar.

// a tag pre serve para pre formatar o texto - irá manter a quebra de linha e espaços. Facilita na hora de debugar.
#echo '<pre>';
#var_dump($_POST); die;
#echo '</pre>';

/*Pego os valores do POST do formulario HTML e seto nas variaveis.
É necessario fazer a validação dos dados para evitar ataques SQL Injection ou HTML Injection quando estiver
em ambiente de produção.
Neste exemplo estou fazendo sem qualquer tipo de validação para simplificar o entendimento.*/
$codigo = $_POST['codigo'];
$nome = $_POST['nome'];
$preco = $_POST['preco'];
$quantidade = $_POST['quantidade'];

$query_insert = "INSERT INTO tb_produtos (codigo,nome,preco,quantidade) VALUES
('$codigo','$nome',$preco,$quantidade)";

if(mysql_query($query_insert,$conexao)) {
echo 'Dados inseridos com sucesso<br />';
} else {
echo 'falha ao inserir dados<br />';
}
// Caso POST false mostra HTML
} else {
?>
<html>
<head>
<title>Formulário de Produtos</title>
</head>
<body>
<form action="cadastrar.php" method="post">
<label for="codigo">
<span >Código</span>
<input id="codigo" class="text" type="text" value="" maxlength="255" title="Código" name="codigo" tabindex="1"/>
</label><br />
<label for="nome">
<span >Nome</span>
<input id="nome" class="text" type="text" value="" maxlength="255" title="Nome" name="nome" tabindex="2"/>
</label><br />
<label for="preco">
<span class="nameField">Preço</span>
<input id="preco" class="text" type="text" value="" maxlength="12" title="Preço" name="preco" tabindex="3"/>
</label><br />
<label for="quantidade">
<span class="nameField">Quantidade</span>
<input id="quantidade" class="text" type="text" value="" maxlength="11" title="Quantidade" name="quantidade" tabindex="4"/>
</label><br />
<label for="cadastrar">
<input type="submit" id="cadastrar" name="cadastrar" tabindex="5" value="cadastrar" />
</label>
</form>
</body>
</html>
<?php
}

?>

Caso tenha alguma duvida deixe um comentário que terei prazer em ajudar.
Comentários são bem vindos assim posso melhorar a qualidade dos tutorias aqui apresentados.

Simulação de Movimetação de Caixa - Procedure que consulta View e efetua Insert.

MySQL, SQL No Comments »

Hoje estou postando uma procedure que consulta uma View e faz um insert.
A View criada é para simular a movimentação do caixa do dia atual.
A Procedure ira fazer a consulta da movimentação do caixa através da View.
Caso a movimentação seja positiva e não conste registro de fechamento do caixa no dia atual um Insert com o valor da movimentação será executado.

No script abaixo será criado 3 tabelas (tb_cliente, tb_movimentacao e tb_caixa),
1 View (viewMovimentacao) e uma procedure(sp_fecha_caixa).

Na tabela tb_cliente consta os clientes que poderão efetuar a movimentação do caixa.
Na tabela tb_movimentacao consta os movimentos realizados pelos clientes.
Na tabela tb_caixa consta os registros de caixas fechados.
A View viewMovimentacao ira retornar todos os registros de movimentação do dia atual.
A Procedure sp_fecha_caixa ira executar a View pegar o valor da movimentação de hoje e irá
inserir este valor na tabela tb_caixa.

// Verifica se tabela existe. Caso Exista ele remove.
GO
DROP TABLE IF EXISTS tb_cliente;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_cliente (
pk_cliente	int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
nome varchar(60) not null,
cpf varchar(20) not null unique
) Engine =InnoDB;
//------------------------------------------------------------
// Insere os dados na tabela
GO
INSERT INTO tb_cliente (nome, cpf)
VALUES
('Joao',	'12345678910'),
('Paulo',	'12345678911'),
('Marcelo',	'12345678912'),
('Gabriel',	'12345678913'),
('Julio',	'12345678914')
//------------------------------------------------------------
// Caso a tabela não exista ele cria uma tabela.
GO
DROP TABLE IF EXISTS tb_movimentacao;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_movimentacao (
pk_saldo int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
fk_cliente  int(10) NOT NULL,
saldo decimal(10,2),
dt_cadastro timestamp default current_timestamp,
CONSTRAINT fk_cliente FOREIGN KEY (fk_cliente) REFERENCES produtos (pk_cliente)
)
//------------------------------------------------------------
// Insere os dados na tabela tb_movimentacao para simular movimentação do caixa.
GO
INSERT INTO tb_movimentacao (fk_cliente,saldo,dt_cadastro)
VALUES
(1,42, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(1,51, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(2,23, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(3,52, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,68, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(3,85, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(4,82, ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,110,ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,109,ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(5,116,ADDDATE( CURDATE(), INTERVAL 0 DAY)),
(5,129,ADDDATE( CURDATE(), INTERVAL 4 DAY))
//------------------------------------------------------------
// Caso a tabela não exista ele cria uma tabela.
GO
DROP TABLE IF EXISTS tb_caixa;
// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_caixa (
pk_caixa int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
saldo decimal(10,2),
dt_caixa timestamp default current_timestamp
)
//------------------------------------------------------------

// Caso a VIEW não exista ele cria uma tabela.
GO
DROP VIEW IF EXISTS viewMovimentacao;
// Agora é criada a VIEW que ira fazer a consulta das movimentações do dia.
GO
CREATE VIEW viewMovimentacao AS
SELECT
tb_cliente.pk_cliente AS fk_cliente,
tb_cliente.nome AS nome,
tb_cliente.cpf AS cpf,
tb_movimentacao.saldo AS saldo,
tb_movimentacao.dt_cadastro AS dt_cadastro
FROM tb_cliente
INNER JOIN tb_movimentacao ON (pk_cliente = fk_cliente)
WHERE dt_cadastro = CURDATE();

Agora vamos criar nossa Procedure para fechar o caixa do dia.

// Dropa a procedure se já existir.
GO
DROP PROCEDURE IF EXISTS sp_fecha_caixa;
// Cria procedure.
GO
CREATE PROCEDURE sp_fecha_caixa()
BEGIN
    DECLARE var_temp_saldo_dia decimal(10,2);
    DECLARE var_temp_registro decimal(10,2);
    //Pega o saldo da movimentacao de hoje.
    DECLARE cursorViewMovimentacao CURSOR FOR SELECT sum(saldo) as saldo_dia FROM viewMovimentacao;
    DECLARE cursorTabelaCaixa CURSOR FOR SELECT count(dt_caixa) as registro FROM tb_caixa WHERE dt_caixa = CURDATE();
    OPEN cursorViewMovimentacao;
    FETCH cursorViewMovimentacao INTO var_temp_saldo_dia;
    CLOSE cursorViewMovimentacao;
    //Pega os registros do caixa de hoje.
   OPEN cursorTabelaCaixa;
   FETCH cursorTabelaCaixa INTO var_temp_registro;
   CLOSE cursorTabelaCaixa;
    // Verifica se teve movimentacao no dia e se caixa já foi fechado.
    IF (var_temp_saldo_dia > 0 AND var_temp_registro = 0 ) THEN
        INSERT INTO tb_caixa(saldo,dt_caixa)
        VALUES  (var_temp_saldo_dia, CURDATE());
    ELSEIF (var_temp_registro > 0 ) THEN
        SELECT 'Caixa já foi fechado' AS Msg;
    ELSEIF (var_temp_saldo_dia <= 0 ) THEN
        SELECT 'Caixa com valor negativo' AS Msg;
    ELSE
        SELECT 'Erro ao executar' AS Msg;
    END IF;
END;

GO
call sp_fecha_caixa();

Agora vamos fazer um select para verificar se o valor foi inserido.

select * from tb_caixa

Exemplo de como criar uma View no MySQL. (Virtual Tables)

MySQL, SQL No Comments »

Neste Post irei mostrar como criar uma View para agilizar sua vida na hora de liberar consultar especificas sem ter medo dos usuários matem o banco na hora de criar uma consulta já conhecida.

Alguns benefícios das Views são:
Segurança no acesso de dados das tabalas.
Otimização das consultas.

A sintaxe basica para criar uma VIEW:

CREATE VIEW view_name AS select_statement

Para efetuar a consulta da VIEW é semelhande a consulta de uma TABLE:

SELECT fields FROM view_name

Neste exemplo vamos criar duas tabelas para executar nossa VIEW.
Uma tabela com clientes e outra com a movimentação de caixa deste cliente.
Copie o código abaixo e execute no banco de dados.

// Verifica se tabela existe. Caso Exista ele remove.
GO
DROP TABLE IF EXISTS tb_cliente; 

// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_cliente (
pk_cliente	int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
nome varchar(60) not null,
cpf varchar(20) not null unique
) Engine =InnoDB;

//------------------------------------------------------------

// Insere os dados na tabela
GO
INSERT INTO tb_cliente (nome, cpf)
VALUES
('Joao',	'12345678910'),
('Paulo',	'12345678911'),
('Marcelo',	'12345678912'),
('Gabriel',	'12345678913'),
('Julio',	'12345678914')

//------------------------------------------------------------

// Caso a tabela não exista ele cria uma tabela.
GO
DROP TABLE IF EXISTS tb_movimentacao;

// Caso a tabela não exista ele cria uma tabela.
GO
CREATE TABLE IF NOT EXISTS tb_movimentacao (
pk_saldo int(10) AUTO_INCREMENT NOT NULL PRIMARY KEY,
fk_cliente  int(10) NOT NULL,
saldo decimal(10,2),
dt_cadastro timestamp default current_timestamp,
CONSTRAINT fk_cliente FOREIGN KEY (fk_cliente) REFERENCES produtos (pk_cliente)
)

//------------------------------------------------------------

// Insere os dados na tabela
GO
INSERT INTO tb_movimentacao (fk_cliente,saldo,dt_cadastro)
VALUES
(1,42, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(1,51, ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(2,23, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,52, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(3,68, ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(3,85, ADDDATE( CURDATE(), INTERVAL 3 DAY)),
(4,82, ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(5,110,ADDDATE( CURDATE(), INTERVAL 1 DAY)),
(5,109,ADDDATE( CURDATE(), INTERVAL 2 DAY)),
(5,116,ADDDATE( CURDATE(), INTERVAL 3 DAY)),
(5,129,ADDDATE( CURDATE(), INTERVAL 4 DAY))

Agora vamos criar uma VIEW para efetuar a consulta de movimentação do cliente.
Para isso vamos usar as duas tabelas para a consulta da VIEW.

// Caso a VIEW não exista ele cria uma tabela.
GO
DROP VIEW IF EXISTS viewMovimentacao;
GO
CREATE VIEW viewMovimentacao AS
SELECT
tb_cliente.pk_cliente AS fk_cliente,
tb_cliente.nome AS nome,
tb_cliente.cpf AS cpf,
tb_movimentacao.saldo AS saldo,
tb_movimentacao.dt_cadastro AS dt_cadastro
FROM tb_cliente
INNER JOIN tb_movimentacao ON (pk_cliente = fk_cliente)

Executa a View.

// Efetua consulta View
GO
SELECT fk_cliente,nome,cpf,saldo,dt_cadastro FROM viewMovimentacao

Como pegar valor de uma sessão criada no Php e usar no Smarty e verificar se array esta vazio usando count e empty.

HTML, PHP, Smarty, Template No Comments »

O TESTE 1 e TESTE 3 me mostram o resultado do tipo inteiro já o segundo teste usando |count serve para dar display do resultado como uma string. Para o TESTE 2 funcionar como a saída é uma string se o resultado for
zero  o |count vai mostra (array).  Usando um |@count ele mostra zero (0).
Para funcionar a situação use @count != ‘0′ para resultado maior que zero e @count == ‘0′ para igual a zero.


<?php
#array cheio
$_SESSION['unidades'] = array('1','2','3','4');

#array vazio
//$_SESSION['unidades'] = array();
?>

TESTE : {if !empty($smarty.session.unidades)}
empty cheio 1 ({$smarty.session.unidades|@count })
{elseif empty($smarty.session.unidades)}
empty vazio 2 ({$smarty.session.unidades|@count })
{/if}
<br />
TESTE 2 : {if $smarty.session.unidades|@count != '0' }
|count  cheio 1 ({$smarty.session.unidades|@count})
{elseif $smarty.session.unidades|@count == '0' }
|count vazio 2 ({$smarty.session.unidades|@count})
{/if}

<br />
TESTE 3 : {if count($smarty.session.unidades) > 0 }
count cheio 1 ({$smarty.session.unidades|@count})
{elseif count($smarty.session.unidades) <= 0 }
count vazio 2 ({$smarty.session.unidades|@count})
{/if}

Sistema para Calcular Frete SEDEX e PAC a partir de CEP informado.

CSS, Expressões Regulares, HTML, Internet, Javascript, PHP, Sites 6 Comments »

Estava precisando calcular o envio de SEDEX para vender alguns produtos no mercado livre e fui procurar no Google se alguem já tinha criado algo para simplificar o calculo para agilizar para o usuário.
Entrei um código no fórum http://forum.prestashopbr.com e fiz alguma alterações para se encaixar no que eu precisava. Estou compartilhando o código.

Exemplo funcionando.

<?php

//script original pego em http://forum.prestashopbr.com/viewtopic.php?f=9&t=322&start=30

#####################################
# Código dos Serviços dos Correios  #
#    FRETE PAC = 41106       #
#    FRETE SEDEX = 40010       #
#    FRETE SEDEX 10 = 40215       #
#    FRETE SEDEX HOJE = 40290    #
#    FRETE E-SEDEX = 81019       #
#    FRETE MALOTE = 44105       #
#    FRETE NORMAL = 41017       #
#   SEDEX A COBRAR = 40045       #
#####################################
if($_POST) {
	// Código do Serviço que deseja calcular, veja tabela acima:
	if ($_POST['servico']) {
		$cod_servico = $_POST['servico'];
	}
	// CEP de Origem, em geral o CEP da Loja
	$cep_origem = '81010210';
	// CEP de Destino, você pode passar esse CEP por GET ou POST vindo de um formulário
	$cep_destino = $_POST['cep-destino'];
	// Peso total do pacote em Quilos, caso seja menos de 1Kg, ex.: 300g, coloque 0.300
	$peso = '0.300';
	// URL de Consulta dos Correios
	$correios = "http://www.correios.com.br/encomendas/precos/calculo.cfm?servico=".$cod_servico."&cepOrigem=".$cep_origem."&cepDestino=".$cep_destino."&peso=".$peso."&MaoPropria=N&avisoRecebimento=N&resposta=xml";

	// Capta as informações da página dos Correios
	$correios_info = file($correios);
	// Processa as informações vindas do site dos correios em um Array
	foreach($correios_info as $info){
	   // Busca a informação do Preço da Postagem
	   if(preg_match("/\<preco_postal>(.*)\<\/preco_postal>/",$info,$tarifa)){

	      // Quando encontra o valor da postagem, exibe na página formatando em padrão de moeda 10,89
	      $numbre = number_format($tarifa[1],2,',','.');

	      // Caso você não queira formatar, será exibido assim 10.89 e basta executar o comando abaixo
	      $total = $tarifa[1];
	      // Você utilizará um ou outro método acima para exibição dos dados
	   }
	}
	echo $numbre;
} else {
?>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js" type="text/javascript"></script>
<script type="text/javascript">
     function submitForm(form) {
         /*
         usa método request() da classe Form da prototype, que serializa os campos
         do formulário e submete (por POST como default) para a action especificada no form
         */
         form.request({
           onComplete: function(transport){
             /*
             se o retorno for diferente de -1, entende-se que não houve problemas, então apaga-se
             os campos do formulário usando o método reset() da classe Form
             */  

				if(transport.responseText !=-1)  {
					$('value').innerHTML = 'Valor do frete: ' + transport.responseText;
				} else {
					form.reset();
					$('value').innerHTML = 'Erro ao consultar';
                }
             }
         });
         return false;
	} 

</script>
<style type="text/css">

* {
font-family:"Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:12px;
font-size-adjust:none;
font-style:normal;
font-variant:normal;
font-weight:normal;
line-height:normal;
}

body {
	background:#FFFFFF none repeat scroll 0 0;
	height:100%;
	margin:0;
	margin-top:20px;
	width:100%;
}

div#wrapper {
	margin:auto;
	position:relative;
	width:450px;
	z-index:0;
}

.formMain .select {
	text-transform:uppercase;
	width:99%;
	border:1px solid #B6B6B6;
	display:block;
}

.formSearch fieldset {
border:1px solid #CCCCCC;
margin:0;
padding:0 10px;
}

.formMain label {
display:block;
float:left;
margin-right:4px;
padding-bottom:5px !important;
}

.formMain legend {
color:#1E398D;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
padding:10px 5px;
}

.formMain .button {
background:#F5EED3;
border:1px solid #CCCCCC;
color:#666666;
cursor:pointer;
font-size:12px;
font-weight:bold;
letter-spacing:1px;
margin:10px 0 0;
overflow:visible;
text-transform:uppercase;
width:100%;
}

.formMain .inline {
margin:15px 0 0 !important;
}

.formMain .text, .formMain .select, .formMain .textarea, .formMain .password {
border:1px solid #B6B6B6;
display:block;
text-transform:uppercase;
}

.formMain fieldset span.nameField {
color:#666666;
text-transform:uppercase;
}

h3 {
border-bottom:1px solid #F58220;
margin:0;
padding:0;
}

h3 span {
-x-system-font:none;
color:#1E398D;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
font-size-adjust:none;
font-stretch:normal;
font-style:normal;
font-variant:normal;
font-weight:bold;
line-height:normal;
}

#value {
-x-system-font:none;
color:#9B0000;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
font-size-adjust:none;
font-stretch:normal;
font-style:normal;
font-variant:normal;
font-weight:bold;
line-height:normal;
}
</style>

</head>
<body>
<div id="wrapper">
	<h3>
	<span>Pesquisa valor de frete</span>
	</h3>
	<form id="form-pesquisa-repasse" action="" method="post" class="formMain formSearch wsizep100" onsubmit="submitForm(this); return false;">
		<fieldset>
			<legend>Filtrar Referência</legend>
			<label for="servico" class="wsize015">
				<span class="nameField">Envio</span>
				<select id="servico" name="servico" title="Serviços dos Correios" class="select" tabindex="1">
						<option value="41106">PAC</option>
						<option value="40010">SEDEX</option>
						<option value="40215">SEDEX 10</option>
						<option value="40290">SEDEX HOJE </option>
				</select>
			</label>
			<label class="wsize010" for="cep-destino">
			<span class="nameField">CEP destino</span>
			<input id="cep-destino" class="text" type="text" value="" maxlength="8" title="CPF destino" name="cep-destino" tabindex="2"/>
			</label>
			<label for="pesquisar" class="wsize010">
				<input type="submit" id="pesquisar" name="pesquisar" tabindex="3" class="button inline"  value="Pesquisar" />
			</label>
		</fieldset>
	</form>
	<span id="value"></span>
</div>
</body>
</html>
<?php
} // fim else
?>

Converter XML para arquivo CSV - XML2CSV

CSV, PHP, XML No Comments »

Atendendo a solicitação de um visitante do blog criei este tutorial com os princípios básicos para converter um arquivo XML em CSV.

Crie um arquivo com o nome produtos.xml e insira o código abaixo.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalogo>
	<produto id='p1'>
		<nome>Caderno</nome>
		<preco>2,00</preco>
		<quantidade>100</quantidade>
	</produto>
	<produto id='p2'>
		<nome>Caneta</nome>
		<preco>1,00</preco>
		<quantidade>200</quantidade>
	</produto>
	<produto id='p3'>
		<nome>Lapis</nome>
		<preco>0,50</preco>
		<quantidade>50</quantidade>
	</produto>
	<produto id='p4'>
		<nome>Livro Matematica</nome>
		<preco>11,00</preco>
		<quantidade>10</quantidade>
	</produto>
	<produto id='p5'>
		<nome>Apontador</nome>
		<preco>1,00</preco>
		<quantidade>20</quantidade>
	</produto>
</catalogo>

É necessário criar um diretório com o nome csv e dar permissão de leitura e escrita antes de executar o código.

Crie um arquivo com nome xml2csv.php e coloque o código abaixo.

<?php

$doc = new DomDocument;
// Carrega o arquivo XML com um arquivo DOMDocument
$doc->Load('produtos.xml');
// Defino o nome do elemento pai (root).
$root = $doc->getElementsByTagName('produto');
// Defino o nome dos elementos filhos no arquivo XML que eu desejo.
$children = array('nome','preco','quantidade');
$cvs = NULL;
// Crio o cabeçalho do arquivo CSV com o nome de todos os campos.
$cvs .= "codigo,nome,preco,quantidade";
// Quebra de linha do arquivo CSV.
$cvs .= "\n";

// Faço um loop para pegar todos os elementos pai (root) encontrados.
for ($i=0; $i < $root->length; $i++) {

	// Pega o valor do atributo do elemento pai  (root).
    $id =  $root->item($i)->getAttribute('id');
    // Irei dar um escape em todos os valores usando aspas duplas.
	$cvs .= '"' . $id . '",';
    // Busca por elementos filhos (child) definidos no array
    $valor = array();
    foreach ($children as $child) {
         $valor[] = '"' . $root->item($i)->getElementsByTagName($child)->item(0)->nodeValue . '"';
    }
    // Uso o implode para criar uma string com os valores separados por vírgula.
     $cvs .= implode(',', $valor);
    // Quebra de linha do arquivo CSV.
    $cvs .="\n";
}

// getcwd() retorna o diretório atual.
$caminho = getcwd(). '/csv/';
$data = date('d_m_y_H_i_s');
$file_path = $caminho.$data.'_lista.csv';

// Verifique se vc tem permissão de leitura e escrita neste diretorio
if(fwrite($file=fopen($file_path,'w+'),$cvs)) {
  fclose($file);
  echo "Arquivo gravado com sucesso!";
} else {
  echo "Erro ao abrir arquivo!";
}

?>

Estrutura básica de um arquivo XML.

XML No Comments »

Estrutura básica de um arquivo XML.

A primeira linha é o cabeçalho do arquivo XML.
Neste caso estou usando o encoding UTF-8.
Os documentos XML tem um estrutura em árvore.

Todos os arquivos XML sempre terão um elemento raiz (root element).
Este elemento é o pai dos outros elementos.
Os elementos a seguir são os filhos (child element).

Exemplo da estrutura básica de um arquivo XML.

<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
</child>
</root>

Dentro da tag dos elementos é possível definir atributos.
Neste exemplo o nome do atributo criado é o id do produto.

<?xml version="1.0" encoding="UTF-8"?>
<catalogo>
<produto id='p1'>
<nome>Caderno</nome>
<preco>2,00</preco>
<quantidade>100</quantidade>
</produto>
<produto id='p2'>
<nome>Caneta</nome>
<preco>1,00</preco>
<quantidade>200</quantidade>
</produto>
<produto id='p3'>
<nome>Lapis</nome>
<preco>0,50</preco>
<quantidade>50</quantidade>
</produto>
</catalogo>

Gravar arquivos de log ao executar comandos SQL no PHP.

MySQL, PHP, SQL, XML No Comments »

No código a seguir segue um exemplo de como ler um arquivo XML e gravar os dados no banco de dados MySQLe gerar um log da query executada.
Neste exemplo costa apenas as funções de INSERT, DELETE, UPDATE e SELECT.
Para facilitar a vida eu já deixei no código as query para criar o banco e as tabelas utilizadas para executar o código. Eu deixei os valores default de conexão com o MySQL altere os dados da conexão caso esteja usando outra configuração.
A idéia de criar um log das querys executadas no sistema servem para detectar erros e também como um registro caso alguem valor tenha sito movimentado de forma errada.

<?php
// Fazendo a conexão com o servidor MySQL

//Caso queira apenas criar o arquivo XML mude valor para false.
$ativar_conexao = true;

if ($ativar_conexao == true) {
	// mysql_pconnect("server", "login", "senha")
	$conexao = mysql_pconnect("192.168.1.210","root","dj@jdl#.") or die('falha ao conectar');
	// Verifica se o banco de dados existe antes de criar.
	$query = 'CREATE DATABASE IF NOT EXISTS test';

	if(!mysql_query($query,$conexao)) {
	    echo 'falha ao criar banco<br />';
	}

	mysql_select_db("test",$conexao) or die('falha ao selecionar db');

	// Verifica se a tabela existe antes de criar.
	$query = "CREATE TABLE  IF NOT EXISTS tb_produtos (
					pk_produtos int not null auto_increment primary key,
		            codigo     varchar(255),
		            nome       varchar(255),
		            preco      decimal(12,2),
		            quantidade int(11))";

	if(!mysql_query($query,$conexao)) {
	    echo 'falha ao criar tabela<br />';
	}
}
// Fim comentario

$doc = new DomDocument;
// Carrega o arquivo XML com um arquivo DOMDocument
$doc->Load('produtos.xml');
$items = $doc->getElementsByTagName('produto');
// Defino o nome tags no arquivo XML que eu desejo.
$campos = array('nome','preco','quantidade');
$query = NULL;
$query .= "insert into tb_produtos (codigo,nome,preco,quantidade) values ";
for ($i=0; $i < $items->length; $i++) {
    $value = NULL;
    $value .= " (";
    $codigo = $items->item($i)->getAttribute('id');
    $value .= "'$codigo',";
    echo $items->item($i)->getAttribute('id') , '<br />';
    // Busca por elementos definidos no array
    $valor = array();
    foreach ($campos as $campo) {
         $dado = "'" . $items->item($i)->getElementsByTagName($campo)->item(0)->nodeValue . "'";
         // Verifico se o campo é preco pq no arquivo xml o preço esta com virgula e para inserir no banco é necessario ponto
         if($campo == 'preco') {
         	// Faz a troca de virgula por ponto.
         	$dado = str_replace(',','.',$dado);
         }
         // pego o valor de cada tag e adiciono em um array para fazer o insert no banco.
        $valor[] = $dado;
        echo $items->item($i)->getElementsByTagName($campo)->item(0)->tagName , ': ';
        echo $items->item($i)->getElementsByTagName($campo)->item(0)->nodeValue , '<br />';

    }
    // uso o implode para criar uma string com os valores separados por vírgula.
    $value .= implode(',', $valor);
    $value .= ') ';
    // Adiciono os dados do valores do insert em array.
    $values[] = $value;

    echo '<hr>';
}
 // uso o implode para criar uma string com os valores separados por vírgula.
$query .= implode(',', $values);

// mostra a query criada na tela.
echo $query;

if ($ativar_conexao == true) {

	// GRAVA LOG do arquivo executado mesmo se query estiver errada.
	if((stristr($query, 'DELETE') || stristr($query, 'UPDATE') || stristr($query, 'INSERT')  || stristr($query, 'SELECT'))) {

		// Verifica se a tabela existe antes de criar.
		$query_log = "CREATE TABLE IF NOT EXISTS tb_log (
						    pk_log int not null auto_increment primary key,
						    tx_sql text,
						    acao ENUM('DELETE', 'UPDATE', 'INSERT','SELECT')
							);";

		if(!mysql_query($query_log,$conexao)) {
		    echo 'falha ao criar tabela<br />';
		}

		if(stristr($query, 'DELETE')) {
	        $acao = 1;
	    } elseif(stristr($query, 'UPDATE')) {
	        $acao = 2;
	    } elseif(stristr($query, 'INSERT')) {
	        $acao = 3;
	    } elseif(stristr($query, 'SELECT')) {
	        $acao = 4;
	    }

		$query_log = "INSERT INTO tb_log (tx_sql,acao) VALUES
							 (\"$query\",$acao)";

		if(!mysql_query($query_log,$conexao)) {
		    echo 'falha ao inserir dados de log<br />';
		}

	}

	if(!mysql_query($query,$conexao)) {
	    echo 'falha ao inserir dados<br />';
	}
}

Crie um arquivo produtos.xml em um editor de texto e coloque o código abaixo.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalogo>
	<produto id='p1'>
		<nome>Caderno</nome>
		<preco>2,00</preco>
		<quantidade>100</quantidade>
	</produto>
	<produto id='p2'>
		<nome>Caneta</nome>
		<preco>1,00</preco>
		<quantidade>200</quantidade>
	</produto>
	<produto id='p3'>
		<nome>Lapis</nome>
		<preco>0,50</preco>
		<quantidade>50</quantidade>
	</produto>
	<produto id='p4'>
		<nome>Livro Matematica</nome>
		<preco>11,00</preco>
		<quantidade>10</quantidade>
	</produto>
	<produto id='p5'>
		<nome>Apontador</nome>
		<preco>1,00</preco>
		<quantidade>20</quantidade>
	</produto>
</catalogo>

Pesquisar dados dentro de um campo tipo text e migrar de uma tabela para outra usando insert, update com subselect

MySQL, SQL No Comments »

Cria as tabelas.


create table
    tb_comentario (
        pk_comentario int not null auto_increment primary key,
        tx_comentario text
    )

create table
    tb_data_comentario (
        pk_data_comentario int not null auto_increment primary key,
        dt_comentario date
    )

Faz o insert dos dados para teste.


insert  into tb_comentario (tx_comentario)
values
('Tutorial de procura e migração de dados no MySql DATA=20090515 (YYYYMMDD)'),
('Tutorial de procura e migração de dados no MySql DATA=20090516 (YYYYMMDD)'),
('Tutorial de procura e migração de dados no MySql DATA=20090517 (YYYYMMDD)')

Verifica se tabela recebeu os dados do insert.

select * from tb_comentario
WHERE tx_comentario is not null

Pesquisar dados dentro de um campo tipo text para pegar somente a data.


SELECT DATE(CONCAT(SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +5,4) , "-" , SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +9,2) , "-" , SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +11,2)))
FROM tb_comentario
WHERE  tx_comentario is not null

Faz o Insert dos dados da tabela tb_comentario para tb_data_comentario.


INSERT INTO tb_data_comentario (pk_data_comentario,dt_comentario)
SELECT
pk_comentario ,
DATE(CONCAT(SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +5,4) , "-" , SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +9,2) , "-" , SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +11,2))) as date
FROM tb_comentario
WHERE  tx_comentario is not null

Faz o Update dos dados da tabela tb_comentario.

UPDATE tb_data_comentario
SET
dt_comentario = (SELECT DATE(CONCAT(SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +5,4) , "-" , SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +9,2) , "-" , SUBSTRING(tx_comentario,INSTR(tx_comentario, 'DATA=') +11,2))) + INTERVAL 3 DAY as date
FROM tb_comentario
WHERE tx_comentario is not null and pk_data_comentario = pk_comentario )

Verifica se os dados foram atualizados.

select * from tb_data_comentario
Designed by NattyWP Wordpress Themes.
Images by desEXign.