SQL Server 2005 Collate vs PHP

Então pessoal, dessa vez foi realmente foda.
NUNCA fiquei tanto tempo sem postar aqui, e tipo, não devia ter feito isso. Seriously.

Tirei férias, peguei freela, quebrei o dedo mindinho da mão esquerda, aprendi a mexer com ‘opensocial’, aprendi a mexer com muita coisa, comprei um Motorola Milestone (com Android!! Daqui a pouco, posts sobre Android aqui pra vocês!!), troquei de emprego, troquei de emprego de novo.

Enfim, no meu novo emprego, na Plan B, passei por um probleminha não muito comum (eu acho), lidar com PHP buscando dados de uma base em SQL Server 2005.

Eu estava trabalhando num arquivo cuja codificação era UTF-8. Na hora de exibir os dados vindos do banco, dava erro na codificaão, exibindo aquele caractere com uma ‘?’ dentro de um losango (acho que todo developer conhece esse símbolo!! hahaha..).
Fui tentando as opções de praxe:

<?php
    echo utf8_encode($bd->nome);
    echo utf8_decode($bd->nome);
    echo utf8_encode(htmlentities($bd->nome));
    echo htmlentities(utf8_encode($bd->nome));
    echo utf8_decode(htmlentities($bd->nome));
    echo htmlentities(utf8_decode($bd->nome));
?>

Acontece que a collation padrão do SQL Server é SQL_Latin1_General_CP1_CI_AS. E isso eu só descobri depois.
Qual foi então a minha solução?! Depois de umas belas pesquisadas e uma grande ajuda do Leandro Rodrigues, conseguimos foi na query de busca dos dados, fazermos um CAST no campo e definimos a collation dele ali mesmo, dessa maneira:

SELECT CAST({campo} AS {tipo}) COLLATE {collation} AS {alias}
FROM {tabela}'

Então, o caso foi colocar a collation ‘Latin1_General_BIN’, ficando assim:

SELECT CAST(nome AS nvarchar(255)) COLLATE Latin1_General_BIN AS nome
FROM usuarios'

E depois, colocar no PHP a função ‘uft8_encode();’ na hora de exibir os dados.

<?php
    echo utf8_encode($bd->nome);
?>

Pra quem nunca mexeu com SQL Server e achar estranho, eu digo SIM, existe um tipo de dado chamado ‘nvarchar’, com esse ‘N’ na frente mesmo. ;D

Então é isso, a solução foi essa e funcionou perfeitamente.

Um grande abraço, pessoal!!

Resolvendo erro ‘411 Length Required’ em requisições Ajax com jQuery

Olá pessoal, quanto tempo, né?! Pois é, abandonei meu blog, mas vou voltar!

Hoje passei por um ‘problema’ novo na empresa onde trabalho. Numa página que faz uma requisição Ajax com jQuery, no Firefox 3.1, a requisição estava retornando erro ‘411 Length Required’. Esse erro é retornado pelo browser quando em uma requisição HTTP não é retornado o tamanho do resultado, o que em alguns casos, pode fazer com que o browser não consiga calcular o tempo de download da página, por exemplo. Ao que me pareceu, o Firefox 3.5 sabe tratar isso, porém, o 3.1 não. Não testei no Chrome, IE, Opera, etc, mas creio que pelo menos o IE não sabe tratar isso também.

Normalmente, esse erro é obtido em requisições Ajax. Nesse post não vou entrar em detalhes sobre como especificar o tamanho de uma requisição no cabeçalho de uma página com Ajax puro, vou pular diretamente para jQuery, que foi onde tive esse ‘problema’ hoje.

Uma requisição Ajax simples em jQuery (depois vou criar um post sobre como criar requisições Ajax com jQuery), funciona assim:

$.ajax({
    type : 'POST',
    url : './pagina.php',
    success : function(data){
        alert(data);
    }
});

Essa requisição simplesmente ‘chama’ o conteúdo da página ‘pagina.php’ e executa um ‘alert’ no retorno. O Firefox 3.5, como coloquei acima, executa esse script normalmente, pegando o retorno ‘data’ e colocando no ‘alert’, porém, no Firefox 3.1, o script não é executado e o erro ‘411 Length Required’ é retornado.

Esse erro é retornado, pelo fato de nenhum parâmetro estar sendo enviado para a página ‘pagina.php’, para resolvermos esse problema no jQuery, basta colocarmos a linha:


data : {}

Ficando assim:

$.ajax({
    type : 'POST',
    url : './pagina.php',
    data : {},
    success : function(data){
        alert(data);
    }
});

Com apenas isso, o Firefox 3.1 e outros browsers que não interpretam o tamanho da requisição quando não é enviado nenhum parâmetro para a página de destino, continuam executando o script normalmente.

Espero que tenha ajudado.
Um abraço e uma ótima semana! =]

Criando ‘snippets’ no ‘Zend Studio for Eclipse 6’

Olá pessoal, essa noite, conversando com o Breno (@brenowd), ele veio me perguntar como funcionam os ‘snippets’ no Zend Studio.

Pra quem não sabe, ‘snippets’ são templates, ou seja, partes de códigos prontas para agilizarmos nosso trabalho. Na minha opinião, snippets nos deixa um pouco preguiçosos, mas dependendo, realmente nos quebram um galhão! Hehehe..

Bem, o Breno estava acostumado a usar o Dreamweaver, e queria passar a usar o Zend, e estava querendo criar um snippet para um SELECT de uma query MySQL. Então, mãos à obra.

Para criar um snippet no Zend Studio for Eclipse 6, vamos no menu Window > Preferences:

Window > Preferences

Na janela que abre, no campo de pesquisa, digite snippet, logo em seguida em PHP > Templates:

captura_de_tela-3png

Vou dar o exemplo aqui, da criação de um snippet de uma query em MySQL, um SELECT pra ser mais preciso. Clicando em New, temos essa tela:

captura_de_tela-4pngEm ‘name’ você coloca uma palavra para identificar o snippet que está criando, e ao mesmo tempo, a palavra que vai iniciar seu snippet. Em Context é o contexto da linguagem, PHP, PHPDoc ou New PHP (não me pergunte o que é New PHP), e em Pattern, o padrão do nosso snippet. Coloquei assim:

SELECT {$campos} FROM {$tabela};

Onde ‘{$campos}’ e ‘{$tabela}’ são, simplesmente, onde você quer que o cursos de posicione quando você acionar o snippet. O cursor ficará com o ‘{$campos}’ selecionado primeiro, e depois que você digitar qualquer coisa e der tab, ele pulará diretamente para o ‘{$tabela}’. Nesse print, esqueci de colocar o ‘{$END}’ que é onde você quer que o cursor pare depois que der o último tab:

captura_de_tela-6png

Na imagem anterior, mostro como usar o snippet dentro da função ‘mysql_query’, por exemplo. E o snippet é acionado pelo ‘name’, ao digitar, no meu caso, ‘select’ e teclar ctrl+espaço:

captura_de_tela-5png

Então, esse é o meu tutorial sobre snippets. Espero que sirva para alguém! =D