terça-feira, 15 de dezembro de 2009

PHP Tirar Acentos - remove special characters



function retira_acentos($texto)
{
$array1 = array( "á", "à", "â", "ã", "ä", "é", "è", "ê", "ë", "í", "ì", "î", "ï", "ó", "ò", "ô", "õ", "ö", "ú", "ù", "û", "ü", "ç"
, "Á", "À", "Â", "Ã", "Ä", "É", "È", "Ê", "Ë", "Í", "Ì", "Î", "Ï", "Ó", "Ò", "Ô", "Õ", "Ö", "Ú", "Ù", "Û", "Ü", "Ç" );
$array2 = array( "a", "a", "a", "a", "a", "e", "e", "e", "e", "i", "i", "i", "i", "o", "o", "o", "o", "o", "u", "u", "u", "u", "c"
, "A", "A", "A", "A", "A", "E", "E", "E", "E", "I", "I", "I", "I", "O", "O", "O", "O", "O", "U", "U", "U", "U", "C" );
return str_replace( $array1, $array2, $texto);
}
$texto = retira_acentos($variavel_q_quer_tirar_acentos);
$variavel_q_quer_tirar_acentos = $texto;

Se quiser ainda tirar carateres especiais como $ ou ª ou º entre outros sugiro um uso combinado de regex com str_replace conforme abaixo:

function retira_acentos($texto)
{
$array1 = array( "á", "à", "â", "ã", "ä", "é", "è", "ê", "ë", "í", "ì", "î", "ï", "ó", "ò", "ô", "õ", "ö", "ú", "ù", "û", "ü", "ç"
, "Á", "À", "Â", "Ã", "Ä", "É", "È", "Ê", "Ë", "Í", "Ì", "Î", "Ï", "Ó", "Ò", "Ô", "Õ", "Ö", "Ú", "Ù", "Û", "Ü", "Ç" );
$array2 = array( "a", "a", "a", "a", "a", "e", "e", "e", "e", "i", "i", "i", "i", "o", "o", "o", "o", "o", "u", "u", "u", "u", "c"
, "A", "A", "A", "A", "A", "E", "E", "E", "E", "I", "I", "I", "I", "O", "O", "O", "O", "O", "U", "U", "U", "U", "C" );
    $texto= str_replace( $array1, $array2, $texto);
    $texto=preg_replace("/[^a-z0-9\s\-]/i", "", $texto);
    $texto=preg_replace("/\s/", "_", $texto); // Replace all spaces with underline
return $texto;
}

$texto = retira_acentos($variavel_q_quer_tirar_acentos);

Para não ter problema com o nome do arquivo, sugiro usar assim:

// Descobrir os 4 ultimos caracteres do arquivo, por exemplo .pdf
$final = $arquivo_name;
$final = substr($final,(strlen($final)-4),strlen($final));

$nome_sem_final=substr($arquivo_name, 0, -4);

$arquivo_name = retira_acentos($nome_sem_final).$final;


Para achar a extensão do arquivo temos também:

$info = pathinfo($filename);
$name = $info['filename'];
$ext  = $info['extension'];

// Shorter
$name = pathinfo($file, PATHINFO_FILENAME);

// Or in PHP 5.4
$name = pathinfo($filename)['filename'];
 
 



Achar fonte de uma imagem



Siga as instruções do link abaixo:
http://new.myfonts.com/WhatTheFont/

quinta-feira, 3 de dezembro de 2009

VirtualBox Guest Additions

Quem atualizou o Ubuntu 8.0.4 atualmente pode ter problemas. Para sanar use o abaixo:

use o comando uname -r (troque KERNELVERSION pelo resultado no comando abaixo)
1. sudo apt-get install build-essential linux-headers-KERNELVERSION
2. Clique 2x no icone do virtualbox additions na área de trabalho e clique em auto-run
3. Desligue e ligue novamente a virtual machine e pronto!

sexta-feira, 27 de novembro de 2009

MySql - Apagar varios dados em varias tabelas


Para apagar dados com um, ou mais campos em comum:

Exemplo:
delete FROM t1,t2,t3 USING t1 INNER JOIN t2 INNER JOIN t3 where t1.id=t2.id and t2.id=t3.id and clientemaster=830

sexta-feira, 6 de novembro de 2009

Linux update Apache, PHP e MySQL de uma só vez



Faça primeiro:
apt-get update
apt-get dist-upgrade (para + info sobre esse link clique aqui)

Depois
apt-get install apache2 mysql-server-5.0 php5 php5-mysql libapache2-mod-php5 php5-cli php-pear

E não se esqueça:
apt-get install bind9
apt-get install exim4

sexta-feira, 23 de outubro de 2009

PHP Verificar Email em um form

Verifica se o email é valido assim como a existência do domínio.

if ($email) {
function valida_email($email){
$email = explode("@",$email); //Separa o nome de usuário do dominio do e-mail
if(count($email) != 2){ //Testa se existe o nome de usuário e o e-mail
return 0;
}
list($user,$domain) = $email;
if(!preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*$/xi",$user)){ //Testa se o email segue o padrão
return 0;
}
if(!checkdnsrr($domain,"MX")){ //Testa se existe a entrada MX
return 0;
}
return 1;
}

$v_email = valida_email($email);

if ($v_email=='0') {
die ("Por favor verifique o endereço de email.");
}
}

quarta-feira, 21 de outubro de 2009

Linux Pasta Compartilhada no Sun VirtualBox

Colocar SEMPRE no final do /etc/fstab

Ubuntu versão 8.x.x
NOME_DA_PASTA_COMPARTILHADA /var/www vboxsf defaults 0 0

Ubuntu versão 9.x.x
NOME_DA_PASTA_COMPARTILHADA /var/www vboxsf

Não esquecer de instalar o VBOXADDITIONS!

quinta-feira, 15 de outubro de 2009

MySQL - Copiar apenas arquivos inexistentes de uma tabela para outra

Notar que TABELA1_BKP2 é a tabela que contém o maior numero de inputs e TABELA1 é a tabela onde serão inseridos os dados.
Isso se deve ao fato de eu ter um backup com mais dados que minha tabela original, devido a um erro na hora de apagar alguns dados, como em minha tabela original todo dia entram novos cadastros não havia a possibilidade de apenas passar por cima voltando o backup.
Vale lembrar que as tabelas tem o mesmo numero de campos, assim como todos os campos tem as mesmas características.

