SQL Server - Busca com acentos

Monday, November 10th, 2008

Aeee!

Faz menos de um ano que estou trabalhando diretamente no SQL Server, e a algum tempo atrás o cliente digitava no software uma palavra com acento, por exemplo “joão”, porém no banco estava armazenada como “joao”, dessa maneira não o encontrava e surgiam problemas como duplicidade entre outros.

A primeira solução que encontrei foi customizar o software para no momento da busca adicionar o seguinte comando SQL:

WHERE meuCampo COLLATE Latin1_General_CI_AI LIKE ‘%joao%’”;

Mas o problema é que não queria customizar o produto somente para aquele determinado cliente que utilizava SQL Server.

Hoje pesquisando na internet achei o seguinte:

GO
ALTER TABLE minhaTabela
ALTER COLUMN meuCampo varchar(40) COLLATE Latin1_General_CI_AI

Agora todas as minhas consultas em todo sistema através desse campo irá funcionar com acentos, sem acentos.

Obs.: Tentei fazer diretamente no banco inteiro com um ALTER DATABASE… Executa, porém não funciona.

Andrey.

SQL - Procedures

Thursday, October 18th, 2007

Obs.: Procedure testada somente para o padrão INTERBASE
=D

## Cria uma nova terminação alem do “;”
SET TERM ^;

## Criando a procedure com nome teste
CREATE PROCEDURE teste (variavel VARCHAR(50))
## Que resultados obterei quando executá-la?
RETURNS (
nome VARCHAR(50),
idade INTEGER
)

## Declarando variáveis
AS sobrenome VARCHAR(50);

## Importante: A declaração de variáveis somente é realizada
## para variáveis que não estão no RESULTS

## Início da execução
BEGIN
## Atribuindo valores � s variáveis
nome = ‘João’;
idade = 25;
SUSPEND;
sobrenome = ‘Maria’;
SUSPEND;
nome = ‘Dayane’;
idade = 18;
END^

## Retorna a terminação padrão “;”
SET TERM ;^

SQL somente dentro das CLASSES

Friday, December 15th, 2006

Pouco tempo atrás começamos a adotar um novo padrão, onde basicamente falando, qualquer SQL que for executado em um site ou sistema deve ficar dentro da classe. Para cada tabela existe uma classe, por exemplo para a tabela “usuario”, o nome da classe passa a ser “Usuario”.
Ok, mas qual a vantagem em fazer isso?

  • Como todo SQL fica confinado dentro da classe, caso queira fazer migração de banco de dados, basta alterar dentro das classes, não precisando sair catando SQL pelos arquivos PHP.
  • Padronização dos SQL’s e métodos que retornam ou inserem no banco. Lembrando que essa padronização acaba obrigando o programador a fazer de uma única forma.
  • Pode ser criado um gerador de códigos para esse padrão, pois como é feito de forma única, não precisa-se mais criar classes, dessa forma o programador, foca boa parte de seu tempo na regra de negócio (Obs.: Esse gerador de códigos está quase pronto, e está sendo feito por Eliton José da Silva, que por sinal está ficando muito bom)
  • Pode-se trabalhar com dois programadores em um mesmo módulo do software, onde um pode mexer com a regra de negócio dentro da classe (Esqueci de mencionar que toda regra de negócio deve ficar dentro da classe) e outro no script que chama os métodos da classe só exibindo na tela dados já trabalhados na classe ou executar métodos para inserir dados.

Bom, esses são alguns dos inúmeros benefícios que obterá em usar esse padrão.

Vou colocar alguns exemplos:

No script que instância métodos da classe faremos da seguinte forma para inserir um registro:

session_start();

/* Importando Classes que serão usadas no sistema */
include “../_classe/classeUsuario.php”;
include “../_include/config.php”;

/* Instanciando o Objeto Usuário */
$objetoUsuario = new Usuario();

if($_POST['enviar']) {

$objetoUsuario->setUsuarioLogin($_POST['usuarioLogin']);
$objetoUsuario->setUsuarioNome($_POST['usuarioNome']);
$objetoUsuario->setUsuarioFuncao($_POST['usuarioFuncao']);
$objetoUsuario->setUsuarioEmail($_POST['usuarioEmail']);
$objetoUsuario->setUsuarioSenha($_POST['usuarioSenha']);
$objetoUsuario->setUsuarioTelefone($_POST['usuarioTelefone']);
$objetoUsuario->setUsuarioCelular($_POST['usuarioCelular']);

if($_POST['acao'] == ‘a’) {
$objetoUsuario->setUsuarioCodigo($_POST['usuarioCodigo']);
$objetoUsuario->alteraUsuario();
}
else {
$objetoUsuario->carregaUsuario();
if(count($objetoUsuario->getVetorUsuario()) == 0) {
$objetoUsuario->insereUsuario();
}
else {
?>
Usuário já existe
}
}
unset($_POST['acao']);

?>
Cadastrou com sucesso!
}
Lembrando que esses dados são submetidos por um formulário com o “method=’post’”

Agora vamos para a classe que possui os dois métodos utilizados no script acima:

