Mostrando postagens com marcador php. Mostrar todas as postagens
Mostrando postagens com marcador php. Mostrar todas as postagens
quinta-feira, 26 de junho de 2008

Transformar caracteres especiais em códigos

PORTUGUÊS
Algumas aplicações apresentam incompatibilidades em relação à codificação dos caracteres. O resultado disso são caracteres com codificação errada, como uma letra acentuada que não é mostrada corretamente.

Uma alternativa para isso é transformar o conjunto de caracteres específico em códigos. Como os códigos são globais, dificilmente ocorrerá problema com codificação errada.

A função em PHP[bb] abaixo substitui os caracteres especiais de um texto em seus respectivos códigos.

function acento2codigo($string)
{
$acento = array("¡", "¢", "£", "¥", "§", "¨", "©", "«", "¬", "®", "°", "±", "´", "µ", "¶", "·", "¸", "»", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ø", "Ù", "Ú", "Û", "Ü", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ÿ", "‚", "ƒ", "„", "…", "†", "‡", "ˆ", "‰", "‹", "Œ", "‘", "’", "“", "”", "•", "–", "—", "˜", "™", "›", "œ", "Ÿ");
$codigo = array("¡", "¢", "£", "¥", "§", "¨", "©", "«", "¬", "®", "°", "±", "´", "µ", "¶", "·", "¸", "»", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ø", "Ù", "Ú", "Û", "Ü", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ÿ", "‚", "ƒ", "„", "…", "†", "‡", "ˆ", "‰", "‹", "Œ", "‘", "’", "“", "”", "•", "–", "—", "˜", "™", "›", "œ", "Ÿ");
return str_replace($acento, $codigo, $string);
}

ENGLISH
Change the special characteres to codes

Some aplications show an incompatibility with the characteres codification. The result of this are characteres with wrong codification, like a accented characteres that isn't showed correctly.

An option for this is change an specifically characteres set to codes. How the codes are global, will be difficult to happen problems with the wrong codification.

The PHP[bb] function above replace the special characteres in a text to their codes.

sábado, 31 de maio de 2008

Paginação com PHP

Este código é utilizado para fazer paginação, utilizando MySQL (sintaxes SQL) e PHP. Coloque no início do código PHP.


# --- Início dos critérios para a paginação.
# Quantidade de itens por página.
$numReg = 20;

# Se não foi setada a página, assume-se como 0.
if (!isset($pg))
{
$pg = 0;
}

# De onde começa a seleção na base de dados.
$inicial = $pg * $numReg;

# Faz o SELECT na base de dados.
$cPaginacao = "SELECT * from tabela LIMIT $inicial, $numReg";
$qPaginacao = mysql_query($cPaginacao);

$cTotal = "SELECT * FROM tabela";
$totalBusca = mysql_num_rows(mysql_query($cTotal));
# --- Fim dos critérios para a paginação.

A segunda parte é a paginação propriamente dita. Inclua o código abaixo na área em que deseja que apareça a numeração. A estrutura que eu coloquei - os números dentro de uma tabela - foi só para manter o alinhamento vertical, pode ser removida sem problemas ou adaptada às necessidades.

# --- Início da paginação.
$quantPg = ceil($totalBusca/$numReg);
$quantPg++;
echo "<table border='0' cellspacing='0' cellpadding='0'>";
echo "<tr valign='middle'>";
echo "<td>Páginas </td>";
echo "<td>";

# Verifica se está na primeira página, se não estiver,
# libera o link para Anterior.
if ( $pg > 0)
{
echo "<a href=".$PHP_SELF."?pg=".($pg-1).">";
echo "Anterior";
echo "</a>";
}
echo "</td>";
# Faz aparecer os números das página entre o ANTERIOR e PRÓXIMO.
echo "<td>";
for($iPg = 1; $iPg < $quantPg; $iPg++)
{
# Verifica a página que o navegante está e retira o link
# do número para identificar visualmente.
if ($pg == ($iPg-1))
{
echo " [$iPg] ";
} else
{
$iPg2 = $iPg-1;
echo " <a href=".$PHP_SELF."?pg=$iPg2>";
echo "<b>$iPg</b>";
echo "</a> ";
}
}
echo "</td>";
echo "<td>";
# Verifica se está na ultima página, se não estiver ele
# libera o link para próxima.
if (($pg+2) < $quantPg)
{
echo "<a href=".$PHP_SELF."?pg=".($pg+1).">";
echo "Próxima";
echo "</a>";
}
echo "</td>";
echo "</tr>";
echo "</table>";
# --- Fim da paginação.

Não foi aplicada nenhuma folha de estilo aos links ou números das páginas. Sei que você pode fazer isso por conta própria! Após implementada a paginação, você adapta ela visualmente às suas necessidades.

