Archive for the ‘Banco de Dados’ Category

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.

Instalar SQL Server com PHP (Vertrigo)

Friday, October 3rd, 2008

Eita… ó eu aqui depois de muito tempo sem postar…

Bom esse problema já tive várias vezes, que a dificuldade de instalar o SQL Server com PHP.

Primeiramente baixe o Vertrigo:
http://vertrigo.sourceforge.net/

Posteriormente Instale o SQL Server, que não sei onde é que você irá encontrar, ou imagino que já deva tê-lo em seu computador.

Ok, depois disso iremos precisar de 3 arquivos:

php_dblib.dll
php_pdo_mssql.dll
php_mssql.dll

Obs.: As três DLL’s acima você terá que encontrar na internet de acordo com a versão do PHP que está utilizando. Sempre que preciso baixo do site php.net

Agora abra o php.ini e adicione as seguintes linhas nas extensões:

extension=php_dblib.dll
extension=php_pdo_mssql.dll
extension=php_msql.dll

Obs.: Observe se não existe um ponto e vírgula antes de extension, isso quer dizer que está comentado e não funcionará.

Após realizar esse procedimento, reinicie seu serviço PHP, APACHE, etc…

Para não deixar dúvidas, reinicie sua máquina.

Agora crie um arquivo:

mssql_connect(”aaa”,”aaa”,”aaa”);
?>

Com certeza irá aparecer um erro. Se aparecer o seguinte erro:

Call to undefined function mssql_connect()

é porque não funcionou, caso apareça um erro que não conseguiu conectar ao servidor… \o está funcionando seu SQL SERVER com seu PHP.

Agora terei um repositório para não ter mais problemas com isso =)

Abraços

Paginação no SQL Server

Friday, June 20th, 2008

Está precisando fazer uma migração do Mysql para o Sql Server? Seu sistema tinha paginação? O Sql Server não tem o LIMIT?

Seus problemas “se acabaram-se” =)

Chegou a super paginação Paginator Tabajara 2.0:

SELECT cod_empresa, des_fantasia
FROM (
SELECT ROW_NUMBER()
OVER (
ORDER BY cod_empresa ASC
)
AS Row
,cod_empresa
,des_fantasia
FROM crm_empresa
WHERE des_fantasia LIKE ‘%abc%’
)
AS crm_empresa2
WHERE Row between 11 AND 20

Bom coloquei aqui para servir de repositório e não perder essa informação!

Em breve vou montar uma classe em PHP para paginação de dados…

Problemas ao conectar com banco SQL SERVER?

Monday, March 31st, 2008

Galera, tive esse problema quando estava tentando realizar uma integração entre dois bancos SQL SERVER de um CRM para um ERP. Quando tentava conectar com banco do ERP e executar uma query, retornava erro, porém se fosse executar o mesmo SQL no Studio Sql Server rodava corretamente.

Pesquisei na internet e fiz o seguinte:

Criei um driver ODBC em seu servidor com o nome TESTE

Após criado o driver corretamente utilize a função:

resource odbc_connect
( string $dsn
, string $user
, string $password
[, int $cursor_type
] )
http://us.php.net/manual/pt_BR/function.odbc-connect.php

$conexao = odbc_connect(”TESTE”,”usuario”,”senha”);

Depois de conectado com o banco através de um driver ODBC, para executar uma query no banco, faça o seguinte:

resource odbc_exec
( resource $connection_id
, string $query_string
[, int $flags
] )
http://us.php.net/manual/pt_BR/function.odbc-exec.php

odbc_exec($conexao, “SELECT * FROM tabela”);

Bom galera, para mais função e soluções de seus problemas utilize o manual do PHP.net:
http://us.php.net/manual/pt_BR/ref.odbc.php

Se alguém tiver dúvida pergunte… mas primeiro procure no GOOGLE =D
hehe

Abraço!

SQL Server - Data e Hora

Thursday, February 21st, 2008

Ae galera… uma rapidinha… =D

Converte a hora do banco SQL SERVER para HH:MM:SS

SELECT
convert(char(10),hora,108) as hora

