Oferta Nacional - 234x60

Arquivo

Arquivo de outubro, 2009

JQuery autocomplete em ajax com php e mysql

Olá!

Pessoal, desenvolvi um novo sistema de auto complete, na forma de um plugin JQuery, o Simple AutoComplete JQuery Plugin.

O Simple AutoComplete JQuery Plugin é mais fácil de integrar e resolve os BUGs que aconteciam no IE, na funcionalidade deste tutorial.

Você pode baixá-lo e ver a documentação em : http://blog.idealmind.com.br/projetos/simple-autocomplete-jquery-plugin/

Neste tutorial vou mostrar para você como fazer um autocomplete usando JQuery e AJAX, estilizado com css, e consultando banco de dados MySQL com PHP.

O resultado final será como a imagem abaixo:
autocomplete

Antes de tudo, baixe os arquivo necessários: http://blog.idealmind.com.br/exemplos/autocomplete/autocomplete.rar

Lá você encontra os arquivos javascript e css, e também o php, uma página de exemplo e as sqls.

Bom, depois de baixado, vamos ao primeiro passo, que será criar uma tabela no banco de dados, e inserir alguns dados.

Quero deixar um agradecimento e os créditos para o pessoal do webartz (http://www.webartz.com.br/mysql/banco-mysql-de-cidades-e-estados-do-brasil/),  pois foi onde encontrei e baixei as sqls com os dados das cidades e estados do brasil.

Vamos criar uma tabela para o nosso exemplo, com os estados do Brasil:

CREATE TABLE `estados` (
	`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
	`sigla` VARCHAR(2) NOT NULL,
	`estado` VARCHAR(45) NOT NULL,
	PRIMARY KEY (`id`),
	INDEX `ix_estado`(`estado`)
)
ENGINE = MyISAM
CHARACTER SET utf8 COLLATE utf8_general_ci;

E agora vamos inserir os estados na tabela:

INSERT INTO `estados` (id, sigla, estado ) VALUES
	(1, 'AC', 'Acre'),
	(2, 'AL', 'Alagoas'),
	(3, 'AM', 'Amazonas'),
	(4, 'AP', 'Amapá'),
	(5, 'BA', 'Bahia'),
	(6, 'CE', 'Ceará'),
	(7, 'DF', 'Distrito Federal'),
	(8, 'ES', 'Espírito Santo'),
	(9, 'GO', 'Goiás'),
	(10, 'MA', 'Maranhão'),
	(11, 'MG', 'Minas Gerais'),
	(12, 'MS', 'Mato Grosso do Sul'),
	(13, 'MT', 'Mato Grosso'),
	(14, 'PA', 'Pará'),
	(15, 'PB', 'Paraíba'),
	(16, 'PE', 'Pernambuco'),
	(17, 'PI', 'Piauí'),
	(18, 'PR', 'Paraná'),
	(19, 'RJ', 'Rio de Janeiro'),
	(20, 'RN', 'Rio Grande do Norte'),
	(21, 'RO', 'Rondônia'),
	(22, 'RR', 'Roraima'),
	(23, 'RS', 'Rio Grande do Sul'),
	(24, 'SC', 'Santa Catarina'),
	(25, 'SE', 'Sergipe'),
	(26, 'SP', 'São Paulo'),
	(27, 'TO', 'Tocantins')
;

Agora vamos criar um arquivo HTML vazio:

<html>
	<head>

	</head>
	<body>

	</body>
</html>

Agora, dentro da tag <head> vamos incluir os arquivos necessários:

	<script type="text/javascript" src="js/autocomplete.js"></script>
	<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
	<link rel="stylesheet" type="text/css" href="css/autocomplete.css">

Quero deixar claro que o arquivo autocomplete.js deve ser chamado antes da JQuery, por questões de compatibilidade.

Feito isso, vamos criar, dentro da tag <body> o campo input onde será digitado o texto e aparecerá o autocomplete:


	<input type="text" name="campo_estado" id="campo_estado" />

Observe os valores dos atributos name e id: campo_estado. Estes valores serão a referência para a JQuery.

E agora vamos criar 3 campos, anda dentro da tag <body>, onde armazenaremos os dados referentes a opção que for selecionada no autocomplete:

	<input type="text" id="id_val" name="id" value="" /><br />
	<input type="text" id="estado_val" name="estado" value="" /><br />
	<input type="text" id="sigla_val" name="sigla" value="" />

Observe que foi criado um campo para cada resultado da consulta que o autocomplete vai fazer via AJAX, PHP e MySQL.

Ok. Agora vamos para a parte do javascript, que fará tudo funcionar. O seguinte código deve ser inserido entre as tags <head></head>, depois da chamada dos arquivos js e css que foram incluídos.


<script type="text/javascript">
$(document).ready(function(){
	// Aqui que tudo começa. Observe que usei o atributo name do campo que será digitado o texto como referência.
	new Autocomplete("campo_estado", function() {
		// Quando o autocomplete trazer o resultado da consulta, vai atribuir nos campos correspondentes
		this.setValue = function( id, estado, sigla ) {
			$("#id_val").val(id);
			$("#estado_val").val(estado);
			$("#sigla_val").val(sigla);
		}
		if ( this.isModified )
			this.setValue("");
		if ( this.value.length < 1 && this.isNotClick )
			return ;
		// O arquivo php abaixo é que será chamado via AJAX, sendo passado o parâmetro q com o valor digitado no campo
		return "ajax.php?q=" + this.value;
	});

});
</script>

Agora vamos criar o arquivo ajax.php, que receberá por GET o parâmetro q com o valor do texto que foi digitado no campo:

<?php
// Abaixo são definidas as variáveis de acesso ao banco de dados MySQL
$hostname = 'localhost';
$username = 'root';
$password = '';
$dbname = 'test';

// Abaixo o código de conexão ao banco
mysql_connect( $hostname, $username, $password ) or die ( 'Erro ao tentar conectar ao banco de dados.' );
mysql_select_db( $dbname );

// Na linha abaixo é dado um escape, para retirar caracteres que possam prejudicar a consulta sql
$q = mysql_real_escape_string( $_GET['q'] );

// Abaixo a sql que retornará os dados
$sql = "SELECT * FROM estados where locate('$q',estado) > 0 order by locate('$q',estado) limit 10";

// Abaixo executo a sql e atribuo o resultado da consulta à variável $res
$res = mysql_query( $sql );

// Para cada resultado encontrado, será gerada uma linha no autocomplete, colocando em negrito o termo digitado.
while( $campo = mysql_fetch_array( $res ) )
{
	$id = $campo['id'];
	$estado = $campo['estado'];
	$sigla = $campo['sigla'];
	$estado = addslashes($estado);
	$html = preg_replace("/(" . $q . ")/i", "<span style=\"font-weight:bold\">\$1</span>", $estado);

	// Veja que existe o atributo de evento onselect, que executará as funções de retorno no autocomplete
	echo "<li onselect=\"this.setText('$estado').setValue('$id','$estado','$sigla');\">$html ($sigla)</li>\n";
}
?>

Bom, seguindo esses passos, você poderá incluir uma funcionalidade de autocomplete poderosa em seu site. Agora basta personalizar e estilizar ao seu gosto!

Deixe seu comentário!

Posts Relacionados:

Download de ícones gratuitos – PNG, ICO, vetorizados

Olá!

Quem nunca precisou de um ícone, de preferência que fosse gratuito, para usar em seu site, que atire a primeira pedra!

Vou passar uma lista de alguns sites que encontrei que disponibilizam ícones de garça para download.

HP-Firefox-Dock-64x64 http://www.iconspedia.com

Possui um monte de ícones de alta resolução, nos formatos PNG e ICO.

loadinfo.net http://loadinfo.net/

Possui uma série de imagens gif para preloaders. Você pode personalizar escolhendo a cor de fundo e a cor do preloader, e o tamanho final: 16×16, 24×24 ou 48×48 pixels.

2985_128x128 http://www.plugmasters.com.br/downloads/icones/

Um banco de ícone que possui muuuuuitos ícones no formato png e em tamanhos diferentes. E é brasileiro.

http://www.iconespng.com

http://www.yellowicon.com/downloads/

http://www.vecteezy.com

http://www.iconfinder.net

Essa lista, apesar de pequena, já dá para brincar!

Posts Relacionados:

  • Nenhum

foreach e in_array em javascript

28, outubro, 2009 1 comentário

Olá!

Hoje vou mostrar para você como fazer para dar um comando equivalente do foreach e in_array do php, só que em javascript.

O foreach serve para percorrer cada chave de um vetor e pegar o valor correspondente. O in_array serve para saber se um determinado valor está dentro de um vetor.

Segue abaixo um exemplo do foreach:

<script type="text/javascript">
// um vetor de exemplo
var fruta = new Array();
fruta[0] = "maçã";
fruta[1] = "banana";
fruta[2] = "pêra";
fruta[3] = "goiaba";

// Aqui dou um comando equivalente ao foreach
for(var i in fruta)
{
	document.write("A chave " + i + " tem a fruta " + fruta[i] +"<br />");
}
</script>

O exemplo acima vai imprimir

A chave 0 tem a fruta maçã
A chave 1 tem a fruta banana
A chave 2 tem a fruta pêra
A chave 3 tem a fruta goiaba

Agora um exemplo de como fazer um in_array em javascript:

// Abaixo crio a função in_array
function in_array(valor,vetor)
{
	for(var i in vetor)
	{
		if(valor == vetor[i])
		{
			return i;
		}
	}
	return false;
}
// Um exemplo de uso: quero saber se banana está no vetor
var chave = in_array("banana",fruta);
if(chave)
{
	document.write("banana está na cesta e a chave é "+chave+"<br />");
}
else
{
	document.write("banana não está na cesta<br />");
}
// Outro exemplo de uso: quero saber se morango está no vetor
var chave = in_array("morango",fruta);
if(chave)
{
 document.write("morango está na cesta e a chave é "+chave+"<br />");
}
else
{
 document.write("morango não está na cesta<br />");
}

O código acima vai imprimir

banana está na cesta e a chave é 1
morango não está na cesta

Essas funções são bem úteis e dá para fazer um monte de coisas!

Deixe um comentário!

Posts Relacionados:

Como retirar último caractere de uma string em javascript e em PHP

Olá!

Hoje vou mostrar uma solução simples, mas que muitos desenvolvedores, principalmente os iniciantes, não sabem ou se esquecem de como retirar o ultimo caractere de uma string.

Essa funcionalidade é bastante útil, principalmente quando você cria strings automaticamente. Vamos aos exemplos.

No PHP

Suponhamos que você queira gerar um script sql para dar um INSERT em uma tabela de usuários no mysql, mas a quantidade de linhas é variável, sendo que os dados a serem atualizados estão armazenados em um vetor, que vou chamá-lo de $dados. Este vetor é bidimensional, do tipo $dados[0]['nome'], $dados[0]['email'],$dados[0]['apelido'] etc.

Para criar a sql, podemos proceder da seguinte maneira:


// Esse é o início da sql que vai inserir os dados no banco
$sql = "INSERT INTO usuarios (nome,email,apelido) VALUES ";

// Para cada primeira dimensão do vetor, pegamos o dado da segunda
foreach($dados as $dado)
{
    // Repare que inserimos uma vírgula no final da string
    $sql .= "('{$dado['nome']}','{$dado['email]}','{$dado['apelido']}'),";
}

// Aqui nós tiramos o ultimo caractere, no caso, a vírgula da utima concatenação da string $sql
$sql = substr($sql,0,-1);

// Finalmente, inserimos os dados no banco, com a string correta
mysql_query($sql);

No javascript

Para retirarmos o ultimo caractere de uma string em javascript, usamos a função nativa substring(), porém com um pequeno macete.

Esta função aceita dois parametros, sendo que o primeiro indica a partir de qual caractere a string será mostrada, e o segundo parâmetro indica até qual caractere a string será mostrada. Seguindo esta lógica, e admitindo qu não sabemos o tamanho da string que vamos trabalhar, então vamos contar os caracteres da string, usando a propriedade lenght e então subtrair de um.

Então vamos ao código (com um exemplo bem simplista em relação ao exemplo que foi dado no PHP).


<script type="text/javascript">
function retiraUltimoCaractere(str)
{
    // Executamos a linha abaixo para termos certeza de que o parâmetro a ser tratado será uma string
    var str=new String(str);

    // Enfim, aplicamos a função substring(), para retornar a string do primeiro até o penúltimo caractere
    return str.substring(0,(str.length - 1));
}

alert(retiraUltimoCaractere("Olá mundo!"));
</script>

O código acima vai dar um alert de “Olá mundo”, sem a exclamação no final.

Espero que estas dicas tenham sido úteis para você!

Deixe um comentário!

Posts Relacionados:

  • Nenhum

INSPIRAÇÃO – Sites interessantes e curiosidades

Para você que deseja criar um projeto inovador, e está sem inspiração, vou apresentar uma lista de sites interessantes com conteúdo de diversos assuntos.

De vez em quando, navegando na web, me deparo com muitos sites que exibem curiosidades, coisas bizarras, coisas muito interessantes e coisas que jamais pensáriamos existir.

cabelo moldado na forma de um cachorroTOXEL.COM

É um blog com um acervo de imagens muito interessantes, coisas que acontecem de verdade, criado por artistas das mais diversas áreas.

Arte com as mãos

oneeyeland.com

É um site onde fotógrafos de todo o muyndo expõem seus trabalhos, que por sua vez são ranckeados pelos usuários/visitantes do site. Este rancking elege as imagens e os fotógrafos da semana e do mês.

www.wix.com

A proposta deles é permitir que qualquer um faça um site em flash sem precisar ter conhecimentos de programação ou do próprio flash. Eles prometem que o resultado final é otimizado para SEO. Possui um editor muito rico onde dá para fazer muitas coisas. A interface é intuitiva e fácil de se utilizar.

www.smashingmagazine.com

É um dos meus blogs prediletos para buscar e receber informações. Ao seguí-lo no Twitter e via RSS, fico sempre atualizado com as novidades da web.

www.be-insight.com

Este é brasileiro, sempre com boas dicas e novidades. Eles são especialista em templates para o Blogger.

http://tutorialzine.com/

Um blog repleto de turoriais para o desenvolvimento web em AJAX, javascript, CSS, PHP e MySQL.

Posts Relacionados:

  • Nenhum
Categories: geral Tags: , ,

10 Tutoriais e demos de menus em JQuery

Olá!

Hoje vou mostrar uma série de tutoriais que encontrei pela internet sobre como desenvolver menus animados e estilizados utilizando CSS e JQuery. Vale a pena dar uma conferida!

Tutoriais, demos e códigos de 10 menus JQuery

Menu dropdown animado
Um tutorial completo sobre como criar um menu animado usando JQuery e CSS sem usar plugin.  Ensina tudo mesmo, desde o início. E o resultado é um bonito menu dropdown estilizado.
TutorialDemo

Menu dropdown estilo iPod com suporte a ThemeRoller
Esse é muito bacana, principalmente devido a facilidade de estilização usando o ThemeRoller.
Você escolhe o tema e vê o resultado na hora. Possui bonito efeitos e possibilidades de submenus.
TutorialDemo

Superfish menu
É um plugin JQuery, de fácil utilização com muitas opções, inclusive funções de callback.
TutorialDemo

Lavalamp menu
Muito bacana esse menu: você passa o mouse sobre o itens e uma animação é exibida para destacar o item que o mouse está por cima. Possui diversos exemplos.
Tutorial & Demo

Menu animado com efeitos animados estilizado com imagens
TutorialDemo

JQuery menu inspirado no Mootools
Muito simples de se implementar e bonito de se ver.
TutorialDemo

Sliding-sliding doors Menu
É outro que vale a pena dar uma olhada. Muito bacana!
Tutorial - Demo 1Demo 2

Vertical sliding menu
Uma imagem que quando clicada abre um menu. É um tipo de menu utilizado em grandes portais.
Tutorial - Demo

Menu estilo Apple
Este tutorial ensina até a criar as imagens no Photoshop. Muito completo o tutorial, e você baixa até os arquivos psd! E o resultado final é magnífico! Veja a demo!
TutorialDemo

Animação de imagens e cores de background usando JQuery
O resultado é muito legal, e o tutorial está bem didático. Ensina a animar imagens de background, e a mudar a cor do menu com efeito de fade.
Tutorial - Demo

A vantagem de se usar menus (x)html usando JQuery e CSS é que você pode monitorar os links do menu de navegação usando, por exemplo, o Google Analytics, e sem abrir mão dos efeitos visuais, que parecem que foram feitos em flash.

Eu descobri esses exemplos no site http://www.catswhocode.com/blog/10-incredible-jquery-navigation-menus

Deixe um comentário!

Posts Relacionados:

Como passar parâmetros do flash para o javascript e do javascript para o flash

18, outubro, 2009 1 comentário

Olá!

Na última sexta, descobri, em conjunto com um dos membros do Tech Team do meuInglês,  Eduardo, um método muito interessante de se passar parâmetros do flash para uma função javascript e recuperar o valor retornado pela função para utilizar no flash.

A idéia inicial era fazer o flash executar uma função javascript que por sua vez iria fazer uma requisição AJAX utilizando JQuery, e retornar o valor da consulta para o flash.

Para ser sincero, fui infeliz nesse processo, mas ainda não tive tempo de pesquisar mais a fundo por uma forma de contornar o problema que aconteceu: a função retornava valor sempre falso, pois o AJAX ainda não havia retornado uma resposta antes do final da execução da função.

Mas, de qualquer forma, essa funcionalidade se mostrou muito importante, pois é possível controlar elementos HTML através do flash e, por sua vez, executar alguma ação no flash de acordo com o retorno da função javascript.

Vamos ao que interessa então! Vamos usar uma exemplo prático para ilustrar.

Vamos supor que você tenha um botão em seu flash. A pressionar o botão, você quer inserir/modificar um texto dentro de uma div, sendo que o texto foi escrito dentro de um campo de texto no flash.

O script do botão fica da seguinte forma:

// A linha abaixo é para carregar a biblioteca do flash que possui a função ExternalInterface.call, que fará a mágica
import flash.external.*;

// Declaro a variável 'resultado' como uma string
var resultado:Boolean;

// Defino a função que será executada quando o botão (instanciado como 'meuBotao')
meuBotao.onPress = function() {

  // Possuímos um campo de texto dinâmico instanciado como 'campoTexto', e atribuimos o valor dele à variável 'texto'
  var texto = campoTexto.text;
  // Possuímos no flash um campo de texto também, instanciado como 'campoNome', onde pegamos o nome do usuário e atribuímos o valor ditado nele à variável 'nome'
  var nome = campoNome.text;

  // Abaixo passamos os parâmetros 'nome' e 'texto' para a função javascript recebeDados(),
  // e atríbuímos a resposta da função à variável 'resultado'
  // Perceba que a função javascript deve retornar um valor booleano (true ou false, 1  ou 0)
  resultado = Boolean(ExternalInterface.call("recebeDados", nome, texto));
  // Se o resultado for 1 (true, verdadeiro), mando para o quadro 1
  if(resultado == 1){
    gotoAndPlay("quadro1");
  }
  else // Se o resultado for diferente de 1, mando para o quadro 2
  {
    gotoAndPlay("quadro2");
  }
} 

Agora a função javascript que recebe os parâmetros passados pelo flash:


function recebeDados(nome,texto){
    // Abaixo crio um elemento html contendo os dados que o usuário digitou no flash
    var novoHtml = '<div><b>Nome:</br> '+nome+'<br /><b>Comentário:</b><br />'+texto+'</div>'     // Abaixo insiro o elemento recém criado dentro da div com id 'div_resposta'     document.getElementById('div_reposta').innerHtml(novoHtml);
    // Se for encontrada a palavra 'futebol' no texto digitado pelo usuário, retorna true, se não, retorna false
    if(texto.indexOf("futebol")!=-1){
      return true;
    }else{
      return false;
    }
}

Uma coisa importante: a função javascript deve estar na mesma página que está executando o flash, ou em algum arquivo externo carregado por essa página.

O funcionamento ficou da seguinte maneira: num determinado frame do flash, o usuário vê uma campo para digitar seu nome, e um campo para digitar um texto, e um botão para enviar.

Ao enviar os dados digitados pelo usuários aparecem na página, fora do flash, numa div chamada ‘div_resposta’. Se o texto digitado pelo usuário conter a palavra ‘futebol’, o flash vai para o frame de label ‘quadro1′, se não, vai para o frame de label ‘quadro2′.

Agora liberte a sua imaginação e faça muitas coisas!

Até a próxima! Deixe um comentário!

Posts Relacionados:

Ferramenta do Orkut – os usuários podem anunciar de graça

15, outubro, 2009 1 comentário

Hoje eu vi um anúncio de um usuário no orkut. É uma forma nova de promover idéias dos usuários, ou o que eles quiserem.

Os anúncios dos usuários são exibidos em rotatividade com os anúncios do adsense (deles mesmo).

Achei muito inteligente a estratégia deles: você pode anúnciar o que quiser. Se você anúncia, você vai querer ficar monitorando os seus anúncios. Ao monitorar os seus anúncios, automaticamente você vai prestar mais atenção nos anúncios deles e, consequentemente, as chances de você clicar nos anúncios deles são bem maiores.

Para promover um anúncio, entre no Orkut e clique na opção do menu esquerdo “promova”. Veja a imagem abaixo:

Menu esquerdo do Orkut

Ótima estratégia!

Posts Relacionados:

  • Nenhum

Como criar stored procedures e funções no MySQL

Olá!

Hoje vou mostrar como se faz para criar stored procedures e funções no MySQL. Stored procedures e funções são processos que você cria e ficam armazenados noMySQL, onde você pode executá-los depois. A vantagem é que o tempo de execução para consultar dados e mostrar na tela do usuário, ou executar comandos mais complexos, ficam muito mais rápidos do que se você fosse fazer via PHP, por exemplo.

Imagina se você tem que fazer uma consulta, e de acordo com cada resultado desta consulta você tem que inserir ou atualizar uma outra tabela. Ou então imagine que você tenha que fazer uma consulta e executar alguns cálculos com os dados de alguns campos. Isso dá para fazer com PHP, mas você torna o processo muito mais lento, pois para cada resultado, o php abre uma nova consulta para executar a instrução devida. No exemplo que mostrarei, vou comparar uma stored procedure com um script php, que fazem exatamente a mesma coisa.

Com uma stored procedure, você faz uma chamada só ao servidor MySQL e ele se encarrega de fazer sozinho. Stored Procedure são ótimas para se executar scripts mais complexos no banco de dados.

Com uma função, em uma única consulta você já traz os resultados prontinhos para o php somente mostrar na tela. é como se o resultado da função fosse um dado já armazenado mo MySQL.

Diferença entre stored procedures e funções

Stored procedures não retornam dados. Elas executam scripts no MySQL, que podem ser desde alterações da estrutura de tabelas, até migração de dados de uma tabela para outra, ou executar ações de acordo com os resultados de uma consulta.

Funções obrigatoriamente devem retornar dados, sejam INT, CHAR, VARCHAR, BOOLEAN etc. São ótimas para fazer comparação de dados e retornar valores, executar cálculos, consultar outras tabelas diferentes de acordo com os parâmetros passados etc.

Enfim, dá para fazer muita coisa com o MySQL através de Stored procedures e funções, que otimizam o código e o torna muito mais profissional.

Bom, vamos aos exemplos.

Criando uma Stored Procedure

Vamos supor que você queira uma tabela para armazenar quais sessões de uma aula e quantas vezes um aluno as acessou. Você armazena em uma tabela a nota do aluno para cada vez que ele faz os exercícios de cada aula.

Então temos as tabelas aula_sessao e aula_nota (além das tabelas aluno e aula, claro)

Você precisa atualizar a tabela de sessão dos exercícios para cada aula que o usuário fez, dizendo o número de vezes que o usuário fez os exercícios daquela aula.

Claro que você pode criar um Trigger para executar isso automaticamente, mas imagina se você começou a monitorar os dados de sessão da aula um tempo depois que o site já estava no ar. Você vai ter que recuperar os dados de algum lugar para a contagem não começar do zero. E para agravar ainda mais a situação, você resolveu atualizar estes dados depois que o sistema de monitoramento já estava no ar, ou seja, já possuia dados gravados. Então você tem que inserir novos registros se ainda não existirem, ou atualizar os registros se já existirem.


delimiter ;
-- Na linha abaixo eu apago a procedure caso ela exista
drop procedure if exists insereDados;

delimiter |
-- Na linha abaixo eu crio a procedure
create procedure insereDados()
 begin

-- Abaixo eu declaro as variáveis.
 DECLARE done INT DEFAULT 0;
 declare aulaId INT;
 declare alunoId INT;
 declare vezes INT;
 declare existe CHAR(1);

-- Abaixo, eu declaro um cursor que será a minha consulta de referência que atualizará a tabela aula_sessao
-- Nela eu pego o id da aula, o id do aluno, a quantidade de vezes que o aluno fez os exercícios para cada aula,
-- e verifico em uma subquery se o aluno já possui o registro daquela aula em aula_sessao

 DECLARE curs CURSOR FOR (

select
a.idaula,
a.idaluno,
count(*),
(select if(count(*)=0,'N','S') from aula_sessao where idaluno = a.idaluno and idaula = a.idaula)
from
aula_nota a
group by
a.idaluno,a.idaula

);

-- Na linha abaixo, altero o valor da variável done para um, caso nenhum resultado seja encontrado no cursor;
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

-- Ativo o cursor
 OPEN curs;

-- Começo o loop para cada resultado encontrado no cursor
 REPEAT

-- Atribuo os dados de cada campo, na ordem do select do cursor, dentro das variáveis abaixo
 FETCH curs INTO aulaId, alunoId, vezes, existe;

-- se done é falso (done = 0) executa o que está dentro do if
    if not done then
      -- se o resultado do cursor diz que não existe o dado em aula_sessao, vou inserir o registro
if existe = 'N' then
insert into aula_sessao (idaula,idaluno,sessao_exercicios) values (aulaId,usuarioId,vezes);
      -- Se já existe um registro relacionando o aluno à tabela aula_sessao, vou atualizar o registro
elseif existe = 'S' then
update aula_sessao set sessao_exercicios = vezes where idaula = aulaId and idaluno = alunoId;
end if;
    end if;
 -- até que a variavel done receba o valor TRUE (quando não existirem resultados disponíveis)
 UNTIL done END REPEAT;
-- Fecho o cursor e finalizo a stored procedure
 CLOSE curs;

 end
|

delimiter ;

Para executar a procedure, basta chamá-la assim:
CALL insereDados();

Se você quiser apagá-la depois de executada, bas dar o comando:
drop procedure if exists insereDados;

A mesma coisa no PHP (porém muito mais lento)

O código PHP abaixo faz exatamente a mesma coisa que a Stored Procedure que criamos:


<?php

$sql = "
 select
 a.idaula,
 a.idaluno,
 count(*) as vezes,
 if(s.id is null,'N','S') as existe
 from
 aula_nota a
 left join aula_sessao s on s.idaula = a.idaula and s.idaluno = a.idaluno
 group by
 a.idaluno,a.idaula
";
$res = mysql_query( $sql );

while( $r = mysql_fetch_array( $res ) )
{
 if($r['existe']=="S")
 {
 $sql = "update aula_sessao set sessao_exercicios = ".$r['vezes']." where idaula = ".$r['idaula']." and idusuario = ".$r['idaluno'];
 }
 else
 {
 $sql = "insert into aula_sessao (idaula,idaluno,sessao_exercicios) values (".$r['idaula'].",".$r['idaluno'].",".$r['vezes'].")";
 }
 mysql_query( $sql );
}

?>

A desvantagem é que a cada vez que você dá o comando mysql_query(), uma nova conexão é aberta com o banco. Então, se o resultado da primeira query tem muitas linhas, o tempo de execução será muito grande, o uso de processador será absurdo, você poderá perder dados durante o tempo de execução do script, além de poder derrubar o servidor MySQL (acontece muito na plataforma windows ou de acordo com as configurações do servidor).

Usando a Stored Procedure, além da velocidade de execução ser absurdamente maior, você mantém a consistência de dados, pois o MySQL sabe se algum dado foi inserido durante a execução do script e o atualiza também, se for o caso.

Criando uma função no MySQL

Vou mostrar um exemplo simples para ilustrar.

Vamos supor que você tem uma tabela de usuários que te traz o nivel de acesso de cada um deles. Vamos supor que temos os seguintes níveis de acessos:

0: comum
1: colaborador
2: moderador
3: administrador

Você quer apresentar esta informação para o usuário. Para fazer isso somente uma vez, basta na sql você fazer:


select
idusuario,
nome,
    email,
    (case nivel
       when 0 then 'comum'
       when 1 then 'colaborador'
       when 2 then 'moderador'
       when 3 the 'administrador'
    end) as nivelString
from
    usuario
where idusuario = 1

Você pode simplesmente criar uma função para pegar a string que diz o nivel de acesso do usuário, com a vantagem de poder usá-la em várias sqls, sem ter a necessidade de fazer o CASE toda vez que você precisar obter esse dado. Além disso, a manutenção fica muito mais simples se você quiser, por exemplo, acrescentar mais um nível de acesso. Basta alterar a função.

Então vamos criar:


delimiter ;

drop function if exists getNivelString;

delimiter |

create function getNivelString(nivel INT)
 returns varchar(45)
 begin
   declare nivelString varchar(45);
   case nivel
     when 0 then nivelString = 'comum'
     when 1 then nivelString = 'colaborador'
     when 2 then nivelString = 'moderador'
     when 3 then nivelString = 'administrador'
     else nivelString = 'comum'
   end;
   return nivelString;
end
|

delimiter ;

Agora,  a consulta pode ficar assim:

select
idusuario,
nome,
    email,
    getNivelString(idnivel) as nivelString
from
    usuario
where idusuario = 1

Lembrando que este é um exemplo bem simples diante da infinidade de coisas que se pode fazer.

Agora, o php para mostar os dados fica bem simples:


$sql = "
select
idusuario,
nome,
    email,
    getNivelString(idnivel) as nivelString
from
   usuario
where idusuario = 1
";
$campo = mysql_fetch_array( mysql_query( $sql ) );

echo "
    Olá {$campo['nome']}! Você é um usuário {$campo['nivelString']}.
";

A mesma coisa em PHP

<?php
function getNivelString($idnivel)
{
    switch( $idnivel )
    {
       case 0: $string = 'comum'; break;
       case 1: $string = 'colaborador'; break;
       case 2: $string = 'moderador'; break;
       case 3: $string = 'administrador'; break;
       default $string = 'comum'
    }
    return $string;
}

$sql = "select idusuario, nome, email, idnivel from usuario where idusuario = 1";
$campo = mysql_fetch_array( mysql_query( $sql ) );

echo "
    Olá {$campo['nome']}! Você é um usuário " . getNivelString( $campo['idnivel'] ) . ".
";
?>

Os exemplos dados aqui são apenas para demostrar como criar e usar funções e stored procedures no MySQL. Os exemplos são simples, mas você pode adaptá-los às suas necessidades.

Espero que este artigo tenha sido útil para você. Demorei um bom tempo para escrevê-lo ;)

Deixe um comentário!

Até a próxima!

Posts Relacionados:

Salvar como em php – download de arquivos

Olá!

Neste post vou mostrar como salvar arquivos usando PHP. Esta funcionalidade serve para que os arquivos disponibilizados em seu site tenha um link que ao ser clicado, apareça a janela “Salvar como…”.

Seguindo este tutorial, você será capaz de montar um arquivo que recebe parâmetros em GET e depois chama uma função para setar os cabeçalhos dizendo que o arquivo é para download. A vantagem é que você vai criar esse arquivo apenas uma vez, e poderá replicar para todos os links de download do seu site. A funcionalidade detectará automaticamente o mime type do arquivo. Mãos às obra!

Primeiro, vamos criar o arquivo download.php.


<?php
if( isset( $_GET['arquivo'] ) && is_file( $_GET['arquivo'] ) ){
 
 $arquivo = $_GET['arquivo'];
 
 // Pega a extensão do arquivo
 $ext = pathinfo($arquivo,PATHINFO_EXTENSION);
 
 // No vetor abaixo são setados os Mime Types dos possíveis arquivos
 $mimeType = array(
 'mp3'=>'audio/mpeg',
 'pdf'=>'application/pdf',
 'doc'=>'application/msword',
 'ppt'=>'application/vnd.ms-powerpoint',
 'pps'=>'application/vnd.ms-powerpoint'
 );
 
 //Seta o Mime Type do arquivo de acordo com a extensão
 if(array_key_exists($ext,$mimeType)){
 $mimeType = $mimeType[$ext];
 }else{
 // Se o Mime Type não for encontrado na lista, será usado o padrão application/octet-stream
 $mimeType = "application/octet-stream";
 }
 
 // Seta os cabeçalhos
 header( "Pragma: public" );
 header( "Expires: 0" );
 header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
 header( "Cache-Control: private",false );
 header( "Content-Type: $mimeType" );
 
 // A linha abaixo é responsável por dizer que o arquivo é para download
 header( "Content-Disposition: attachment; filename=\"".basename($arquivo)."\";");
 
 header( "Content-Transfer-Encoding: binary" );
 header( "Content-Length: ".filesize($arquivo));
 
 // Lê e escreve o conteúdo do arquivo para o buffer de saída
 readfile($arquivo);
 
 exit;
} else {
 // Para dar um erro 404 de arquivo não encontrado
 header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
 header("Status: 404 Not Found");
 
 // Se as duas linhas acima não der um erro 404 exibe a mensagem abaixo
 die("Arquivo não encontrado");
}
?>

Agora vamos criar o arquivo que conterá o link de download de um arquivo de exemplo (exemplo.html):


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Exemplo de download e arquivo</title>
</head>
<body>
<h1>Exemplo de download de arquivos com opção "Salvar como"</h1>
<b>meu_arquivo.mp3</b> <a href="download.php?arquivo=meu_arquivo.mp3">Clique para fazer o download</a>
</body>
</html>

Pronto!

Agora rode o arquivo exemplo.html e clique no link “Clique para fazer o download” e aparecerá a janela “Salvar como…” para fazer download do arquivo!

Lembrando que o arquivo deve estar no mesmo diretório que o arquivo download.php, ou então você deverá passar também o caminho do arquivo ;) .

Uma dica: se você quiser uma lista de mime types de arquivos, acesse http://www.mimetype.org/.

Deixe seu comentário!

Até a próxima!

Related Posts Plugin for WordPress, Blogger...

Posts Relacionados:

SEO Powered by Platinum SEO from Techblissonline