/***********************************
Autor: Andrey Pedro Lefkum
andrey@andrey.eti.br
www.andrey.eti.br

Classe: Usuário

Classe para ações do usuário no
sistema.

***********************************/

class Usuario {

/* Metodo Construtor */
function Usuario() {

}
/* Fim Metodo construtor */

/* variáveis da classe */
var $usuarioCodigo;
var $usuarioNome;
var $usuarioEmail;
var $usuarioTelefone;
var $usuarioCelular;
var $usuarioLogin;
var $usuarioSenha;
var $resultado;
var $vetorUsuario;
var $ordem;
/* Fim variáveis da classe */

/* Metodos Get’s and Set’s */
function getusuarioCodigo() {
return $this->usuarioCodigo;
}
function setusuarioCodigo($usuarioCodigo) {
$this->usuarioCodigo = $usuarioCodigo;
}

function getUsuarioNome() {
return $this->usuarioNome;
}
function setUsuarioNome($usuarioNome) {
$this->usuarioNome = addslashes($usuarioNome);
}

function getUsuarioEmail() {
return $this->usuarioEmail;
}
function setUsuarioEmail($usuarioEmail) {
$this->usuarioEmail = addslashes($usuarioEmail);
}

function getUsuarioTelefone() {
return $this->usuarioTelefone;
}
function setUsuarioTelefone($usuarioTelefone) {
$this->usuarioTelefone = addslashes($usuarioTelefone);
}

function getUsuarioCelular() {
return $this->usuarioCelular;
}
function setUsuarioCelular($usuarioCelular) {
$this->usuarioCelular = addslashes($usuarioCelular);
}

function getUsuarioLogin() {
return $this->usuarioLogin;
}
function setUsuarioLogin($usuarioLogin) {
$this->usuarioLogin = addslashes($usuarioLogin);
}

function getUsuarioSenha() {
return $this->usuarioSenha;
}
function setUsuarioSenha($usuarioSenha) {
$this->usuarioSenha = md5($usuarioSenha);
}

function getOrdem() {
return $this->ordem;
}
function setOrdem($ordem) {
$this->ordem = $ordem;
}

function getBuscar() {
return $this->buscar;
}
function setBuscar($buscar) {
$this->buscar = $buscar;
}

function getResultado() {
return $this->resultado;
}
function setResultado($resultado) {
$this->resultado = $resultado;
}

function getVetorUsuario() {
return $this->vetorUsuario;
}
function setVetorUsuario($vetorUsuario) {
$this->vetorUsuario = $vetorUsuario;
}

function getUsuarioFuncao() {
return $this->usuarioFuncao;
}
function setUsuarioFuncao($usuarioFuncao) {
$this->usuarioFuncao = $usuarioFuncao;
}

function getSql() {
return $this->sql;
}
function setSql($sql) {
$this->sql = $sql;
}
/* Fim Metodo Get’s and set’s */

/* Metodos de acoes da classe */
function insereUsuario() {
$sql = “INSERT INTO usuario
(usuarioLogin
,usuarioNome
,usuarioSenha
,usuarioTelefone
,usuarioCelular
,usuarioEmail
,usuarioFuncao
)
VALUES
(
‘”.$this->getUsuarioLogin().”‘
,’”.$this->getUsuarioNome().”‘
,’”.$this->getUsuarioSenha().”‘
,’”.$this->getUsuarioTelefone().”‘
,’”.$this->getUsuarioCelular().”‘
,’”.$this->getUsuarioEmail().”‘
,’”.$this->getUsuarioFuncao().”‘
)
“;

$resultado = mysql_query($sql) or die(”alert(’”.mysql_error().”‘);”);
if($resultado) {
$objetoLog = new Log();
$objetoLog->setLogTabela(’usuario’);
$objetoLog->setLogSql($sql);
$objetoLog->setLogDataHora(date(”Y-m-d H:i:s”));
$objetoLog->insereLog();
}

$this->setResultado($resultado);
}

function carregaSql() {
$sql = “SELECT usuarioCodigo
,usuarioLogin
,usuarioNome
,usuarioSenha
,usuarioEmail
,usuarioTelefone
,usuarioCelular
,usuarioFuncao
FROM usuario
WHERE 1 “;

if($this->getUsuarioNome()) {
$sql .= ” AND usuarioNome LIKE ‘%”.$this->getUsuarioNome().”%’ “;
}

if($this->getusuarioCodigo()) {
$sql .= ” AND usuarioCodigo = ‘”.$this->getusuarioCodigo().”‘ “;
}

if($this->getOrdem()) {

$sql .= “ORDER BY “.$this->getOrdem();
}
else {
$sql .= “ORDER BY usuarioNome “;
}
$this->setSql($sql);
}

function carregaUsuario() {
$this->carregaSql();
$sql = $this->getSql();
$resultado = mysql_query($sql) or die(”alert(’”.mysql_error().”‘);”);

while($linha = mysql_fetch_object($resultado)) {
$vetorUsuario['usuarioCodigo'] [$linha->usuarioCodigo] = $linha->usuarioCodigo;
$vetorUsuario['usuarioLogin'] [$linha->usuarioCodigo] = $linha->usuarioLogin;
$vetorUsuario['usuarioNome'] [$linha->usuarioCodigo] = $linha->usuarioNome;
$vetorUsuario['usuarioSenha'] [$linha->usuarioCodigo] = $linha->usuarioSenha;
$vetorUsuario['usuarioTelefone'][$linha->usuarioCodigo] = $linha->usuarioTelefone;
$vetorUsuario['usuarioCelular'] [$linha->usuarioCodigo] = $linha->usuarioCelular;
$vetorUsuario['usuarioEmail'] [$linha->usuarioCodigo] = $linha->usuarioEmail;
$vetorUsuario['usuarioFuncao'] [$linha->usuarioCodigo] = $linha->usuarioFuncao;
}
$this->setVetorUsuario($vetorUsuario);
}

function alteraUsuario() {
$sql = “UPDATE usuario
SET usuarioLogin = ‘”.$this->getUsuarioLogin().”‘
,usuarioNome = ‘”.$this->getUsuarioNome().”‘
,usuarioTelefone = ‘”.$this->getUsuarioTelefone().”‘
,usuarioCelular = ‘”.$this->getUsuarioCelular().”‘
,usuarioEmail = ‘”.$this->getUsuarioEmail().”‘
,usuarioFuncao = ‘”.$this->getUsuarioFuncao().”‘
WHERE usuarioCodigo = “.$this->getusuarioCodigo();

if($this->getUsuarioSenha() != md5(”")) {
$this->alteraSenha();
}

$resultado = mysql_query($sql) or die(mysql_error());
if($resultado) {
$objetoLog = new Log();
$objetoLog->setLogTabela(’usuario’);
$objetoLog->setLogSql($sql);
$objetoLog->setLogDataHora(date(”Y-m-d H:i:s”));
$objetoLog->insereLog();
}
}

function alteraSenha() {
$sql = “UPDATE usuario
SET usuarioSenha = ‘”.$this->getUsuarioSenha().”‘
WHERE usuarioCodigo = ‘”.$this->getusuarioCodigo().”‘ “;

$resultado = mysql_query($sql) or die(mysql_error());
if($resultado) {
$objetoLog = new Log();
$objetoLog->setLogTabela(’usuario’);
$objetoLog->setLogSql($sql);
$objetoLog->setLogDataHora(date(”Y-m-d H:i:s”));
$objetoLog->insereLog();
}
}
/* Fim metodo de acoes */
}
/* Fim classe */
?>

Autor: Andrey Pedro Lefkum
Obs.: Nesse exemplo não cheguei ao nível de explicar o que a Orientação Objetos.

SQL Injection - Para Iniciantes

Tuesday, October 31st, 2006

Este material é para aqueles que estão iniciando no PHP agora.

Com certeza já devem ter ouvido falar nesse termo, “SQL Injection”, que é uma maneira de enganar o sistema ou site inserindo SQL nos campos de login, senha, busca e outros.

A pouco tempo atrás quando estava buscando vídeos na internet, encontrei um site que precisava de cadastro para poder ver o site, e com preguiça de cadastrar, joguei um dos comandos mais básicos que é:

‘ OR ” = ” OR 1 = 1 OR ” = ‘

Esse comando deixa a validação de sistemas não seguros “LOUCOS”, permitindo o acesso sem precisar nem de um usuário e muito menos de uma senha. Mas aconselho, não façam isso em casa!

Bom esse foi um exemplo que fiz para o professor da Unerj, Manfred Heill Jr. com objetivo de apresentar a insegurança nos Sistemas de Informação.

Para entender melhor, faça o download do exemplo e faça alguns testes:

sqlInjection.zip

Esse exemplo tem como finalidade apenas mostrar furos nos SI, visando melhores aplicações para WEB.

Andrey Pedro Lefkum

Como mostrar totais sem contar os registros duplicados.

Friday, September 1st, 2006

Bom hoje estava com uma dúvida, na hora de montar uma paginação,
precisava saber o total que um sql poderia ter e mostrar as paginas com
os registros e os totais encontrados.

Problema: Tive que fazer um relacionamento com outra tabela que
retornava mais de uma vez o mesmo registro, então seria fácil, bastava
colocar um GROUP BY pelo código auto incrementável que estaria
resolvido e retornaria somente 1 registro. Mas o buraco era mais
embaixo, pois se colocar um GROUP BY quando se tem um COUNT o resultado
é o total de registros encontrados por usuário, no caso 2 para um
usuário, 3 para outro, enfim, o que estava precisando é tanto na
contagem total quanto no retorno da busca com os registros removessem
os duplicados:

SELECT count(distinct(codigo))
FROM usuarios
GROUP BY codigo

SELECT codigo, nome
FROM usuarios
GROUP BY codigo

Para esse problema pude contar com o Gerente de Projetos da Empresa Decisão Informática - Daniel Henrique Bonioli.

Garanto que já teve gente que precisou disso e não soube como resolver, agora fica aqui registrado para futuras pesquisas!

:D


This is a free Wordpress template provided by Mathew Browne | Web Design | SEO