Para localizar:
select * from TABELA1_BKP2 left join TABELA1 on TABELA1_BKP2.id = TABELA1.id where TABELA1.id is null;

Para copiar:
INSERT INTO TABELA1 ( id , Empresa , Endereco , Cidade , Estado , cep , DDI , DDD , Fone , Fax , nome , Cargo , cpfID , Atividade_Principal , Atividade , email , ip , data , cnpj , locamapa , disponivel ) select TABELA1_BKP2.id, TABELA1_BKP2.Empresa, TABELA1_BKP2.Endereco, TABELA1_BKP2.Cidade, TABELA1_BKP2.Estado, TABELA1_BKP2.cep, TABELA1_BKP2.DDI, TABELA1_BKP2.DDD, TABELA1_BKP2.Fone, TABELA1_BKP2.Fax, TABELA1_BKP2.nome, TABELA1_BKP2.Cargo, TABELA1_BKP2.cpfID, TABELA1_BKP2.Atividade_Principal, TABELA1_BKP2.Atividade, TABELA1_BKP2.email, TABELA1_BKP2.ip, TABELA1_BKP2.data, TABELA1_BKP2.cnpj, TABELA1_BKP2.locamapa, TABELA1_BKP2.disponivel from TABELA1_BKP2 left join TABELA1 on TABELA1_BKP2.id = TABELA1.id where TABELA1.id is null;

Agradecimento especial ao DFroz pelas dicas. Valeu Bro!! ;)

segunda-feira, 5 de outubro de 2009

MySQL - Criar usuário - dar e revogar privilégios para cada tabela

usuario geral com todos os privilégios
MYSQL> GRANT ALL PRIVILEGES ON NOME_DA_DATABASE.* TO USUARIO@localhost IDENTIFIED BY 'SENHA' WITH GRANT OPTION;

usuario específico com alguns privilégios(os principais)
MYSQL> CREATE USER 'USUARIO'@'localhost' IDENTIFIED BY 'SENHA';
MYSQL> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON NOME_DA_DATABASE.* TO USUARIO@localhost IDENTIFIED BY 'SENHA';

alterar senha:
SET PASSWORD FOR usuario_q_quer_trocar_senha@"localhost" = PASSWORD('UMA_SENHA_BEM_DIFICIL');
FLUSH PRIVILEGES;

revogar privilégios:

REVOKE ALL ON NOME_DA_DATABASE.* FROM 'teste'@'localhost';
REVOKE ALL ON NOME_DA_DATABASE.* FROM 'teste'@'%';



MySQL Alterar senha do root

mysqladmin -u root password uma_senha_dificil

Obs: Este comando deve ser executado do shell do linux.

OU passwd

terça-feira, 22 de setembro de 2009

MySQL Duplicar o conteúdo de uma tabela

CREATE TABLE nova_tabela SELECT * FROM tabela_original;

terça-feira, 18 de agosto de 2009

Bordas arredondadas em fotos PhotoShop CS4

1) Selecionar a "Custom Shape Tool";
2) Dentro das opções selecionar "Rounded Rectangle Tool";
     2a) Selecionar os Radius (quanto maior mais arredondada a borda, nesse exemplo usar 20px);
     2b) Selecionar a opção "Create New Shape Layer";
     2c) Selecionar o Style "1 px Stroke 0 Fill Opacity" (penultimo Style);
3) Selecionar a área desejada na imagem e clicar com o botão da direita do mouse e escolher a opção "Make a selection";
4) Escolher o layer que esta com a imagem (em geral esta no "Background");
5) Copiar e colar onde desejar.

quarta-feira, 29 de julho de 2009

Upload de arquivos com bloqueio de tipo (Jscript)

<script>
function testaTudo(form) {

var i=0;
var Ctrl=new Array();

var nome = document.procurado.arquivo.value;

if (nome) {

var extensoesOk = ",.gif,.jpg,.pdf,";

var extensao = "," + nome.substr( nome.length - 4 ).toLowerCase() + ",";

if(extensoesOk.indexOf( extensao ) == -1) {
Ctrl[i++] = "Formato invalido do arquivo.\n";y=1;
}
}


if (y==1) {
validatePrompt (Ctrl.join(""),'')
return (false);
y=0;
}
else return (true);
}


function runSubmit (form) {
if (!testaTudo(form)) return;
document.procurado.submit();
return;
}


function validatePrompt (PromptStr) {
alert ("Os campos abaixo são obrigatórios:\n\n"+PromptStr);
return;
}


</script>

<form action='#' method="post" name="procurado" enctype="multipart/form-data" onSubmit="return false;">


<input type="file" name="arquivo" size="20" class="preto" id="arquivo" />
<input type="submit" value="Gravar" onClick="runSubmit(this.form, this);" />

</form>

terça-feira, 7 de julho de 2009

Códigos de erro de envio de email

Código numérico: 5.0.0

Causa possível: Mailbox full

Código numérico: 5.1.0

Causa possível: Esse código indica uma falha geral baseada no categorizador (falha de endereço incorreto). Um endereço de email ou outro atributo não pode ser encontrado no diretório. Esse problema poderá ocorrer se as entradas do contato não tiverem o conjunto de atributos ‘targetAddress’. Esse problema ocorre com mais freqüência quando o categorizador recebe erros ‘objeto não encontrado’ ao tentar recuperar a propriedade ‘homeMDB’.

Também pode ocorrer se tiver usado o Microsoft Outlook para salvar um email como um arquivo e um usuário tiver aberto e reaplicado essa mensagem em modo offline. A propriedade da mensagem somente preserva o legacyExchangeDN quando o Outlook entrega a mensagem. Por isso, a busca homeMDB pode falhar.

Solução de problemas: Verifique o endereço do destinatário e envie a mensagem novamente. Verifique se o endereço do destinatário está formatado corretamente e se o categorizador conseguiu resolver o destinatário.

Código numérico: 5.1.1

Causa possível:
• A conta de email não existe na organização para a qual a mensagem foi enviada. Esse problema pode surgir se tiver ocorrido algum problema quando os usuários foram movidos entre os sites. Por exemplo, se um usuário for movido para um servidor em um grupo administrativo diferente e, em seguida, responder a uma mensagem antiga, ou se o usuário não recriar o seu perfil do Outlook, será usado o endereço herdado do grupo administrativo antigo e será gerada uma notificação de falha na entrega.
• A mensagem foi enviada para entradas do catálogo particular de endereços obsoletas.
• O categorizador rejeitou a entrega porque você configurou o contato SMTP com caracteres do comentário SMTP RFC821.
Solução de problemas: Use o procedimento de solução de problemas descrito para o código numérico 5.1.0.