sexta-feira, 29 de fevereiro de 2008

Converter string para maiúsculo em PHP

A função abaixo converte uma string para maiúsculo em PHP, inclusive caracteres acentuados. É usada a função strtoupper para converter a string e, em casos em que caracteres acentuados não são convertidos, é usada a função str_replace, que substitui o caractere acentuado pelo seu equivalente maiúsculo.

Em suma, converte, usando PHP, uma string qualquer para sua equivalente maíscula.

function converteMaiusculo($string) 
{
$string = strtoupper ($string);
$string = str_replace ("â", "Â", $string);
$string = str_replace ("á", "Á", $string);
$string = str_replace ("ã", "Ã", $string);
$string = str_replace ("à", "A", $string);
$string = str_replace ("ê", "Ê", $string);
$string = str_replace ("é", "É", $string);
$string = str_replace ("Î", "I", $string);
$string = str_replace ("í", "Í", $string);
$string = str_replace ("ó", "Ó", $string);
$string = str_replace ("õ", "Õ", $string);
$string = str_replace ("ô", "Ô", $string);
$string = str_replace ("ú", "Ú", $string);
$string = str_replace ("Û", "U", $string);
$string = str_replace ("ç", "Ç", $string);
return $string;
}
A chamada da função é feita da seguinte maneira:
$variavel = converteMaiusculo($variavel); 

O PHP dispõe de um tipo de variável que permite que se altere seu nome dinamicamente. A variável que varia!

$var1  = 5;
$var2 = 'var1';
Dessa forma pode-se usar o nome var2 no lugar de var1.

$$var2 = 10;
Isto é o mesmo que:

$var1 = 10;
Várias variáveis que variam invariavelmente!

Hoje precisei vincular um item a várias categorias. Como estrutura, tinha uma tabela com perguntas e respostas e outra tabela com as categorias que essas perguntas podiam ser vinculadas. Criei uma outra tabela que tinha como chave estrangeira as chaves primárias dessas duas tabelas.

Na interface com o usuário, fiz um cadastro de perguntas e respostas, e na mesma tela o usuário poderia vincular as categorias que a pergunta se encaixava. Como as categorias podiam ser muitas, não quis usar checkbox. Como solução optei pelo select multiple, que definido o tamanho ele habilita a barra de rolagem, caso necessite.

Para pegar os dados desse formulário, fiz o seguinte: criei um campo select com os dados que eu precisava:

<select name="nomeSelect[]" size="5" multiple> 
    <option value="1">Valor 1</option>
    <option value="2">Valor 2</option>
    <option value="3">Valor 3</option>
</select>

Para pegar os dados enviados pelo POST, fiz o seguinte:
for ($i = 0; $i < count($_POST['nomeSelect']); $i++) 
{
  echo $_POST['nomeSelect'][$i];
}

No código, eu usava o laço de repetição para vincular a pergunta a cada categoria selecionada no select multiple, através de INSERT na base de dados!

Eu utilizo um editor JavaScript online para editar alguns conteúdos previamente gravados, como notícias, arquivos com mensagens que são enviadas por e-mail, etc. Cada objeto desses possui sua formatação própria, podendo conter links, aspas simples e duplas, cores, tamanhos e formatos de fontes, dentre outras formas.

O editor JavaScript delimita o conteúdo a ser editado por aspas duplas, ou seja, se dentro do texto tivesse aspas duplas, o editor acusaria erro, pois consideraria a primeira aspa após a delimitação inicial do conteúdo como sendo fim de conteúdo e o restante não seria lido.

Outro erro é que ele não interpreta retorno de carro (ENTER) "\r" (ASCII 13 (0x0D)) e nova linha "\n" (ASCII 10 (0x0A)), ou seja, caso você copie e cole um texto que tenha estes caracteres, ele acusará erro. Para o editor, o texto tem que ser passado em uma única linha.

Para resolver estes problemas é simples, remover os caracteres que ele não aceita! As funções abaixo se referem a linguagem PHP.

Removendo aspas duplas

$conteudo = str_replace("\"", "'", $conteudo);

Troco as aspas duplas por aspas simples

Removendo retorno de carro (ENTER)
$conteudo = str_replace(chr(13), "", $conteudo);

Troco o \r por vazio

Removendo nova linha
$conteudo = str_replace(chr(10), "", $conteudo);

Troco \n por vazio

Com isso, o editor não acusará mais erros referentes aos problemas aqui expostos.

---

Update
Existe a função nl2br que faz o trabalho de trocar \n por <br />.

quarta-feira, 16 de janeiro de 2008

Evitar injection em formulários web

