Category Archives: php

Funções de manipulação de strings no PHP

Nesse artigo sobre PHP, irei apresentar e explicar como e quando utilizar as principais funções de manipulação de strings da linguagem. Ao final da leitura deste material, você deverá estar apto a realizar as principais operações com esse tipo de dado, como converter uma expressão para maiúsculo ou minúsculo, obter partes de um string, identificar se um string está contido em outro, substituir parte de uma expressão, entre outra.

Continue reading Funções de manipulação de strings no PHP

PHP 5.4.5 e PHP 5.3.15 lançado!

A equipe de desenvolvimento PHP gostaria de anunciar a disponibilidade imediata do PHP 5.4.5 e PHP 5.3.15. Esta versão corrige mais de 30 bugs e inclui uma correção para um problema de estouro de segurança relacionado com a implementação de fluxo. Todos os usuários do PHP são encorajados a atualizar para PHP 5.4.5 ou PHP 5.3.15.

http://translate.google.com/translate?sl=auto&tl=pt&u=http://www.php.net/index.php%23id2012-07-19-1

PHP: Hypertext Preprocessor

via PHP 5.4.5 e PHP 5.3.15 lançado!.

Redirect index.php to root

Olá, dica pra quem quiser reconfigurar o index da pagina no .htacess, para configurar o padrão para o “index.php” basta usar o codigo abaixo:

 

RewriteEngine on
RewriteRule ^index.php$ – [L]
RewriteCond %{HTTP_HOST} ^nomedominio.com.br$ [OR]
RewriteCond %{HTTP_HOST} ^www.nomedocminio.com.br$
RewriteRule ^/?$ “http://nomedominio.com.br” [R=301,L]

Options +Indexes
IndexOptions +FancyIndexing

 

isso se faz necessário as vezes quando se registra mais de um domínio quando ao acessar nao abre na pagina index que em questão é a padrao, mas se quiser colocar com outro nome também pode..

 

segue um link para aprofundar mais.. abs..

http://www.askapache.com/htaccess/redirect-index-blog-root.html

A otimização secreta do PHP 5.4 – PHPCast episódio 6

Podcast PHPCast

Uma otimização introduzida no PHP 5.4 – e que foi pouco divulgada – permite que scripts de PHP que criam muitos objetos da mesma classe economizem memória e rodem mais rápido, desde que todas as variáveis sejam previamente declaradas. Este foi um dos principais assuntos discutidos por Manuel Lemos e Ernani Joppert no sexto episódio do PHPCast.

Eles também comentaram sobre o desafio do Prêmio de Inovação em JavaScript, que está sendo organizado pelo site JSClasses, e que em breve vai oferecer prêmios e reconhecimento para desenvolvedores que contribuem com componentes inovadores escritos em JavaScript.

via A otimização secreta do PHP 5.4 – PHPCast episódio 6.

As 7 Principais Otimizações do PHP 5.4 – PHPCast episódio 7

Podcast PHPCast

O PHP 5.4 inclui sete otimizações que tornaram esta versão mais eficiente; não apenas em termos de rapidez de execução, mas também em termos de uso de memória. Este foi um dos principais assuntos do episódio 25 do podcast em inglês Lately in PHP, que foi comentado por Manuel Lemos e Ernani Joppert aqui no episódio 7 do PHPCast.

Este episódio foi gravado em vídeo e transmitido ao vivo para todo o público graças ao Google Hangouts On Air, que permite que qualquer pessoa possa participar e assistir à gravação de hangouts. Os vídeos são disponibilizados depois no canal do YouTube. Siga a conta do Twitter (@phpclassesearly) para saber quando o próximo episódio vai ser gravado para poder participar também.

via As 7 Principais Otimizações do PHP 5.4 – PHPCast episódio 7.

PDO em PHP Orientado a Objetos

Nesse artigo vou mostrar como usar o PDO para conectar em um banco de dados em PHP orientado a objetos.

Nesse exemplo estou usando o banco de dados MySQL.

Vamos primeiramente criar um banco de dados chamado “teste”. Ver Listagem 1

Listagem 1: Código para criar um banco de dados no MySQL query

CREATE DATABASE IF NOT EXISTS teste