Código numérico: 5.1.3

Causa possível: Sintaxe de endereço incorreta. Por exemplo, um contato está configurado com um atributo ‘targetAddress’ que não possui um tipo de endereço.

Solução de problemas: Use o procedimento de solução de problemas descrito para o código numérico 5.1.0.

Código numérico: 5.1.4


Causa possível: Dois objetos têm o mesmo endereço proxy e o email foi enviado para esse endereço. Este problema também pode ocorrer se o destinatário não existir no servidor remoto.

Solução de problemas: Verifique o endereço do destinatário e envie a mensagem novamente.

Código numérico: 5.1.6

Causa possível: Os atributos de diretório do usuário, como homeMDB ou msExchHomeServerName, podem estar ausentes ou corrompidos.

Solução de problemas: Verifique a integridade dos atributos de diretório do usuário e execute o Serviço de Atualização de Destinatário novamente para ter certeza de que os atributos necessários para o transporte são válidos.

Código numérico: 5.1.7

Causa possível: O remetente tem um atributo de mensagem malformado ou ausente na estrutura de diretório. O categorizador Transporte não pode entregar o item de email sem um atributo de mensagem válido.

Solução de problemas: Verifique a estrutura de diretório do remetente e determine se o atributo de mensagem existe.

Código numérico: 5.2.1

Causa possível: A mensagem local foi recusada porque é muito grande. A ausência de um SID (Identificador de Segurança) da Conta Principal no destinatário também pode causar essa mensagem de erro.

Solução de problemas: Verifique as permissões de acesso além do tamanho da mensagem. Determine se o destinatário tem um SID.

Código numérico: 5.2.2

Causas possíveis: A caixa de correio do destinatário está acima de seu limite de armazenamento.

Solução de problemas: Verifique o armazenamento da caixa de correio e o limite de cota de armazenamento da fila.

Código numérico: 5.2.3


Causa possível: A mensagem é muito grande para a cota local. Por exemplo, um usuário remoto do Exchange pode ter restrições de entrega definidas com tamanho máximo da mensagem de entrada.

Solução de problemas: Envie a mensagem novamente sem anexos ou defina o limite do lado do servidor ou do lado do cliente que permita um tamanho de mensagem maior.

Código numérico: 5.3.0

Causas possíveis: O Exchange Server 2003 tem um recurso que permite que o Exchange 2003 opere sem o MTA (Agente de transferência de mensagens). Se uma mensagem foi enviada incorretamente usando o roteiro rota do MTA, esta notificação de status de entrega será retornada para o remetente.

Observação Apesar de o Exchange 2003 poder operar com o MTA, a Microsoft não recomenda ou oferece suporte a essa configuração.

Para ativar esse recurso e evitar que mensagens entrem na fila do MTA, execute as seguintes etapas:
1. Desabilite o serviço MTA.
2. Defina o valor DWORD para 0 nas seguintes subchaves do Registro para cada banco de dados de armazenamento de informações e armazenamento de pastas públicas:
HKLM\System\CurrentControlSet\Services\MsExchangeIS\\
\Gateway In Threads

HKLM\System\CurrentControlSet\Services\MsExchangeIS\\
\Gateway Out Threads
Ao fazer isso, você estará disponibilizando recursos de armazenamento associados com a entrega do MTA.
3. Reinicie o armazenamento de informações.
Solução de problemas: Verifique a topologia de roteamento. Use a ferramenta WinRoute para verificar se as rotas são corretamente replicadas entre servidores e grupos de roteamento.

Código numérico: 5.3.3

Causa possível: O servidor remoto Exchange 2000 ou o servidor remoto Exchange 2003 não possui armazenamento em disco para conter email. Esse problema ocorrerá com mais freqüência quando o servidor de envio estiver enviando email com BDAT (DADOS binários). Esse código pode indicar também um erro de protocolo SMTP.

Solução de problemas: Verifique se o servidor remoto tem armazenamento suficiente para conter email e examine se há erros no log de protocolo SMTP.

Código numérico: 5.3.5


Causa possível: Foi detectada uma situação em que o servidor está configurado para retornar para si próprio.

Solução de problemas: e você tiver vários servidores virtuais SMTP configurados em seu computador do Exchange, verifique se eles estão funcionando como portas de entrada exclusivas e se a configuração da porta de saída SMTP é válida para evitar o loop entre servidores virtuais locais. Verifique a configuração dos conectores do servidor em relação a loops.

Por exemplo, certifique-se de que não integradores com espaço de endereço da organização local, exceto se você compartilhar o domínio e não selecionar Usar DNS para rotear cada espaço de endereço neste conector.
Certifique-se de que, se houver vários servidores virtuais, nenhum está definido para Todos os não atribuídos.

Código numérico: 5.4.0


Causas possíveis:
• Um host autoritativo não encontrado em DNS.
• A entrada do host inteligente está incorreta.
• O nome de domínio totalmente qualificado (FQDN) no arquivo HOSTS. Esse problema foi corrigido no Windows 2000 SP3.
• Há uma falha de DNS ou você construiu um endereço IP inválido para o seu host inteligente. *
• O SMTP VS não tem um nome de domínio totalmente qualificado (FQDN) válido ou sua consulta de FQDN do SMTP VS falhou.
• Um domínio SMTP do contato não resolve em nenhum espaço de endereçamento SMTP.

Solução de problemas: Use Nslookup para verificar o DNS. Verifique se o endereço IP está no formato literal do IPv4. Verifique se há uma entrada de DNS válida para o nome de servidor ou de computador em questão. Você está dependendo no FQDN no arquivo HOSTS, ignore-o e atualize a entrada no Exchange System Manager com um endereço IP válido ou nome correto.

Código numérico: 5.4.4


Causa possível: Não há rota para a mensagem, próximo salto não encontrado. Você instalou uma topologia Grupo de Roteamento, mas não há nenhum Conector de Grupo de Roteamento instalado entre os Grupos de Roteamento.

Solução de problemas: Adicione ou configure o seu Conector de Grupo de Roteamento entre os Grupos de Roteamento.

Código numérico: 5.4.6

