Arquivo para a PHP categoria

GoogOrion´s

Postado em Game, PHP em 6 06UTC Maio 06UTC 2009 por alexandrems

Apartir do xml que é desponibilizado pelo pessoal do Orion´s Belt, desenvolvi uma ferramenta para fazer buscas pelo universo do jogo. É possível encontrar mercados, armadas, planetas, combates, entre outros corpos celestes ehehehe.

Segue abaixo o link, o xml é atualizado todos os dias a partir das 10:05 AM.

googorion´s

Codificação nos posts

Postado em Ajax, Geral, JavaScript, PHP com as tags em 15 15UTC Abril 15UTC 2009 por alexandrems

A tempos que estava atraz disso, colocar codificação do php nos posts, recebi um comentário do edipo dizendo como fazer, mas estava um pouquinho errado eheheh. Dai deu uma googlada e achei essa página, Support Code (Bem sujestivo :P ).

Resumindo, soh utilizar o código dentro das tags.

[sourcecode language='php']

Código

[/sourcecode]

Algumas linguagens que ele “estiliza”:

  • cpp
  • csharp
  • css
  • delphi
  • html
  • java
  • jscript
  • php
  • python
  • ruby
  • sql
  • vb
  • xml

Não resisiti

Postado em Game, PHP em 13 13UTC Abril 13UTC 2009 por alexandrems

Eu sei, já me falaram.

Antes de começar o designer, faça primeiro a programação.

Mas é muito divertido mecher com designer, eu não sou um bom designer, mas gosto de mexer, então estou fazendo em “paralelo”, quando eu me canso de programar eu abro o photoshop ehehehhe.

Ai vai um esboço de como esta ficando a tela do jogo.

Quase um ano

Postado em PHP em 13 13UTC Abril 13UTC 2009 por alexandrems

Após quase um ano sem postar nada, vou re-ativar esse blog..
To precisando de um entreterimento a mais, então irei voltar a escrever besteras e coisas interessates (para alguns).

Vou publicar como esta o andamento do meu projeto que estou fazendo em casa. Referente a um game web-based. Gosto bastante desses tipos de jogos então vamos ver se irei conseguir desenvolver um =)

Persitência em PHP – I

Postado em PHP com as tags , , em 18 18UTC Abril 18UTC 2008 por alexandrems

Persistência - s.f. Ato de persistir. / Qualidade do que dura.

Bom hoje vou falar de um assunto que particularmente entendo bem, pois fiz para meu trabalho de conclusão de curso, um framework de persistência web para PHP ( mais pra frente posso disponibilza-lo aqui). Vou escrever 3 artigos sobre esse assunto, que juntos nos trará um mini-framework para persistência de dados em PHP.

Introdução

Bom todo o sistema ou até mesmo web sites, necessitam armazer as informações inseridas neles, ou seja as informações deverão ser persistentes. Para isso sempre é utilizado um mecanismo de persistencia, que pode ser, um arquivo xml, texto, banco de dados orientado a objetos, banco de dados relacional, entre outros tipos possiveis de armazenar uma informação. O mais utilizado é o banco de dados relacional, que são bancos com varios padrões estabelecidos e anos de experiencia armazenando informações relacionalmente, além de terem sistemas que fazem a gerência das informações relacionais (SGBD – Sistema Gerenciador de Banco de Dados) de fabricantes, preços e objetivos diferentes. Um banco de dados relacional, como o nome já diz, armazena as informações relacionalmente dentro de tabelas. No caso um conjunto de registros ou informações de uma tabela podem estar relacionados com outros registros de outra tabela e assim por diante. Mas temos um problema ai, pois o banco de dados é relacional e a aplicação é orientada a objetos. Dois paradigmas diferentes, como tratar as informações entre esses dois caras? Ai que entra o framework de persistência.

Modelo Relacional x Modelo Orientado a Objetos

Se existe esse problema, então porque não utilizar um banco de dados orientado a objetos? Bom primeiro que o custo seria aumentado, pois eu nunca vi um desses ao vivo, mas sei que existe, então provavelmente arranjar pessoal para mexer com esse treco não deve ser tão facil. Segundo os bancos relacionais estão mais maduros que os OO. A orientação a objetos trabalha as informações como classes, atributos, métodos, etc… Enquanto os bancos de dados relacionais tratam as informações com tabelas, registros, indices, relacionamentos, etc… Então para que o programador trabalhe somente Orientado a objetos e o DBA (Administrador do banco de dados) cuide do banco relacional, é proposto um framework que ficará “no meio” desses dois cara (aplicação e banco), ele irá traduzir as informações OO para Relacional e Relacional para OO.