Quando se fala em segurança, o que se deve ter em mente é a integridade dos dados no banco de dados e a possível utilização de formulários para fins não esperados.

A função abaixo em PHP é um exemplo simples - não totalmente abrangente e completo - para se evitar injeções de códigos em formulários de sites.

/**
* @abstract Tratamento de injections em formulários.
* @return string
*/
function antiInjection($str)
{
# Remove palavras suspeitas de injection.
$str = preg_replace(sql_regcase("/(\n|\r|%0a|%0d|Content-Type:|bcc:|to:|cc:|Autoreply:|from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"), "", $str);
$str = trim($str); # Remove espaços vazios.
$str = strip_tags($str); # Remove tags HTML e PHP.
$str = addslashes($str); # Adiciona barras invertidas à uma string.
return $str;
}


Para garantir que nenhum dado passado por formulário, seja ele GET ou POST, ou passado via URL (GET), contenha qualquer tipo de código malicioso, deve-se validar todos os valores que são passados. O código a seguir exemplifica como isto pode ser feito. No exemplo é abordado o vetor POST, mas o mesmo pode ser aplicado aos demais vetores, como GET, COOKIE, SESSION, etc.

UPDATE

Como formulários podem conter vetores dentro de vetores (p.e. vetor de checkbox dentro do POST, que é um vetor), adicionei mais uma função que faz essa verificação, ou seja, se existir um vetor dentro de um vetor, para cada valor existente é verificado os injections.

/**
* @abstract Antes de tratar os injections, verifica se é vetor ou não.
*/
function validaParametro($vetor)
{
if (is_array($vetor))
{
foreach ($vetor as $chave => $valor)
{
if (is_array($valor))
{
$vetor[$chave] = validaParametro($valor);
} else $vetor[$chave] = antiInjection($valor);
}
} else $vetor[$chave] = validaParametro($valor);
return $vetor;
}


Para chamar a função basta:
# Para cada entrada de POST, faz a verificação de possíveis injections.
$_POST = validaParametro($_POST);


Caso queira fazer um teste, basta criar um formulário com campos normais e vetores e, ao final dar um var_dump($_POST); para ver o resultado.

A dica de validar vetores internos foi do Anselmo Battisti, meu parceiro de faculdade!

sexta-feira, 4 de janeiro de 2008

Formatar Números com PHP

Com o PHP é possível formatar números com casas decimais, vírgulas e pontos. A função utilizada para isto é a number_format().

Vale lembrar que esta função aceita somente 1, 2 ou 4 parâmetros.

Segue alguns exemplos da utilização da função:

$valor = 123456;

echo number_format($valor); # 123,456
echo number_format($valor, 2, ",", " "); # 123 456,00
echo number_format($valor, 2, ".", ""); # 123456.00
echo number_format($valor, 2, ",", "."); # 123.456,00

domingo, 16 de dezembro de 2007

Aumentar Tempo de Execução no PHP

O PHP por padrão determina um tempo de 30 segundos para a execução de um script. Caso o script não possa ser processado neste tempo, ele é então encerrado.

No entanto há uma forma de aumentar este tempo sem que tenha necessariamente que mexer nos arquivos de configuração do PHP. Existe a função ini_set, que define o valor de uma opção de configuração indicada. A opção de configuração irá manter o novo valor durante a execução do script e será restaurado ao final da execução do script. Nem todas as opções disponíveis podem ser modificadas usando a função ini_set. Há uma lista de todas as opções disponíveis no PHP apêndice.

Voltando ao assunto, para alterar o tempo de execução de um script no PHP basta alterar o valor da variável max_execution_time para o tempo desejado, por exemplo:

<?php
ini_set("max_execution_time", 60);
?>
Dessa forma o tempo de execução de um script PHP passou de 30 para 60 segundos.

terça-feira, 11 de dezembro de 2007

Transformando Vetor em String no PHP

Esses dias estava mexendo com um sistema de comércio eletrônico, não me lembro se Itaú ou Banco do Brasil, e precisava pegar o retorno de um POST enviado pelo banco para um arquivo no servidor e enviar esse conteúdo por e-mail para posterior avaliação dos dados. Como não é possível enviar um array por e-mail, usei uma função que transforma um array em uma string. Com isto consegui enviar por e-mail o POST e ver quais os dados que estavam sendo passados!

function vetorString($aux1, $aux2, $vetor)
{
foreach($vetor as $chave => $valor) $vetor2[] = $chave.$aux1.$valor;
return implode($aux2, $vetor2);
}

Com esta função, basta fazer uma variável receber o retorno da função:
$msg = vetorString("=", "&", $_POST);

O retorno de um Array ( [a] => 1 [b] => 2 [c] => 3 ) ficaria a=1&b=2&c=3.