Causa possível: Um loop de encaminhamento do categorizador foi detectado.
O atributo ‘targetAddress’ está definido em um usuário habilitado para caixa de correio. Pacote de host: Há um problema comum de configuração de host quando alguém cria um contato na OU (unidade organizacional) 1 e cria um usuário na OU 2 com o mesmo endereço de email usando a ferramenta de configuração do usuário

Solução de problemas:
• Este problema ocorre quando o contato A tem um destinatário alternativo que aponta para o contato B e o contato B tem um destinatário alternativo que aponta de volta para o contato A. Verifique o destinatário alternativo de cada contato.
• Verifique e remova o atributo ‘targetAddress’ de usuários habilitados para caixa de correio.
• Para hospedagem onde você deseja enviar email de um usuário em uma companhia (unidade organizacional) para outra companhia (unidade organizacional), é melhor configurar os seguintes objetos relacionados:
Usuário: Proxy SMTP: usuário@empresa.com
Contato: targetAddress: usuário@empresa.com; proxy SMTP: contact@company2.com

Código numérico: 5.4.8


Causa possível: Esse código indica uma condição de loop. Esse problema poderá ocorrer se uma das diretivas de destinatário contiver um domínio local que corresponda ao nome de domínio totalmente qualificado (FQDN) de um servidor Exchange na organização. Quando o categorizador processa email destinado a um domínio que corresponde ao nome de domínio totalmente qualificado (FQDN) de um servidor Exchange, é gerada uma notificação de falha na entrega com este código.

Solução de problemas: Se este problema ocorrer devido a um domínio que corresponde ao FQDN de um servidor Exchange na diretiva de destinatário, é necessário remover essa entrada.

Código numérico: 5.5.0

Causa possível: Erro de protocolo genérico (erro SMTP). A resposta do SMTP remoto ao nosso EHLO com um erro de nível 500 e o sistema de envio ENCERRARÃO a conexão e gerarão essa notificação de falha na entrega indicando que o servidor SMTP remoto não pode manipular o protocolo. (Por exemplo, se uma conta do Hotmail não estiver mais ativa, ocorrerá um erro SMTP 550).

Solução de problemas: Execute um log de protocolo SMTP ou um rastreamento de Monitor de Rede para ver o motivo pelo qual o servidor SMTP remoto rejeita a solicitação de protocolo.

Código numérico: 5.5.2


Causa possível: Isso se refere a um erro geral de protocolo quando protocolos SMTP estão fora de seqüência. Por exemplo, um erro de protocolo SMTP ocorre quando se tenta usar AUTH antes de EHLO. Em uma observação, isso ocorreu quando o sistema estava com uma condição de falta de disco.

Solução de problemas: Execute o log de protocolo SMTP ou um rastreamento do Monitor de Rede e verifique se há espaço em disco e memória virtual suficientes para que o SMTP opere.

Código numérico: 5.5.3


Causa possível: Excesso de destinatários na mensagem enviada.

Solução de problemas: O limite de destinatários é um limite configurável no servidor de recebimento. Para resolver esse problema, aumente o limite de destinatários ou divida a mensagem em várias mensagens para que se ajuste ao limite do servidor.

Observação: o limite padrão do destinatário em uma mensagem SMTP é 5.000. Para definir esse limite, iniciar o Exchange System Manager, clique no nó Configurações globais, clique com o botão direito do mouse em Entrega de mensagens e clique em Propriedades. Essa também pode ser uma configuração personalizada no Active Directory.

Código numérico: 5.6.3


Causas possíveis:
1. A mensagem contém mais de 250 anexos. Mais de 250 anexos geram o erro MAPI_E_TOO_BIG.
2. A mensagem foi enviada com um cabeçalho addr822 malformado.

Solução de problemas:
1. Reduza o número de anexos na mensagem e reenvie-a.
2. Corrija o cabeçalho. O erro é falso, já que indica que o NDR ocorre devido a cabeçalhos P2 com falha.

Código numérico: 5.7.0

Causa possível: Mailbox full


Código numérico: 5.7.1


Causas possíveis:
• Acesso geral negado, acesso ao remetente negado – o remetente da mensagem não tem os privilégios necessários para concluir a entrega.
• Você está tentando retransmitir sua mensagem por meio de outro servidor SMTP e ele não permite a retransmissão.
• O destinatário pode ter restrições de entrega de caixa de correio habilitadas. Por exemplo, uma restrição de entrega de caixa de correio do destinatário foi definida para receber de um grupo de distribuição apenas e emails que não sejam de membros serão rejeitados com este erro.
• No Exchange Server 2003, um grupo de distribuição pode ser configurado para restringir a entrega de mensagens de usuários não autenticados. Mensagens enviadas com uma sessão SMTP não autenticada serão rejeitadas.
Solução de problemas: Verifique os privilégios e atributos do sistema para o contato e tente enviar a mensagem novamente.

Além disso, certifique-se de que está executando o Exchange 2000 Service Pack 1 (SP1) ou posterior para outros problemas conhecidos em potencial.

segunda-feira, 6 de julho de 2009

PHP Inserir fotos automaticamente

<?php
                                $qtas_fotos = '12';
                                $colunas = '3';
                                $pasta = 'images/comfort/';
                                $nome_arquivo= 'foto';
                                $extensao = '.jpg';
                                $qtas_linhas = $qtas_fotos/$colunas;
                                list ($inteiro, $dizimo) = explode (".", $qtas_linhas);
                                if ($dizimo) $qtas_linhas = $inteiro+1;
                              
                                echo "<table>";
                              
                                $j=1;
                                for ($x=1; $x<=$qtas_linhas; $x++) {
                                echo "<tr>";
                                for ($i=1;$i<=$colunas;$i++) {
                               
                                if ($j>$qtas_fotos) break; // TEMOS APENAS X FOTOS...
                                echo "
                                <td align='center' style='padding:1px;'>
                                <img src='$pasta$nome_arquivo$j$extensao' />
                                </td>\n
                                ";
                              
                                $j++;
                                }
                                echo "</tr>\n";
                              
                                }
                                echo "</table>";
?>

quarta-feira, 3 de junho de 2009

MySQL pesquisa mais rapida

Indices lose their speed advantage when using them in OR-situations:

SELECT * FROM a WHERE index1 = 'foo'
UNION
SELECT * FROM a WHERE index2 = 'baar';

is much faster than

SELECT * FROM a WHERE index1 = 'foo' OR index2 = 'bar';