Existe esse padrão também:

Só que aqui é direto no PHP… guerrero! =D

Converte a data para DD/MM/AAAA

$dat_contato = date(”d/m/Y”, strtotime($dat_contato));

Abraços!

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 ;^

Banco de Dados - Índice

Saturday, May 19th, 2007

Para não reescrever a roda =D

Antes de tudo leia:

http://pt.wikipedia.org/wiki/Banco_de_dados_relacional

Para quem não quer acessar o Wikipedia:

Índices

Um índice não é uma característica do Modelo Relacional, mas sim uma estratégia de otimização de consulta para implementações desse modelo. Isso acontece porque o Modelo Relacional é um modelo teórico, porém quando transformado em uma implementação as suas operações (tanto da álgebra quanto do cálculo) exigem um tempo de busca. Se os dados estiverem ordenados de uma forma ideal, esse tempo de busca pode ser bastante reduzido.

Os índices funcionam então como catálogos organizados de forma a beneficiar certo tipo de consulta. É possível imaginar que uma tabela seria associada a quantidade máxima de índices, porém isso traria muitos gasto de inserção e alteração. Por isso, em uma implantação de um banco de dados, são escolhidos os indíces mais adequados. Normalmente a chave primária é um índice.

O limitador é imposto exclusivamente pela ferramenta de software utilizada. Sendo assim, para a recuperação dos dados é necessário a existência de mecanismos que facilitem a consulta, proporcionando uma perfomance aceitável para a mesma. Para isso, os sistemas de bancos de dados relacionais criam índices das tabelas, sendo que esses índices são atualizados constantemente.

Caso o índice se corrompa por algum motivo, é possível que pesquisas possam retornar resultados não desejados ou que inserções de chaves duplicadas aconteçam. Nesse caso o banco de dados será corrompido também. Os sistemas de bancos (bases) de dados possuem mecanismos de evitar que esses eventos ocorram como também possibilitam a recuperação dos índices e consistência da tabela caso eles ocorram.

Porque usar índice?

Para que utilizar índice em um campo de uma tabela?

Vou responder com outra pergunta fazendo uma analogia a um livro:

Como você encontraria algum assunto em um livro sem olhar no índice? Com certeza teria que passar folha por folha até encontrar, e da mesma maneira ocorre com Bancos de Dados. Bom acho que não preciso mais dizer nada sobre o porque utiliza-los.

Ahh! Preciso sim… Fatos reais, uma empresa precisava de 12 horas para ter um relatório a algum tempo, quando foram implementados índices aos bancos de dados, eles reestruturaram o banco de dados adicionando índices… quando a consulta foi executada novamente eles tiveram uma surpresa, o mesmo relatório de 12 horas foi executado em menos de 1 segundo. (Fonte: Professor Mendes =D)

Como funciona?

Quando é criado um índice para determinado(s) campo(s) em uma tabela, é gerado uma nova tabela com todos os registros do(s) campo(s) a qual está criando de forma ordenada, com o endereço do registro na tabela mãe, ou aquela aquela com todos os registros e não somente os índices e endereçamento. Resumindo, fazendo novamente uma analogia a um livro, ele coloca o número da página que determinado conteúdo se encontra.

Banco de Dados Relacional

Fonte: Aula de Banco de Dados da Facul =D

MYSQL - Calculando a idade no SQL

Monday, February 5th, 2007

Após o super artigo mostrando como calcular a idade de um indivíduo com JavaScript, estou aqui com um outro super, hiper artigo (Modesto) para mostrar como calcular a idade com SQL.

Vamos lá:

É simples de montar, bastar passar como parâmetro o campo DATA:

SELECT usuarioNome
,(
YEAR(CURDATE()) - YEAR(usuarioNascimentoData)) - (RIGHT(CURDATE(),5) < RIGHT(usuarioNascimentoData,5)) AS usuarioIdade

FROM usuario

WHERE usuarioNome LIKE ‘%andrey%’

Fácil e objetivo!
Se tiverem alguma dúvida, basta postar aqui!
E lembrando, usou o código, é obrigatório deixar seu regado ;)

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


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