Agora vamos criar a estrutura da classe de conexão. Para isso vamos criar um arquivo chamado conexao.php e criar a nossa classe database que será uma abstrata. Ver Listagem 2.

Listagem 2: Estrutura da classe database

<?php
abstract class database{
}
?>

Vamos então adicionar os métodos padrões para as classes abstratas que são o __construct, __clone e __destruct. Ver Listagem 3.

Os métodos __construct e __destruct.são padrões do php e são responsáveis por construir e destruir a instancia da nossa classe.

O método __clone evita que nossa classe seja clonada.

Listagem 3: Classe usuarios com os métodos __construct, __clone e __destruct

<?php
abstract class database{
	/*Método construtor do banco de dados*/
	private function __construct(){}

	/*Evita que a classe seja clonada*/
	private function __clone(){}

	/*Método que destroi a conexão com banco de dados e remove da memória todas as variáveis setadas*/
	public function __destruct() {
		foreach ($this as $key => $value) {
			unset($this->$key);
        }
	}
}
?>

Na listagem 3 o método __destruct remove da memória todas as variáveis que foram setadas pela nossa classe.

Agora vamos criar os métodos de conexão e fechar a conexão com o BD. Ver Listagem 4.

Listagem 4: Métodos connect e disconnect

<?php
abstract class database{
	/*Método construtor do banco de dados*/
	private function __construct(){}

	/*Evita que a classe seja clonada*/
	private function __clone(){}

	/*Método que destroi a conexão com banco de dados e remove da memória todas as variáveis setadas*/
	public function __destruct() {
		$this->disconnect();
		foreach ($this as $key => $value) {
			unset($this->$key);
        }
	}

	private static $dbtype   = "mysql";
	private static $host     = "localhost";
	private static $port     = "3306";
	private static $user     = "root";
	private static $password = "123";
	private static $db       = "teste";

	/*Metodos que trazem o conteudo da variavel desejada
	@return   $xxx = conteudo da variavel solicitada*/
	private function getDBType()  {return self::$dbtype;}
	private function getHost()    {return self::$host;}
	private function getPort()    {return self::$port;}
	private function getUser()    {return self::$user;}
	private function getPassword(){return self::$password;}
	private function getDB()      {return self::$db;}

	private function connect(){
		try
		{
			$this->conexao = new PDO($this->getDBType().":host=".$this->getHost().";port=".$this->getPort().";dbname=".$this->getDB(), $this->getUser(), $this->getPassword());
		}
		catch (PDOException $i)
		{
			//se houver exceção, exibe
			die("Erro: <code>" . $i->getMessage() . "</code>");
		}

		return ($this->conexao);
	}

	private function disconnect(){
		$this->conexao = null;
	}
}
?>

Veja a definição das variáveis privadas usadas para conexão na Listagem 4:

dbtype – define uma string que informa qual a plataforma de banco de dados que estamos usando. Para o MySQL usamos a string “mysql” e para o SQL Server usamos a string “mssql”. Veja nesse link http://br.php.net/manual/en/pdo.drivers.php os drives de banco de dados suportados pelo PDO
host – define o nome do host
port – define a porta do host
user – define o usuário de acesso ao banco de dados
password – define a senha de acesso ao banco de dados
db – define o nome do banco de dados

O método connect tenta se conectar com o banco de dados usando as informações passadas pelas variáveis privadas, caso não consiga retorna um erro.

O método disconnect finaliza a conexão com o banco de dados. Perceba que esse método está sendo chamado pelo método __destruct, ou seja, ele sempre será executado ao término da utilização da classe database.

Por fim vamos criar os métodos insert, select, update e delete para fazer o nosso CRUD. Ver Listagem 5.

Listagem 5: Métodos insert, select, update e delete

<?php
abstract class database{
	/*Método construtor do banco de dados*/
	private function __construct(){}

	/*Evita que a classe seja clonada*/
	private function __clone(){}

	/*Método que destroi a conexão com banco de dados e remove da memória todas as variáveis setadas*/
	public function __destruct() {
		$this->disconnect();
		foreach ($this as $key => $value) {
			unset($this->$key);
        }
	}