terça-feira, 19 de maio de 2009

PHP - CGI Troca de caracteres

CGI
$totalV1 = '100.00';
$totalV1 =~ s/\./\,/; # troca . para ,
print $totalV1;

Notar o uso de \. pois . é um caracter especial assim com a virgula.
Em outros casos usar:

$totalV1 = 'ab.cd';
$totalV1 =~ s/ab/yx/; # # troca ab para yx
print $totalV1;

PHP
$valor1 = '100.00';
$valor = troca($valor1);

echo $valor;

function troca($string) {
$string = str_replace(".", ",", $string);
return $string;


Tirar tudo que não for letra (tanto numero quanto caracteres especiais):

$nome_cliente1=preg_replace('/[^A-Za-z0-9_]/', '', $nome_q_quer_tirar_os_caracteres);
$nome_cliente=trim($nome_cliente1); // esse comando tira os espaços em branco.

}

quinta-feira, 14 de maio de 2009

Fechar janela principal automaticamente

Esses comandos fecham a janela principal automaticamente, sem fazer a pergunta "Deseja fechar essa janela?".

Funciona apenas no IE6

<script>
window.opener=null;window.close();
</script>

Funciona no IE7

// utilize antes ou depois do "body"
<object id="WB" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2">
</object>

<script>
javascript:WB.ExecWB(45,2); // comando que fecha a janela
</script>

sexta-feira, 8 de maio de 2009

Caracteres Especiais

Caracteres Acentuados no Português:

á &aacute;
Á &Aacute;
ã &atilde;
à &Atilde;
â &acirc;
 &Acirc;
à &agrave;
À &Agrave;
é &eacute;
É &Eacute;
ê &ecirc;
Ê &Ecirc;
í &iacute;
Í &Iacute;
ó &oacute;
Ó &Oacute;
õ &otilde;
Õ &Otilde;
ô &ocirc;
Ô &Ocirc;
ú &uacute;
Ú &Uacute;
ü &uuml;
Ü &Uuml;
ç &ccedil;
Ç &Ccedil;


Caracteres Especiais

espaço &nbsp;
& e comercial &amp;
> maior que &gt;
< menor que &lt;
ˆ acento circunflexo &circ;
˜ acento til &tilde;
¨ acento trema &uml;
´ acento agudo &cute;
¸ cedilha &cedil;
" aspas duplas &quot;
“ e ” aspas duplas (esquerda e direita) &ldquo; e &rdquo;
‘ e ’ aspas simples (esquerda e direita) &lsquo; e &rsquo;
‹ e › aspas angulares simples (esquerda e direita) &lsaquo; e &rsaquo;
« e » aspas angulares duplas (esquerda e direita) &laquo; e &raquo;
º ordenal masculino &ordm;
ª ordinal feminino &ordf;
– travessão 'en' &ndash;
— travessão 'em' &mdash;
­ hífen oculto &shy;
¯ macron &macr;
… reticências &hellip;
¦ barra vertical &brvbar;
• marcador (bullet) &bull;
¶ parágrafo &para;
§ parágrafo legal &sect;
♠ espadas &spades;
♣ paus &clubs;
♥ copas &hearts;
♦ ouros &diams;


Caracteres Comerciais
© copyright &copy;
® marca registrada &reg
™ trade mark &trade;
£ libra esterlina &pound;
¢ centavo &cent;
€ euro &euro;
¥ iene (yen) &yen;
¤ símbolo monetário &curren;


Caracteres Matemáticos e Lógicos
¹ elevado a um &sup1;
² ao quadrado &sup2;
³ ao cubo &sup3;
½ fração um meio &frac12;
¼ fração um quarto &frac14;
¾ fração três quartos &frac34;
> maior que &gt;
< menor que &lt;
± mais ou menos &plusmn;
− sinal de subtração &minus;
× sinal de multiplicação &times;
÷ sinal de divisão &divide;
∗ asterisco &lowast;
⁄ barra de fração &frasl;
‰ por-mil &permil;
∫ sinal de integral &int;
∑ somatório &sum;
∏ PI &prod;
√ raiz quadrada &radic;
∞ infinito &infin;
≈ quase igual &asymp;
≅ aproximadamente igual &cong;
∝ proporcional &prop;
≡ idêntico &equiv;
≠ diferente &ne;
≤ menor ou igual &le;
≥ maior ou igual &ge;
∴ consequentemente &there4;
⋅ ponto &sdot;
· ponto do meio &middot;
∂ diferença parcial &part;
ℑ parte imaginária do número &image;
ℜ parte real do número &real;
′ minuto &prime;
″ segundo &Prime;
° grau &deg;
∠ ângulo &ang;
⊥ perpendicular &perp;
∇ nabla &nabla;
⊕ soma direta &oplus;
⊗ produto de vetor &otimes;
ℵ alef &alefsym;
ø produto vazio &oslash;
Ø produto vazio &Oslash;
∈ elemento de/pertence a &isin;
∉ nã é elemento de &notin;
∩ interseção &cap;
∪ união &cup;
⊂ subconjunto de &sub;
⊃ superconjunto de &sup;
⊆ subconjunto de ou igual a &sube;
⊇ superconjunto de ou igual a &supe;
∃ existe &exist;
∀ qualquer &forall;
∅ vazio &empty;
¬ não lógico &not;
∧ e lógico &and;
∨ ou lógico &or;
↵ retorno de carro &crarr;
← e → setas simples &larr; e &rarr;
↑ e ↓ setas simples &uarr; e &darr;
↔ seta simples &harr;
⇐ e ⇒ setas duplas &lArr; e &rArr;
⇑ e ⇓ setas duplas &uArr; e &dArr;
⇔ seta dupla &hArr;
⌈ e ⌉ teto (esquerdo e direito) &lceil; e &rceil;
⌊ e ⌋ piso (esquerdo e direito) &lfloor; e &rfloor;
◊ losango &loz;


