Como efetuar a instalação do LiveZilla usando MySQL.

Ferramentas, MySQL, PHP 6 Comments » Marcelo Korjenioski

Assim como hoje não é mais neces­sá­rio você desen­vol­ver um Blog por causa do Word­press acre­dito que criar um Chat de suporte para seu site tam­bém esta dei­xando de ser gra­ças ao LiveZilla.

Neste tuto­rial vou mos­trar como ins­ta­lar o Live­Zilla usando MySQL, PHP e WinXP.
O pro­cesso é rápido é vai dei­xar seu chefe e cli­ente con­ten­tes.
O pri­meiro passo é bai­xar o Live­Zilla aqui (http://livehelp.livezilla.net/downloads/en/).
Tenha o  MySql e PHP ins­ta­lado reco­mendo usar o Wamp para efe­tuar o teste (http://www.wampserver.com/en/).

Para ins­ta­lar não tem segredo é next, next finish.
Depois de ins­ta­lar ele vai criar dois ata­lhos na área de tra­ba­lho o Live­Zilla Cli­ent e o Live­Zilla Ser­ver Admin.

Vamos abrir o Live­Zilla Ser­ver Admin para con­fi­gu­rar nosso Chat.
Sele­ci­one “Cre­ate new Live­Zilla Ser­ver” e cli­que no botão Next.

LiveZilla Server Admin

Vai sur­gir uma tela para você criar uma conta Admin no sis­tema.
Pre­en­cha os cam­pos como no exem­plo e cli­que no botão Next.

criar_admin

Na pró­xima tela mos­tra um for­mu­lá­rio para criar o pri­meiro grupo de suporte para o Chat. Depois é pos­sí­vel criar mais gru­pos de suporte.
Pre­en­cha os cam­pos como no exem­plo e cli­que no botão Next.

criar_grupo_suporte

Agora che­gou a hora de gerar os arquivo PHP do Chat.
Você tem a opção de enviar via FTP ou extrair local­mente.
Eu no exem­plo uso o Wamp então enviei direto para meu dir www/livezilla.
Esco­lha sua opção e cli­que em Next.

exportar_arquivos_chat

Apos enviar o arquivo surge a tela para tes­tar a ins­ta­la­ção do Live­Zilla.
Basta infor­mar o nome da cone­xão com o ser­ver e sua URL.
Cli­que no botão Ser­ver Test se esti­ver ok

testar_chat

Agora cli­que no botão test e digite o nome de usuá­rio e senha que foi cri­ado para o Admin e cli­que no botão Ok para ini­ciar o teste.

server_test

Se o teste ocor­reu com sucesso cli­que no botão Ser­ver­page e você verá esta pagina.

pagina_livezilla

Feche a janela de Test e cli­que em Next para con­fi­gu­rar o MySQL.

Pre­en­cha os cam­pos como no exem­plo e cli­que no botão Cre­ate Tables.
Caso tenha algum ao criar as tabe­las cli­que no link Show SQL Dump e exe­cute direto no seu BD.

data_management

Se a cone­xão esti­ver cor­reta cli­que em Next e para fina­li­zar a configuração.

wizard_completd

Agora vamos cli­car no ata­lho Live­Zilla Cli­ent para ini­ciar o aten­di­mento do Chat.
Entre com o nome de usuá­rio e senha cri­a­dos para o Admin e seu Chat já esta funcionando.

client_login

Abra o nave­ga­dor e digite a URL do ser Live­Zilla no meu caso http://localhost/livezilla/
Cli­que no link Start Demo Chat.
Pre­en­cha os cam­pos como no exem­plo e cli­que em ini­ciar Chat.

usario_login_chat

Agora no Live­Zilla Cli­ent vai sur­gir uma soli­ci­ta­ção para ini­ciar o Chat.
Cli­que em Accept Request e iniciar.

usario_login_chat_request

A ins­ta­la­ção esta feita agora basta explo­rar o Live­Zilla pois exis­tem mui­tas opções para faci­li­tar o tra­ba­lho do pes­soal do suporte.

Em um post futuro irei comen­tar estas fun­ções.
Caso tenha alguma duvida ou suges­tão deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apre­sen­ta­dos.
É isso pes­soal uma ótimo final de semana e até o pró­ximo post.

Tags: , ,

Criar função no PostgreSQL GROUP_CONCAT equivalente ao GROUP_CONCAT MySQL

MySQL, PostgreSQL 1 Comment » Marcelo Korjenioski

Hoje estava pre­ci­sando con­ca­te­nar dados de um campo e des­co­bri que no Post­greSQL não existe uma fun­ção equi­va­lente ao group_concat do MySQL.

Exem­plo do MySQL

select GROUP_CONCAT(nome ORDER BY nome DESC SEPARATOR ',') as nomes from usuarios

Então pro­cu­rando na web encon­trei esta função.

MS SQL to Post­gre SQL


create aggregate array_accum (
sfunc = array_append,
basetype = anyelement,
stype = anyarray,
initcond = '{}'
);

CREATE OR REPLACE FUNCTION _group_concat(text, text)
RETURNS text AS $$
SELECT CASE
WHEN $2 IS NULL THEN $1
WHEN $1 IS NULL THEN $2
ELSE $1 operator(pg_catalog.||) ',' operator(pg_catalog.||) $2
END
$$ IMMUTABLE LANGUAGE SQL;

CREATE AGGREGATE group_concat (
BASETYPE = text,
SFUNC = _group_concat,
STYPE = text
);

Para exe­cu­tar a fun­ção basta usar.

select group_concat(distinct nome) as nomes from usuarios

Caso tenha alguma duvida ou suges­tão deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

É isso pes­soal uma ótima semana e até o próximo post.

Importar dados apartir de uma URL e gerar SQL para inserir dados em BD MySQL ou PostgreSQL

Expressões Regulares, HTML, MySQL, PHP, SQL, Sites 3 Comments » Marcelo Korjenioski

Seguindo outros tuto­ri­ais sobre como impor­tar dados, desta vez vamos fazer um script para cap­tu­rar dados de uma pagina HTML e gerar um SQL de insert.  Nesta pes­quisa estou pro­cu­rando por links den­tro de uma deter­mi­nada Tag. Estou usando o ID dos ele­men­tos como refe­rên­cia. Veja a impor­tân­cia de não repe­tir os IDs dos ele­men­tos.  Chega de con­versa e vamos direto ao ponto.


<?php
header("Content-Type: text/html; charset=UTF-8");
// URL que irei pegar os links
$url = "http://pt.wikipedia.org/wiki/Categoria:Especialidades_m%C3%A9dicas";
$conteudo = null;
// Abro conexão de leitura.
$conecurl = @fopen("$url","r") or die ('<center>erro na conexão<br><b>informe o administrador erro 15 </b></center>');
while(!feof($conecurl)) {
$conteudo .= fgets($conecurl,4096);
}
// Fecho conexão.
fclose($conecurl);
// Aqui vou informar a primeira tag para o filtro do HTML eu peguei um elemento com id por ser unico no HTML.
$inicio = strpos($conteudo,'<div id="mw-subcategories">');
// Pego outro elemento com id para finalizar o range de busca.
$fim = strpos($conteudo,'<div id="mw-pages">');
// Pegamos a posição final menos a inicial para ver quanto iremos pular.
$quantopula = $fim - $inicio ;
$conteudo = substr($conteudo, $inicio ,$quantopula);

function pegaLink($html){
// ER para pegar todas as tags de links.
$er = "/<a.*?href=(\".*?\"|[A-Za-z0-9_]*?).*?>.*?<\/a>/";
preg_match_all($er,$html,$links);
$link = $links[0];
return $link;
}

function pegaNomeLink($url){
// ER para pegar o nome da tag de link.
$label = str_replace("</a>","",preg_replace("/^<a.*?>/","",$url));
return $label;
}
// Pego um array com todos os links
$links = pegaLink($conteudo);
$query = NULL;
// Inicio da query.
$query .= "insert into especialidades (nome) values ";
// Faço um loop para fazer o insert de cada item.
foreach ($links as $value) {
$item = '(';
// Removo o link e pego apenas o nome.
$item .= "'".pegaNomeLink($value)."'";
$item .= ')';
$values[] = $item;
}
// Transformo o Array em uma String.
$query .= implode(',', $values);
echo $query;
?>

Caso tenha alguma duvida deixe um comen­tário que terei pra­zer em aju­dar.
Comen­tários são bem vin­dos assim posso mel­ho­rar a qual­i­dade dos tuto­ri­ais aqui apresentados.

É isso pes­soal tenham uma ótima semana e até o pró­ximo post.

Fazer conexão no MySQL usando Visual C++ 2005 Express Edition

C++, MySQL, Visual C++ No Comments » Marcelo Korjenioski

Come­cei a me aven­tu­rar no mundo do Visual C++ semana pas­sada e de cara tive difi­cul­dade para fazer uma cone­xão com o que­rido MySQL por este motivo criei este
rápido tutorial.

O pri­meiro passo é bai­xar e ins­ta­lar MySQL .NET e ODBC Con­nec­tors para  cone­xão com .NET

ODBC Dri­ver

.NET Data Pro­vi­der Driver

Depois crie um banco e uma tabela no MySQL para fazer um teste.

Crie um novo pro­jeto no Visual C++ -> CLR -> Win­dows Forms Appli­ca­tion e colo­que um nome.

Com o pro­jeto cri­ado vamos adi­ci­o­nar uma referencia.

Vá no Solu­tion Explo­rer cli­que com o botão direito em cima do nome do pro­jeto e vá em References…

Agora em Com­mon Pro­per­ties -> Refe­ren­ces cli­que no botão Add New Reference…

Cli­que na aba Browse e vá no dire­to­rio onde foi ins­ta­lado o MySQL Con­nec­tor .Net e Add a MySql.Data.dll
O cami­nho padrão é “C:\Arquivos de programas\MySQL\MySQL Con­nec­tor Net 6.1.0\Assemblies”

Com a Refe­rence MySql.Data adi­ci­o­nada basta usar ela no projeto.

No pro­jeto padrão irá ter um arquivo Form1.h vá no modo Form1.h[Design] e abra Tool­box adi­ci­one um but­ton e um DataGrid

O Data­Grid não vai esta ati­vado por padrão para adi­ci­o­nar ele no Tool­box cli­que com o botão direito em cima de um com­po­nente e vá em Cho­ose Items…
Agora mar­que o com­po­nente da coluna Name Data­Grid com names­pace System.Windows.Forms.

Dê um duplo cli­que no but­ton e vai abrir o Form1.h com uma fun­ção para o button.

Adi­ci­one o código abaixo e con­fi­gure con­forme seu ser­vi­dor esta setado.


String^ strcon = "database = test; data source = localhost; user id = root; password =";
MySqlConnection^ mycon = gcnew MySqlConnection(strcon);

String^ sqlquery = "select * from tb_imagem";
MySqlDataAdapter^ myadp = gcnew MySqlDataAdapter(sqlquery, mycon);

DataSet^ myds = gcnew DataSet();

myadp->Fill(myds,"tb_imagem");
dataGrid1->DataSource = myds->Tables["tb_imagem"]->DefaultView;
dataGrid1->SetDataBinding(myds, "tb_imagem");

No ini­cio do arquivo Form1.h você encon­trara varios names­pa­ces adi­ci­o­na­dos inclua agora o names­pace do MySql


using namespace MySql::Data::MySqlClient;

Agora aperte F5 para ini­ciar o Debug.  Se não tiver erro vai com­pi­lar e exe­cu­tar.
Estou come­çando no C++ então se encon­trar alguma difi­cul­dade para fazer algo vou esta pos­tando aqui.

Criar Trigger no MySQL.

MySQL, SQL No Comments » Marcelo Korjenioski

É pos­si­vel defi­nir TRIGGERS para serem dis­pa­ra­dos antes (BEFORE) ou depois (AFTER)
de um evento DML(Data Mani­pu­la­tion Lan­guage) INSERT, UPDATE, DELETE ou REPLACE.
Para pegar os valo­res dos cam­pos nas Trig­gers usa­mos OLD.nome_do_campo e NEW.nome_do_campo.
Quando exclui­mos o regis­tro pega­mos o valor usando OLD.nome_do_campo e quando vamos adi­ci­o­nar
um regis­tro usa­mos NEW.nome_do_campo.
Abaixo regra do uso de OLD e NEW:
Delete usa­mos somente OLD.nome_do_campo.
Insert somente NEW.nome_do_campo
UPDATE pode­mos usar OLD.nome_do_campo e NEW.nome_do_campo.

Vou criar duas tabe­las para migrar os dados de uma tabela para outro usando TRIGGERS.


GO
CREATE TABLE IF NOT EXISTS tb_comentario (
pk_comentario    int(11) AUTO_INCREMENT NOT NULL,
tx_comentario    text NULL,
PRIMARY KEY(pk_comentario)
)
GO
CREATE TABLE IF NOT EXISTS tb_comentario_historico (
pk_comentario_historico    int(11) AUTO_INCREMENT NOT NULL,
fk_comentario              int(11) NOT NULL,
tx_comentario              text NULL,
PRIMARY KEY(pk_comentario_historico)

Vamos criar a pri­meira Trig­ger para dis­pa­rar apos fazer o Insert na tabela tb_comentario.


go
DROP TRIGGER IF EXISTS trigger_insert_comentario_historico
go
CREATE TRIGGER  trigger_insert_comentario_historico AFTER INSERT ON tb_comentario
FOR EACH ROW
BEGIN
INSERT INTO tb_comentario_historico SET fk_comentario = NEW.pk_comentario, tx_comentario = NEW.tx_comentario;
END
go
insert into tb_comentario set tx_comentario = 'insert trigger'
go
select * from tb_comentario
go
select * from tb_comentario_historico

Agora vamos criar uma Trig­ger para dele­tar o regis­tro da tb_comentario_historio caso seja dele­tado o regis­tro na tb_comentario.


go
DROP TRIGGER IF EXISTS trigger_delete_comentario_historico
go
CREATE TRIGGER trigger_delete_comentario_historico BEFORE DELETE ON tb_comentario
FOR EACH ROW
BEGIN
DELETE FROM tb_comentario_historico WHERE fk_comentario = OLD.pk_comentario;
END
go
delete from tb_comentario where pk_comentario = 21
go
select * from tb_comentario
go
select * from tb_comentario_historico

A ultima Trig­ger será para fazer o Update na tb_comentario_historio caso seja feita alguma mudança na tb_comentario.


go
DROP TRIGGER IF EXISTS trigger_update_comentario_historico
go
CREATE TRIGGER trigger_update_comentario_historico BEFORE UPDATE ON tb_comentario
FOR EACH ROW
BEGIN
UPDATE tb_comentario_historico SET tx_comentario = NEW.tx_comentario WHERE fk_comentario = NEW.pk_comentario;
END
go
update tb_comentario set tx_comentario = 'teste trigger update 2' where pk_comentario= 22
go
select * from tb_comentario
go
select * from tb_comentario_historico

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Fazer consulta no MySQL e formatar ResultSet usando PHP e HTML

CSS, HTML, MySQL, PHP, SQL 1 Comment » Marcelo Korjenioski

Dando con­ti­nui­dade ao ultimo post Pegar dados via POST e inse­rir no banco de dados MySQL com PHP.
Agora vamos mos­trar os dados inse­ri­dos. Desta vez usei CSS para que o resul­tado fique um pouco melhor para visu­a­li­zar.
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 comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

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

HTML, MySQL, PHP 1 Comment » Marcelo Korjenioski

Exem­plo básico para pegar valo­res via POST de um for­mu­lá­rio HTML e inse­rir 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 comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­rias aqui apresentados.

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

MySQL, SQL 1 Comment » Marcelo Korjenioski

Hoje estou pos­tando uma pro­ce­dure que con­sulta uma View e faz um insert.
A View cri­ada é para simu­lar a movi­men­ta­ção do caixa do dia atual.
A Pro­ce­dure ira fazer a con­sulta da movi­men­ta­ção do caixa atra­vés da View.
Caso a movi­men­ta­ção seja posi­tiva e não conste regis­tro de fecha­mento do caixa no dia atual um Insert com o valor da movi­men­ta­ção será executado.

No script abaixo será cri­ado 3 tabe­las (tb_cliente, tb_movimentacao e tb_caixa),
1 View (view­Mo­vi­men­ta­cao) e uma procedure(sp_fecha_caixa).

Na tabela tb_cliente consta os cli­en­tes que pode­rão efe­tuar a movi­men­ta­ção do caixa.
Na tabela tb_movimentacao consta os movi­men­tos rea­li­za­dos pelos cli­en­tes.
Na tabela tb_caixa consta os regis­tros de cai­xas fecha­dos.
A View view­Mo­vi­men­ta­cao ira retor­nar todos os regis­tros de movi­men­ta­ção do dia atual.
A Pro­ce­dure sp_fecha_caixa ira exe­cu­tar a View pegar o valor da movi­men­ta­ção de hoje e irá
inse­rir 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 tb_cliente (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 Pro­ce­dure 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 veri­fi­car se o valor foi inserido.

select * from tb_caixa

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

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

MySQL, SQL No Comments » Marcelo Korjenioski

Neste Post irei mos­trar como criar uma View para agi­li­zar sua vida na hora de libe­rar con­sul­tar espe­ci­fi­cas sem ter medo dos usuá­rios matem o banco na hora de criar uma con­sulta já conhecida.

Alguns bene­fí­cios das Views são:
Segu­rança no acesso de dados das taba­las.
Oti­mi­za­ção das consultas.

A sin­taxe basica para criar uma VIEW:

CREATE VIEW view_name AS select_statement

Para efe­tuar a con­sulta da VIEW é seme­lhande a con­sulta de uma TABLE:

SELECT fields FROM view_name

Neste exem­plo vamos criar duas tabe­las para exe­cu­tar nossa VIEW.
Uma tabela com cli­en­tes e outra com a movi­men­ta­ção de caixa deste cli­ente.
Copie o código abaixo e exe­cute 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 efe­tuar a con­sulta de movi­men­ta­ção do cli­ente.
Para isso vamos usar as duas tabe­las para a con­sulta 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)

Exe­cuta a View.

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

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Gravar arquivos de log ao executar comandos SQL no PHP.

MySQL, PHP, SQL, XML 2 Comments » Marcelo Korjenioski

No código a seguir segue um exem­plo de como ler um arquivo XML e gra­var os dados no banco de dados MySQLe gerar um log da query exe­cu­tada.
Neste exem­plo costa ape­nas as fun­ções de INSERT, DELETE, UPDATE e SELECT.
Para faci­li­tar a vida eu já dei­xei no código as query para criar o banco e as tabe­las uti­li­za­das para exe­cu­tar o código. Eu dei­xei os valo­res default de cone­xão com o MySQL altere os dados da cone­xão caso esteja usando outra con­fi­gu­ra­ção.
A idéia de criar um log das querys exe­cu­ta­das no sis­tema ser­vem para detec­tar erros e tam­bém como um regis­tro caso alguem valor tenha sito movi­men­tado 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 edi­tor de texto e colo­que 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>

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Designed by NattyWP Wordpress Themes.
Images by desEXign.