	private static $dbtype   = "mysql";
	private static $host     = "localhost";
	private static $port     = "3306";
	private static $user     = "root";
	private static $password = "123";
	private static $db       = "teste";

	/*Metodos que trazem o conteudo da variavel desejada
	@return   $xxx = conteudo da variavel solicitada*/
	private function getDBType()  {return self::$dbtype;}
	private function getHost()    {return self::$host;}
	private function getPort()    {return self::$port;}
	private function getUser()    {return self::$user;}
	private function getPassword(){return self::$password;}
	private function getDB()      {return self::$db;}

	private function connect(){
		try
		{
			$this->conexao = new PDO($this->getDBType().":host=".$this->getHost().";port=".$this->getPort().";dbname=".$this->getDB(), $this->getUser(), $this->getPassword());
		}
		catch (PDOException $i)
		{
			//se houver exceção, exibe
			die("Erro: <code>" . $i->getMessage() . "</code>");
		}

		return ($this->conexao);
	}

	private function disconnect(){
		$this->conexao = null;
	}

	/*Método select que retorna um VO ou um array de objetos*/
	public function selectDB($sql,$params=null,$class=null){
		$query=$this->connect()->prepare($sql);
		$query->execute($params);

		if(isset($class)){
			$rs = $query->fetchAll(PDO::FETCH_CLASS,$class) or die(print_r($query->errorInfo(), true));
		}else{
			$rs = $query->fetchAll(PDO::FETCH_OBJ) or die(print_r($query->errorInfo(), true));
		}
		self::__destruct();
		return $rs;
    }

	/*Método insert que insere valores no banco de dados e retorna o último id inserido*/
	public function insertDB($sql,$params=null){
		$conexao=$this->connect();
		$query=$conexao->prepare($sql);
		$query->execute($params);
		$rs = $conexao->lastInsertId() or die(print_r($query->errorInfo(), true));
		self::__destruct();
		return $rs;
    }

	/*Método update que altera valores do banco de dados e retorna o número de linhas afetadas*/
	public function updateDB($sql,$params=null){
		$query=$this->connect()->prepare($sql);
		$query->execute($params);
		$rs = $query->rowCount() or die(print_r($query->errorInfo(), true));
		self::__destruct();
		return $rs;
    }

	/*Método delete que excluí valores do banco de dados retorna o número de linhas afetadas*/
	public function deleteDB($sql,$params=null){
		$query=$this->connect()->prepare($sql);
		$query->execute($params);
		$rs = $query->rowCount() or die(print_r($query->errorInfo(), true));
		self::__destruct();
		return $rs;
    }
}
?>

Os métodos insert, update e delete tem quase a mesma codificação, eles recebem o comando SQL e e os parâmetros então o executa retornando o número de linhas afetadas. A diferença é que o método insert retorna o último id inserido na tabela.

Caso aconteça algum erro ao tentar executar o comando esses métodos retornam o erro.

O método select recebe o SQL, os parâmetros e o nome de uma classe para o qual o método transformará os dados da tabela em objetos. Para isso é necessário criar uma classe de mapeamento VO (Value Objects) que receberá esses dados.

Caso não seja passado o nome de uma classe ele retorna um array de objetos.

Assim como nos métodos insert, update e delete, se acontecer algum erro o método select retorna esse erro.

Ficamos por aqui, até o próximo artigo.

Fonte: Linha de Código – Artigos

 

Long Polling com #PHP

Olá Pessoal !
Como mostrei a forma de se fazer um Long Polling utilizando Node.JS ( Long Polling com Node.JS ) , irei mostrar agora a forma de se fazer com PHP.

Importante !

Funcionar funciona, apesar de não ser tão eficiente quanto ao long polling feito utilizando node.js, não foram testados os efeitos colaterais no servidor, tais como desempenho e concorrência de uso, afinal estamos utilizando PHP.

A Técnica

Bom, para começar eu gostaria que vocês lessem o post do Long Polling com Node.JS para entender um pouco mais da técnica utilizada, o que na verdade só é uma técnica e aplicando o que foi proposto por ela:

  • Abrir a conexão e não deixar que esta seja fechada sem resposta
  • Se a conexão for fechada por algum motivo, tentar reabrir
  • Não fechar a conexão até ter uma resposta esperada