Outros Acentos e Caracteres Especiais
ñ &ntilde;
Ñ &Ntilde;
¡ &iexcl;
¿ &iquest;
ä &auml;
Ä &Auml;
å &aring;
Å &Aring;
ë &euml;
Ë &Euml;
è &grave;
È &Egrave;
ï &iuml;
Ï &Iuml;
ì &igrave;
Ì &Igrave;
î &icirc;
Î &Icirc;
ö &ouml;
Ö &Ouml;
ò &ograve;
Ò &Ograve;
ù &ugrave;
Ù &Ugrave;
û &ucirc;
Û &Ucirc;
ý &yacute;
Ý &Yacute;
ÿ &yuml;
Ÿ &Yuml;
æ &aelig;
Æ &AElig;
œ &oelig;
Π&OElig;
† &dagger;
‡ &Dagger;
š &scaron;
Š &Scaron;
þ &thorn;
Þ &THORN;
ð &eth;
Ð &ETH;
§ &sect;
ƒ &fnof;
ß &szlig;
µ &micro;


Caracteres Gregos
α &alpha; Α &Alpha; β &beta; Β &Beta;
γ &gamma; Γ &Gamma; δ &delta; Δ &Delta;
ε &epsilon; Ε &Epsilon; ζ &zeta; Ζ &Zeta;
η &eta; Η &Eta; θ &theta; Θ &Theta;
ι &iota; Ι &Iota; κ &kappa; Κ &Kappa;
λ &lambda; Λ &Lambda; μ &mu; Μ &Mu;
ν &nu; Ν &Nu; ξ &xi; Ξ &Xi;
ο &omicron; Ο &Omicron; π &pi; Π &Pi;
ρ &rho; Ρ &Rho; σ &sigma; Σ &Sigma;
ς &sigmaf; τ &tau; Τ &Tau; υ &upsilon;
Υ &Upsilon; φ &phi; Φ &Phi; χ &chi;
Χ &Chi; ψ &psi; Ψ &Psi; ω &omega;
Ω &Omega; ϑ &thetasym; ϒ &upsih; ϖ &piv;

terça-feira, 5 de maio de 2009

Criar gif animado no PhotoShop CS3

Montar os layers como desejar e depois clicar em:

window -> workspace -> video and film

segunda-feira, 4 de maio de 2009

MySQL Exportar / Importar todas as bases




Fazer um backup de todas as tabelas, com acentuação:

Os comandos abaixo devem ser feitos direto no shell do Linux.

Exportar
mysqldump -u USERNAME -pPASSWORD --default-character-set=latin1 --all-databases >todas.sql

mysqldump --all-databases > dump-$( date '+%Y-%m-%d_%H-%M-%S' ).sql -u root -p

Exportar e criar um tar:

mysqldump --opt <database> | gzip -c | ssh user@wherever 'cat > /tmp/yourfile.sql.gz'

Importar

Para importar o arquivo todas.sql:
mysql -u root -p < todas.sql

Para importar apenas uma base de dados:
mysql -u usuario -p basededados < backup-file.sql

quarta-feira, 22 de abril de 2009

JavaScript: Verificar se a data digitada esta correta

Em javascript.

function meses(nome_Campo) {

    uA = document.getElementById(nome_Campo).value;
    var y=0;
    var today=new Date()

    if (uA!='' && uA.length <10) {
        frase = nome_Campo+" - A data esta incompleta";
        y=1;
    }

    dia = (uA.substring(0,2));
    mes = (uA.substring(3,5));
    ano = (uA.substring(6,10));

    myday    = today.getDate();
    mymonth = today.getMonth()+1;
    myyear    = today.getFullYear();

    if (mymonth <=9) mesT = "0"+mymonth;
    else mesT = mymonth;

    if (myday <=9) diaT = "0"+myday;
    else diaT = myday;

    if (dia < 1 && dia !='') {
        alert (nome_Campo+" - O dia não pode ser 0");
        y=1;
    }

    if (mes > 12) {
        alert (nome_Campo+" - O mês não pode ser maior que 12.");
        y=1;
        }

    if (dia && mes) {
        //alert (dia+mes);
        if (!ano) {
            alert (nome_Campo+" - Favor preencher o ANO da data");
            y=1;
            }
        else {   
        if (ano < (myyear-1)) {
                alert (nome_Campo+" - O ano não pode ser menor que "+(myyear-1));
                y=1;
                }
        if (ano > (myyear+1)) {
            alert (nome_Campo+" - O ano não pode ser maior que "+(myyear+1));
            y=1;
            }
        }
    }
    if (((mes =="04") || (mes =="06") || (mes =="09") || (mes =="11")) && (dia >= "31")) {
    alert (nome_Campo+" - O mês escolhido tem 30 dias, favor redigitar a data.");
    y=1;
    }
    if (((mes =="01") || (mes =="03") || (mes =="05") || (mes =="07") || (mes =="08") || (mes =="10") || (mes =="12")) && (dia > "31")) {
    alert (nome_Campo+" - O mês escolhido tem 31 dias, favor redigitar a data.");
    y=1;
    }
    if ((mes =="02") && (dia >= "30")) {
    alert (nome_Campo+" - O mês escolhido tem 29 dias, favor redigitar a data.");
    y=1;
    }

    if (y==1) {
        document.getElementById(nome_Campo).value = "";
        //document.getElementById(nome_Campo).focus();
        }

    }

HTML:
<input type='text' value='' class='preto' name='data1' id='data1' size='10' maxlength='10' onkeyup='formataData(this)' onChange=meses('data1')> - <input type='text' value='' class='preto' name='data2'id='data2' size='10' maxlength='10' onkeyup='formataData(this)' onChange=meses('data2')>

sexta-feira, 17 de abril de 2009

Apenas numeros

JScript

function valida(qual,nome_Campo) {
if(isNaN(qual)) {
window.alert("Este campo aceita APENAS números!");
document.getElementById(nome_Campo).value = "";
document.getElementById(nome_Campo).focus();
}
}

HTML

<input size='15' name='peso' id='peso' onblur=valida(this.value,'peso'); >

OU Essa q não deixa digitar e bloqueia CTRL C e CTRL V

JScript

function SomenteNumero(e){
    var tecla=(window.event)?event.keyCode:e.which;  
    if((tecla>47 && tecla<58)) return true;
    else{
        if (tecla==8 || tecla==0 || tecla==13) return true;
    else  return false;
    }
}

 HTML

<input size=10 type=text name="valor" onkeypress='return SomenteNumero(event)' value='' />

Data - dd/mm/aaaa

Jscript

function formataData(obj) {
if(obj.value.length == 2 || obj.value.length == 5){
obj.value = obj.value + '/';
}
}

HTML

< input name="data" type="text" size="10" maxlength="10"
onkeyup="formataData(this)" />

Desativar botão direito do Mouse