Classe de Conexão

Bom vamos para o que interessa, primeiramente vamo criar uma classe de conexão com o banco.
Descrição:
Como de praxe, vou utilizar o pattern Singleton para fazer a classe de conexão, onde somente existirá uma única instância da classe. Essa classe terá conexão com o banco MySQL (prometo postar uma classe com o PDO para vários bancos), e terá métodos para facilitar a manipulação das informações no banco (insert, delete, update).

conecta.php

class Conecta {

// atributo static para o singletom
static private
$_instancia = null;

// variavel de conexão
private $_conexao = null;

// Construtor só é chamado quando não existir a instância
private function __construct(){

$_host = “localhost”;
$_database = “base”;
$_user = “usuario”;
$_password = “senha”;

$this->_conexao = mysql_connect($_host, $_user, $_password) or die(‘Não foi possível abrir uma conexão’ );
mysql_select_db($_database, $this->_conexao) or die(‘Base de dados nao encontrada.’);

}

// Método chamado para instânciar a classe
public static function getConexao() {

if (!self::$_instancia instanceof self) {
self::$_instancia = new self();
}
$con = self::$_instancia;
return $con;
}

// Fecha a conexão
public function close(){
if($this->_conexao)
mysql_close($this->_conexao);
}

/* Executa uma select
public function select($sql){

$resultado = mysql_query($sql,$this->_conexao);
// Erro na sql
if(!$resultado){
die(“Não foi possível executar a consulta ($sql ) no banco de dados: “ . mysql_error());
}
// Não existe erros
else{
// Recebe os resultados da consulta
while($row=mysql_fetch_assoc($resultado)) {
$retorno->result[] = $row;
}
// Recebe a quantidade de registros encontrados
$retorno->count= mysql_num_rows($resultado);
}
return $retorno;
}

// Executa a inserção no banco
public function
insert($sql){

$resultado = mysql_query($sql,$this->_conexao);
//Erro na sql
if(!$resultado){
die(“Não foi possível executar a consulta ($sql) no banco de dados: ” . mysql_error());
}else{
// Retorna o id cadastrado se foi executado com sucesso
// Retorna false se não foi possivel fazer a execução

return (mysql_insert_id()) ? mysql_insert_id() : false;
}
}

// Executa a alteração no banco
public function update($sql,$unicos=null){

$resultado = mysql_query($sql,$this->_conexao);
//Erro na sql
if(!$resultado){
die(“Não foi possível executar a consulta ($sql) no banco de dados: ” . mysql_error());
}
//Retorna 1 (true) se foi executado com sucesso
return $resultado;
}
}

// Executa a exclusão no banco
public function delete($sql,$unicos=null){
$resultado = mysql_query($sql,$this->_conexao);
//Erro na sql
if(!$resultado){
die(“Não foi possível executar a consulta ($sql) no banco de dados: ” . mysql_error());
}
//Retorna 1 (true) se foi executado com sucesso
return $resultado;
}

}

Para fazer executar esse camarada ai.

$conn = Conecta::getConexao();
$rs = $conn->select(“SELECT nome,telefone FROM dados WHERE cidade=’cascavel’”);
if($rs->count > 0){
foreach($rs->result as $v){
echo $v['nome'] . “-”. $v['telefone']. “<br>”;
}
}else{
echo “Não foi encontrado nenhum registro”;
}

A primeira parte é isso ai, próximo passo vou mostrar como criar as classes que serão manipuladas pela persistência. Qualquer coisa só entrar em contato =).

PS: SE ALGUEM TIVER UM TEMPLATE QUE FORMATE CÓDIGOS FONTES, POR FAVOR ME AVISEEEE.

Hash para validação de arquivos

Postado em PHP com as tags , , em 11 11UTC Abril 11UTC 2008 por alexandrems

Saudações, hoje vou falar sobre uma questão muito importante sobre segurança e confiabilidade de informações, principalmente para arquivos que são gerenciados por um sistema web. Para intender melhor vamos imaginar a seguinte situação.

Seu sistema gerencia laudos de exames de sangue em pdf para pacientes de uma clinica. E um desses pacientes ta precisando de grana e inventa de burlar o laudo botando um positivo no seu exame de HIV para ver se consegue uma indenização milionária.

Bom é possivel colocar senha para a edição e visualização de um arquivo em PDF, mas todo nós sabemos que mesmo assim tem como burlar isso. Então para a clinica escapar dessa indenização e consecutivamente seu sistema continuar no mercado, o paciente terá que apresentar o PDF com o resultado falso positivo HIV, e tera que ser comparado o arquivo gerado pelo sistema com o do safado paciente. Para fazer isso, acredito eu que a melhor forma é comparar o Hash dos arquivos. Existem vários algoritmos de hash, o que vou utilizar aqui será o MD5. Para isso o PHP tem uma função pronta md5_file, neste exemplo vou fazer genérico para qualquer tipo de arquivo.

O que irá fazer

Vamos fazer um script para um gerenciador de arquivos, ou seja, será enviado varios tipos de arquivos, o sistema ira gerar um hash do mesmo e ira salvar em uma base para futuras comparações. Não vou entrar em detalhes como validar o arquivo enviado, restringir um tipo de dado, tamanho, etc. e nem sobre banco de dados, como armazenar as informações, existem varios tutoriais bons sobre isso, minha idéia é mostrar sobre hash.

Primeiro vamos receber o dowload, copia-lo e ver o hash.

$uploaddir = 'local/';
$uploadfile = $uploaddir . $_FILES['arquivo']['tmp_name'];
if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $uploadfile)) {
$hash = md5_file($uploadfile);
$sql = sprintf("INSERT INTO arquivos ( arq_file, arq_hash) VALUES ('%s','%s')",$uploadfile,$hash);
} else {
echo "Arquivo não foi enviado";
}

É muito interessante que tenha algum código unico para identificar o arquivo no sistema, pois irá facilitar uma busca para comparações.

Agora o trecho de código para comparar os arquivos. A idéia e ter duas entradas. Uma para identificar ou escolher o arquivo que esta no sistema e outra para enviar o arquivo que será comparado. Nesse exemplo vou usar o nome do arquivo para achar ele no sistema. O código a baixo está recebendo essas informações.
* A instancia $conexao é ficticia, utilize o seu método favorito para retornar uma SQL.

$hashSis = $conexao->select("SELECT arq_hahs FROM arquivos WHERE arq_file='".$_POST['nome']."'");
$hashArq =md5_file($_FILES['arquivo']['tmp_name']);
if($hashSis == $hashArq){
echo "Arquivos iguais";
}else{
echo "Arquivos diferente";
}

Esse tipo de válidação é, na minha opnião obrigatória para garantir a segurança das informações em sistemas que gerenciam documentos. Bom a principio é isso ai, qualquer dúvida só entrar em contato.

DomPDF

Postado em PHP com as tags , , , , em 9 09UTC Abril 09UTC 2008 por alexandrems

Bom hoje vou falar do DomPDF, classe para gerar PDF com PHP5 a partir de um HTML. O problema que sua ultima atualização foi em 2006. Ela utiliza a biblioteca CPDF, que foi depreciada, talvez esse o motivo de não ter mais atualizações. Mas tirando isso é uma excelente classe, tem alguns errinhos com table e css. Muitos deles consegui contornar outros estou tentando corrigir ainda. Então vou dar umas dicas sobre essa classe e como trabalha com ela.

Como funciona

É passado um nome para o arquivo .pdf e um nome do arquivo .html, tambem pode ser passado o tipo do papel que por padrao ja é A4. Pode ser executado pela URL ou Terminal Linux.

URL
www.site.com/dompdf/dompdf.php?output_file=file.pdf&input_file=pdftemp/file.html&paper=a4
output_file = nome do arquivo .pdf
input_file = nome do arquivo .html
paper = tipo do papel

Terminal

$ php dompdf.php -f nomePDF dftemp/file.htmlp

dompdf.php [opções] arquivo.html

Opções:
-h Mostra a mensagem
-l Lista os tipos de papel
-p size Mostra os tipos de papeis ‘letter’, ‘A4′, ‘legal’, etc.
-o orientation Orientação do texto ‘portrait’ or ‘landscape’.Por padrão ‘portrait’.
-b path Seta o local para o arquivo .html.
-f file Nome do arquivo pdf [arquivoHTML].pdf.
-v verbose: mostra os erros caso ocorra.
-d very verbose: mostra os erros mais detalhadamente.

Dicas

Algumas dicas sobre essa classe. A primeira e mais importante, seu HTML tenque estar bem identado e sem nenhum erro, senão a classe não irá funcionar. Se esquecer de fechar uma tag que seje ja era, não vai funcionar.

Texto dentro de uma celula da tabela, não obedece seu limite e atravessa outra coluna.

Fiquei um bom tempo tentado resolver e consegui incluindo um width com uma div dentro da celula.

<table>
<tr>
<td>
<div style='width:95%'> texto </div>
</td>
</tr>
</table>

Incluir contorno nas tabelas e celulas

Para que uma tabela possa ter um contorno é preciso atribuir o atributo CSS border-collapse:collapse;
Pode inserir como stilo na propria tabela, ou melhor ainda, uma classe ou atribuir direto na página HTML.


<style type="text/css">
table.collapse {
border-collapse: collapse;
border-spacing: 3px;
}
</script>

Inserir textos estáticos no PDF

É possivel inserir textos estáticos para os arquivos PDF, isso é muito util se vc quer colocar um cabecalho ou um rodapé em todos os PDFs gerados, ou até mesmo um texto indicando a páginação.
Então dentro do arquivo HTML coloque.


<script type="text/php">
if ( isset($pdf) ) {
// Configurações para ajustar o tamanho do texto, cores, e dimensões da area do arquivo
$font = Font_Metrics::get_font("Helvetica");
$size = 9;
$color = array(0,0,0);
$text_height = Font_Metrics::get_font_height($font,$size);
$foot = $pdf->open_object();
$w = $pdf->get_width();
$h = $pdf->get_height();
$pdf->close_object();
$pdf->add_object($font, "all");
// Cria uma linha no rodapé
$y = $h - $text_height - 45;
$pdf->line(12, $y, $w - 16, $y, $color, 0.5);
// Insere um texto um pouco acima da linha do rodapé
$_texto = utf8_encode("Texto Texto);
$w1 = Font_Metrics::get_text_width($_texto , $font, 7);
$y = $h - $text_height - 23;
$pdf->page_text($w / 2 - $w1 / 2, $y, $_texto , $font, 7, $color);
// Numero da pagina
$text = utf8_encode("Página {PAGE_NUM} de {PAGE_COUNT} ") ;
$width = Font_Metrics::get_text_width("Pagina 1 de 2", $font, 6);
$y = $h - $text_height - 2;
$w = $w - 14;
$pdf->page_text($w - $width, $y, $text, $font, 6, $color);
}
</script>
<body> conteudo </body>

Incluindo uma nova fonte

Por padrão esta classe trabalha com a fonte Helvetica, no formato .afm. Mas para incluir uma nova fonte, só baixar o arquivo que tem nesse tutorial, e segui-lo não tem erro (Windows).
Depois de criar a fonte, tenque habilitar ela. Va no diretório dompdf/libs/fonts. Abra o arquivo dompdf_font_family_cache.dist. Este arquivo contem um vetor com as fontes que poderão ser trabalhadas ( a fonte que você criou terá que estar neste diretório ), veja se ja existe um idince referente a sua fonte, se estiver comentado descomente, senão crie um la.
* Um problema que tive foi com o itálico para a fonte Helvetica, estava parecendo negrito e italico, neste arquivo estava ‘italic’ => DOMPDF_FONT_DIR . ‘Helvetica-BoldOblique’, ou seja estava pegando a fonte errada. Foi só alterar para italic’ => DOMPDF_FONT_DIR . ‘Helvetica-Oblique’, e vualá.

Bom tomara que tenha ajudado alguém ai. Esta classe é muito boa, infelizmente foi descontinuada. Estou pensando em mete as cara e tentar atualizar ela, se tiver alguem afim de me acompanhar só entrar e contato :) . Até a próxima.