Vocês irão ter um Long Polling com sucesso, então vamos lá .!

Lógica, Codificação

Criei quatro arquivos { “index.php” , “data.txt” , “server.php” , “client.js” } o data.txt contém os dados que serão mostrados, mas antes disso será feita uma comparação lógica, que se baseia em NÃO emitir uma resposta se : ‘os dados do data.txt estiverem vazios, se o conteúdo do data.txt for igual ao conteúdo requisitado’

Conteúdo requisitado ? quando recebemos uma resposta do servidor, que obviamente só vamos receber se houver conteúdo, nos capturamos o que foi retornado e enviamos por query string de volta ; Por que ? para comparar se o conteúdo atual ou futuro do data.txt é diferente, pois não vamos responder ou perguntar algo que já sabemos, lembrando que a mesma coisa vale para um banco de dados.

Nosso código PHP ficaria assim:

<?php
       while ( true ) {
              $data = file_get_contents ( 'data.txt' ) ;
              $requested = isset ( $_GET [ 'content' ] ) ? $_GET [ 'content' ] : null ;
              if ( strlen ( $data ) > 0 && $requested !== $data ) {
                     echo $data ;
                     break ;
              } else {
                     sleep ( 2 ) ; // vamos dar um intervalo !
                     continue ;
              }
       }

O que fizemos ? iniciamos um loop infinito, logicamente se ele não for parado a requisição nunca vai terminar, a mesma coisa vale pra quando entramos na página que contém esse código ( server.php ) , e então lemos o conteúdo do arquivo, e procuramos pelo índice content na query string , duas comparações simples ( se a quantidade de caracteres de $data for maior que zero e se $requested for diferente de $data que é o conteúdo do text, emitimos a resposta e paramos o loop , nesse caso a requisição é fechada, feito isso o resto é simples.

Agora, o lado do cliente ( jscript ) , basta criar uma função que é responsável por enviar a requisição para ‘server.php’, e quando esta for fechada ( Http Code 200 ) , criamos a requisição novamente .. e assim por diante ( recursividade )

$ ( document ).ready ( function ( ) {
       $ ( '#ready' ).on ( 'click' , function ( ) {
              startPolling = function ( content ) {
                     content === undefined || $ ( '#response' ).html ( content ) ;
                     var qs = { 'content' : content } ;
                     $.get ( 'server.php' , qs , function ( data ) {
                            startPolling ( data ) ;
                     } ) ;
              } ;

              startPolling ( undefined ) ;
       } ) ;
} ) ;

Só precisamos disso .. bem simples e direto , a unica coisa que tem de demais no código acima, é a recursividade, como eu disse que faz parte da técnica, a conexão precisa ser reaberta caso fechada, e ela só é fechada quando temos a resposta esperada , para testar basta criar um arquivo html e colocar o seguinte código

<html>
       <head>
              <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
              <script type="text/javascript" src="client.js"></script>
       </head>
       <body>
              <input type="button" value="ready" id="ready">
              <div id="response"></div>
       </body>
</html>

Isso é tudo .. agora façam seus testes, não apliquem uma técnica dessa pra algo que possa ser resolvido de outra forma, estude outras maneiras e principalmente, avaliem o custo benefício de cada uma delas, o que foi demonstrado acima funciona, você evita ficar enviando requisições ao servidor quando ele está respondendo o que você não quer , me faz lembrar o burro do shrek .

Abraços, e boa sorte !

 

PHP: Padrões O padrão Observer

Introdução

O padrão Observer é talvez o mais frequentemente encontrados em gráfica de usuário tradicional
aplicações de interface de desktop. É uma excelente maneira de garantir que disparate
componentes do visor refletir as mudanças no núcleo de um sistema. Como veremos, porém,
continua a ser uma técnica poderosa em um ambiente Web-oriented.

Neste artigo eu mostrar-lhe como usar o padrão Observer para construir uma flexível
transmissão estilo de relação entre um componente central e os objetos que
se preocupam com isso.

Primeiro, porém, em preparação para um exemplo de execução, eu dou uma olhada no objeto
zombando de uma grande técnica para teste de condução de código. Continue reading PHP: Padrões O padrão Observer