A função abaixo, em javascript, desativa o botão da direita do Mouse em todos os Browsers(IE7, FF 3, Chrome)

function click() {
if (event.button==2||event.button==3) {
oncontextmenu='return false';
}
}
document.onmousedown=click
document.oncontextmenu = new Function("return false;")

quinta-feira, 16 de abril de 2009

Mudar o valor do onclick

Para alterar o valor de onclick de show para hide, assim como o simbolo + para -:

<input type=button Onclick=show('1'); class=vermelhop value='[+]' id='botao1'> adicionar nova característica logistica
<div id="faq1">
Texto a ser escondido
</div>

<script language="Javascript">

var div = "faq" //DEFINE QUAL O NOME DOS DIV'S
var botao = "botao"
var total = 1 //DEFINE O NUMERO DE DIV'S
initHide()

function show(id)
{
document.getElementById(div+id).style.display="block";
document.getElementById(botao+id).value="[-]";
var mudar = document.getElementById(botao+id);
mudar.onclick = function(){
hide(id);
};
}

function hide(id)
{
document.getElementById(div+id).style.display = "none";
document.getElementById(botao+id).value="[+]";
var mudar = document.getElementById(botao+id);
mudar.onclick = function(){
show(id);
};
}

function initHide(){
for(i=1; i<=total; i++){
document.getElementById(div+i).style.display = "none";
}
}
</script>

domingo, 29 de março de 2009

PHP Fazer upload com pastas diferentes

Esse post é para fazer um upload seguindo a numeração id do banco de dados de sinistros, ou seja ele cria uma pasta, caso ela não exista, e faz o upload se o nome do arquivo não existir dentro da pasta.

<?php
/* Defina aqui o tamanho máximo do arquivo em bytes: */
if($arquivo_size > 10240000) {
print "<SCRIPT> alert('Seu arquivo não poderá ser maior que 10mb'); window.history.go(-1); </SCRIPT>\n";
exit;
}

/* Defina aqui o diretório destino do upload */
if (!empty($arquivo) and is_file($arquivo)) {
if (!$qw) $xQ = "bd/downloads";
else $xQ='downloads';
chdir("$xQ");
// pega o endereço do diretório
$diretorio = getcwd();
// abre o diretório
$ponteiro = opendir($diretorio);
// monta os vetores com os itens encontrados na pasta
while ($nome_itens = readdir($ponteiro)) {
$itens[] = $nome_itens;
}

// ordena o vetor de itens
sort($itens);
// percorre o vetor para fazer a separacao entre arquivos e pastas
foreach ($itens as $listar) {
// retira "./" e "../" para que retorne apenas pastas e arquivos
if ($listar!="." && $listar!=".."){

// checa se o tipo de arquivo encontrado é uma pasta
if (is_dir($listar)) {
// caso VERDADEIRO adiciona o item à variável de pastas
$pastas[]=$listar;
} else{
// caso FALSO adiciona o item à variável de arquivos
$arquivos[]=$listar;
}
}
}

// lista as pastas se houverem
if ($pastas != "" ) {
foreach($pastas as $listar){
//echo "Pasta:$listar<br>";
if ($listar==$id_sinistro) $vai_pasta=1;
}
}

if ($vai_pasta!=1) {
$pasta = "$id_sinistro";
mkdir ($pasta, 0755);
}

chdir("$id_sinistro");
// pega o endereço do diretório
$diretorio = getcwd();

// abre o diretório
$ponteiro = opendir($diretorio);
// monta os vetores com os itens encontrados na pasta
while ($nome_itens = readdir($ponteiro)) {
$itens[] = $nome_itens;
}

// ordena o vetor de itens
sort($itens);
// percorre o vetor para fazer a separacao entre arquivos e pastas
foreach ($itens as $listar) {
// retira "./" e "../" para que retorne apenas pastas e arquivos
if ($listar!="." && $listar!=".."){

// checa se o tipo de arquivo encontrado é uma pasta
if (is_dir($listar)) {
// caso VERDADEIRO adiciona o item à variável de pastas
$pastas[]=$listar;
} else{
// caso FALSO adiciona o item à variável de arquivos
$arquivos[]=$listar;
}
}
}
// lista os arquivos se houverem
if ($arquivos != "") {
foreach($arquivos as $listar){
//echo "Arquivo:$listar<br>";
if ($listar==$arquivo_name) $vai_arquivo=1;
}
}
if ($vai_arquivo==1) {
print "<h3><center>Arquivo não enviado!</center></h3>";
print "<h4><font color='#FF0000'><center>Já existe esse nome de arquivo favor alterar.</center></font></h4>";
if ($qw) print "<br><a href='javascript:history.go(-1)'>« voltar</a>";
exit;
}

$caminho=$caminho.$arquivo_name;

/* Defina aqui o tipo de arquivo suportado */
if ((eregi(".zip$", $arquivo_name)) || (eregi(".ZIP$", $arquivo_name)) || (eregi(".xls$", $arquivo_name)) ||
(eregi(".xlsx$", $arquivo_name)) || (eregi(".doc$", $arquivo_name)) || (eregi(".docx$", $arquivo_name)) ||
(eregi(".gif$", $arquivo_name)) || (eregi(".jpg$", $arquivo_name))) {
copy($arquivo,$caminho);
//print "<h1><center>Arquivo enviado com sucesso!</center></h1>";
}
else{
print "<h1><center>Arquivo não enviado!</center></h1>";
print "<h2><font color='#FF0000'><center>Caminho ou nome de arquivo Inválido!</center></font></h2>";
exit;
}
}

Ao selecionar mostrar campo oculto

Notar que o campo já esta programado para não aparecer de cara, comando initHide no Javascript.

Comandos para fazer "sumir/aparecer" campo:
<input type="radio" name="quem_refere" value="4" onClick="hide('1'); />Some<br>
<input type="radio" name="quem_refere" value="2" onClick="show('1'); />Aparece

Campo que "some/aparece":
<div id='faq1'>
OLA MUNDO... ou não...
</div>

<script language="Javascript">

var div = "faq" //DEFINE QUAL O NOME DOS DIV'S
var total = 1 //DEFINE O NUMERO DE DIV'S
initHide()

function show(id)
{
document.getElementById(div+id).style.display="block";
}

function hide(id)
{
document.getElementById(div+id).style.display = "none";
}

function initHide(){
for(i=1; i<=total; i++){
document.getElementById(div+i).style.display = "none";
}
}
</script>

Mascara centavos

Temos a função jquery para fazer essa mascara:

Faça o download dos arquivos em http://plentz.github.io/jquery-maskmoney/

Para usar:
<script src="js/jquery-1.6.4.min.js"></script> <-- testei do 1.6.4 para cima
<script src="js/jquery.maskMoney.js" type="text/javascript"></script>

<input type=text name='valor' id='valor' size='10' />
<script type="text/javascript">$("#valor").maskMoney({thousands:'', decimal:'.'});</script>


E temos o abaixo também:

<script type='text/javascript'>
/* Autor: Mario Costa */
function formatar_moeda(campo, separador_milhar, separador_decimal, tecla) {
var sep = 0;
var key = '';
var i = j = 0;
var len = len2 = 0;
var strCheck = '0123456789';
var aux = aux2 = '';
var whichCode = (window.Event) ? tecla.which : tecla.keyCode;

if (whichCode == 13) return true; // Tecla Enter
if (whichCode == 8) return true; // Tecla Delete
key = String.fromCharCode(whichCode); // Pegando o valor digitado
if (strCheck.indexOf(key) == -1) return false; // Valor inválido (não inteiro)
len = campo.value.length;
for(i = 0; i < len; i++) if ((campo.value.charAt(i) != '0') && (campo.value.charAt(i) != separador_decimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(campo.value.charAt(i))!=-1) aux += campo.value.charAt(i); aux += key; len = aux.length; if (len == 0) campo.value = ''; if (len == 1) campo.value = '0'+ separador_decimal + '0' + aux; if (len == 2) campo.value = '0'+ separador_decimal + aux; if (len > 2) {
aux2 = '';

for (j = 0, i = len - 3; i >= 0; i--) {
if (j == 3) {
aux2 += separador_milhar;
j = 0;
}
aux2 += aux.charAt(i);
j++;
}

campo.value = '';
len2 = aux2.length;
for (i = len2 - 1; i >= 0; i--)
campo.value += aux2.charAt(i);
campo.value += separador_decimal + aux.substr(len - 2, len);
}

return false;
}

</script>

No html usar:

<input type=text name="valor" size=10 maxlength="10" onkeypress="return formatar_moeda(this,'','.',event);">

PHP Hora e data -> BR - SP

Para colocar em PHP a hora atual do Brasil - São Paulo

// para php + antigos --> date_default_timezone_set('Brazil/East');
date_default_timezone_set('America/Sao_Paulo'); // atualizado em 19/08/2013
$data_sistema = date('d/m/Y H:i');

sexta-feira, 27 de março de 2009

xml com php e mysql

Para gera xml a partir do mysql com php:

$arquivo = 'xml/menu.xml';

//ABRE O ARQUIVO(SE NÃO EXISTIR, CRIA)
$ponteiro = fopen($arquivo, "w");
//ESCREVE NO ARQUIVO XML
fwrite($ponteiro, "\n");
fwrite($ponteiro, "");
//SQL
$q = "select chamadaSP,tipo,cd from pacpas where tipo='$tipo' order by chamadaSP";
$res = mysql_query($q);
while ($row = mysql_fetch_array($res)):
$chamada = $row['chamadaSP'];
$tipo = $row['tipo'];
$cd = $row['cd'];
// a linha abaixo e necessaria por causa que no XML não pode ter o simbolo &
$output = str_replace("&", "ecomercial", $chamada);
//MONTA AS TAGS DO XML
$conteudo = "
<menu&rt;
<titulo>$output</titulo>
<linque>pacpas.php?ln=p</linque>
<tipo>$tipo</tipo>
<cd>$cd</cd>
</menu>
";
//ESCREVE NO ARQUIVO
fwrite($ponteiro, $conteudo);
endwhile;//FECHA WHILE
//FECHA A TAG MENU
fwrite($ponteiro, "</principal>");
//FECHA O ARQUIVO
fclose($ponteiro);


Para ler o que foi gravado:

<?php
$doc2 = new DOMDocument();
$doc2->load( "xml/menu.xml" );
$books = $doc2->getElementsByTagName( "menu" );
foreach( $books as $book )
{
$links = $book->getElementsByTagName( "linque" );
$link = $links->item(0)->nodeValue;
$titles = $book->getElementsByTagName( "titulo" );
$title = $titles->item(0)->nodeValue;
$tipos = $book->getElementsByTagName( "tipo" );
$tipo = $tipos->item(0)->nodeValue;
$cds = $book->getElementsByTagName( "cd" );
$cd = $cds->item(0)->nodeValue;
$output = str_replace("ecomercial", "&", $title);
echo "<dd><a href='$link&tipo="$tipo&cd=$cd&ln=$ln'>".utf8_decode($output)."</a>\n ";
}
?>

Contar caracteres limitando a textarea

<textarea name="ocorrencia" cols="70" rows="5"
onKeyUp='ContaTexto(ocorrencia,counter,240);'></textarea>
<input type="text" name="counter" size="3" value="240">
<script>
function ContaTexto(CampoMsg,CampoContador, TamMax) {
if (CampoMsg.value.length > TamMax) CampoMsg.value = CampoMsg.value.substring(0, TamMax);
else CampoContador.value = TamMax - CampoMsg.value.length; }
</script>

MySQL Dar saida na data do

No caso abaixo data e hora, que foram inseridas previamentes e estão no formato aaaa-mm-dd hh:mm


$q_registro = "select id, DATE_FORMAT(data_inicial, '%d/%m/%Y %H:%i') as dataC from nome_da_tabela order by id desc limit 1";
$r_registro = mysql_query($q_registro);
$linha_registro = mysql_fetch_array($r_registro);
$id_sinistro = $linha_registro['id'];
$data_sinistro = $linha_registro['dataC'];

Bloqueio de teclas Firefox, IE e Chrome

Testado nas versões IE 6, IE 7, FF 3.x e Chrome 1.x

A programação abaixo bloqueia a tecla ' --> aspas simples --> codigo 192

//firefox e chrome
if (navigator.appName.indexOf('Internet Explorer')<0) {
window.onkeydown=function(event){
if (event.keyCode==192) {event.preventDefault();}
}
}
else {
// IE
document.onkeydown=function(event) {
if (window.event.keyCode==192) {
alert("Favor não utilizar\naspas simples ou duplas");
window.event.keyCode=0; window.event.returnValue=false;
}
}
}