php

URL Amigáveis em PHP.

Posted in php on February 9th, 2009 by Edipo Luis Fderle – Be the first to comment

Warning: Missing argument 1 for GeSHi::GeSHi(), called in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/codecolorer/codecolorer-core.php on line 137 and defined in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 432

Warning: Missing argument 2 for GeSHi::GeSHi(), called in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/codecolorer/codecolorer-core.php on line 137 and defined in /home/storage/f/73/ab/bitside1/public_html/edipo_blog/blog/wp-content/plugins/deans_code_highlighter/geshi.php on line 432

Suponha que você tenha um script como posts.php na raiz de seu site, então temos uma URL como esta: http://www.yoursite.com/blog.php. Tal página é utilizada para exibir os posts, o post em questão é encontrado sendo passado dois paramentros para a URL, cat(category) e id.

Com base nisso temos o acesso a um certo post digamos o terceiro post que foi gravado no banco acessando a seguinte URL: http://youtsite.com/blog.php?id=3.

Bem essa é a forma como muitos o fazem, mas existem alguns problemas com isso, não problema de execução, isso funciona corretamente, alguns problemas são: esse tipo de URL é MAL indexada pelos sistemas de busca( leia-se Google), esse tipo de URL é aquelas que o fazem dizer “Eca, isso é feio.”, bem isto não é tão feio, você pode encontra algo ainda mais feio, assim:

http://www.example.com/index/Y29udGVudD1vdXRwdXRfbGlzdCZhY3Rpb249c2V0YXJyYXk==

Uma maneira de melhorar isso seria usar uma URL no seguinte estilo:

http://yoursite.com.br/blog/web/1/

ou

http://yoursite.com.br/posts/web/how_write_a_book/

Habilitando o suporte a Rewrite.

Aqui creio eu reside umas das desvantagens de se usar o Rewrite, localmente não temos problemas com isso pois temos total acesso aos arquivos de configuração do apache, já a história muda quando se trata do servidor remoto, onde você hospeda se código, muitos servers não tem essa opção habilidade, alguns após o pedido podem liberar isso para você outros não, com isso em mente vamos seguir em frente.

Para habilitar o suporte você deve acessar o arquivo /etc/apache2/sites-enabled/000-default

Irá ter um trecho igual a esse:

1 <Directory /var/www/>
2 Options Indexes FollowSymLinks MultiViews
3 AllowOverride None
4 Order allow,deny
5 allow from all
6 </Directory>

Mude para

1 <Directory /var/www/>
2 Options Indexes FollowSymLinks MultiViews
3 AllowOverride All
4 Order allow,deny
5 allow from all
6 </Directory>

Isso serve para habilitar o suporte a links simbolicos, e agora habilite o Rewrite assim:

a2enmod rewrite && sudo invoke-rc.d apache2 restart

Pronto se os passos acima derem certo, esta feito.

O Arquivo .htaccess

Para começar sim, esse é um arquivo somente com extesão, segundo, é nele que vamos dizer que queremos o Rewrite habilidato e onde iremos escrever as nossas regrar para “reescrita” das urls.

Nosso .htaccess ficaria como isto:

1
2
3
<strong>RewriteEngine on
RewriteBase /blog
RewriteRule posts/([a-zA-Z\\s]+)\/([0-9]*)/(.*)$ post.php?cat=$1&amp;id=$2&amp;nome=$3</strong>

Para nosso exemplo iriamos ter algo assim no .htaccess, explicando melhor o que acontece ai:

Linha 1: “ligamos” o Modo Rewrite. Linha 2: Dizemos que a base te todo o conteudo será em /blog

Na linha 3 é onde reside a nossa lógica de reescrita da url, como você pode notar temos uma expressão regular ai, vamos entender um pouco o que ela faz:

posts/ quer dizer que tudo que começar com posts/ irá usar esse nossa expressão, então seguimos com ela e temos ([a-zA-Z\\s]+) aqui dizemos que queremos somente letras e espaços em branco, ([0-9]*) aqui somente numeros, e por fim qualquer coisa.

Essa explicação foi muito superficial e é provavel que você não tenha entendido caso nunca viu uma expressao regular na frente, para isso ao final desse post irá ter alguns links contendo alguns sobre ER.

então dizemos que qualquer ocorrencia de um “string” contendo algo que case com a expressao deve ser “lido” como post.php?cat=$1&id=$2&nome=$3.

Ops que diabos são esses $1, $1, $1, o que esta entre os parenteses está sendo “guardado” nessas variaveis, o que nos leva a conclusão que SIM agora podemos acessar essas váriaveis atráves do método $_GET.

Bom basicamente é isso, abaixo segue um exemplo do uso da URL como descrito acima, é apenas uma demostração caso você queira testar ai, os códigos abaixo consistem em um exemplo onde são apresentados dois links como se fosse um “blog”, esta usando Mysql para puxar os dados de exemplo, creio que com isso irá dar para ter um idéia e para você ir fazendo uns testes em cima dele, então lá vai:

list.php
1 <?
2 requireconnet_db.php“;
3 echo<h1>List Posts</h1>“;

4 $posts = mysql_query(SELECT * FROM posts);
5
6 $linhas = mysql_num_rows($posts);
7
8 if (!$posts) {
9 echoNão foi possivel executar a consulta: ‘ . mysql_error();
10 exit;
11 }
12 for($i=0; $i < $linhas; $i++){
13
14 $dado = mysql_fetch_row($posts);
15 echo<p><a href=\”/blog/posts/$dado[2]/$dado[0]/$dado[1] \”> $dado[1]   </a></p>“;
16
17 }
18
19?>

post.php

1 <?
2 requireconnet_db.php“;
3
4 $request = $_SERVER['REDIRECT_URL'];
5
6 echoCategory = “, $_GET['cat'];
7 echo<br>“;
8 echoID = “, $_GET['id'];
9 echo<br>“;
10
11 $cat = $_GET['cat'];
12 $id = $_GET['id'];
13 $nome = $_GET['nome'];
14
15 $consulta = mysql_query(SELECT * FROM posts WHERE category=’$cat‘ and id=’$id);
16
17
18 $linhas = mysql_num_rows($consulta);
19
20 if (!$consulta) {
21 echoNão foi possivel executar a consulta: ‘ . mysql_error();
22 exit;
23 }
24 for($i=0; $i < $linhas; $i++){
25 $dado = mysql_fetch_row($consulta);
26 echo<p><b>Title:</b>“, $dado[1], “</p>“;
27 echo<p><b>Catgory:</b>“, $dado[2], “</p>“;
28 echo<p><b>Body:</b>“, $dado[3], “</p>“;
29 }
30
31 echoVejamos temos um array da URL, você pode usar ele para cirar seus links, ou se preferir use o GET como feito acima“;
32 $parts = explode(/‘, $request);
33 array_shift($parts); // deleta o primeiro elemento do array pois é sempre vazio
34
35 echo<pre>“;
36 print_r($parts);
37 echo</pre>“;
38
39
40 ?>

Tá ai o exemplo, obviamente falta a arquivo de conexao com o banco de dados, abaixo tem um link para baixar todos os arquivos do exemplo. Bom é isso espero que venha a ser útil para alguem. Até a próximo.

Baixar Exemplo

OBS : Perdoem a falta de identação do código mas o wordpress que faz isso(as vezes)

[Primeira Parte] – PHP Orientado a Objetos.

Posted in php on December 26th, 2008 by Edipo Luis Fderle – Be the first to comment

bj

Já faz algum tempo atrás eu mexia com PHP, mas nunca de forma orientada a Objetos, sempre tive a vontade de dar uma olhada para ver como esse negócio era “feito” no PHP, então até que enfim tomei vergonha (risos), e resolvi ir atrás de algumas coisas, então resolvi escrever aqui o que estou vendo para que possa ser útil a alguém também.
Essa será a primeira parte (espero que tenha uma segunda), nessa primeira parte, vermos algumas coisas como: Criação de Classes, Criação de Objetos, Criação de Métodos, Visibilidade de Propriedades e Métodos.

NOTAS ANTES DE COMEÇAR: A versão do php que estou usando é a 5.2.0.

1 – Criando uma simples Classe.
Podemos declarar uma nova classe usando a palavra reservada class, seguida pelo nome da classe começando com letra maiúscula:

<?php
class MinhaPequenaClasse {

}
?>

______________________

<?php

/**
 * @author 
 * @copyright 2008
 */

class MinhaPequenaClasse{
	
	var $username = "jack";
	
	function show_Name(){
		echo $this -> username;
	}
}

$obj = new MinhaPequenaClasse();

$obj -> show_Name();

?>

Vamos analisar esse exemplo.
Primeiramente definimos um classe chamada MinhaPequenaClasse, declaramos um variável chamada username(logo veremos porque não usar o var para declarar), logo após definimos um método( mas que diabos de método que é declarado com a palavra function J ), é assim mesmo, mas no contexto de Orientação Objeto é chamado método, então temos um método chamado show_Name, então mostramos o useraname.

Pergunta: Que diabos é esse $this:?.
Resposta: Isto é uma referência ao objeto chamado, ele está disponível quando certo método é chamado dentro do contexto do objeto.
Logo a baixo criamos um novo objeto da classe, e então na ultima linha, chamamos o método show_Name que pertece a nossa classe.
É um exemplo muito simples mas já ilustra a criação de uma classe que contém um método.

2 – Visibilidades.(Encapsulamento)

Devemos declarar as propriedade e métodos usando uma das três formas disponíveis, public, protected, e private.

Public – Acesso livre, pode ser acessado de dentro e fora da classe
Protected – Acesso live dentro da classe que os declaro, ou em classes herdadas.
Private – Pode ser acessado somente dentro da classe.

O exemplo está comentado então acho que é melhor do que eu escrever aqui, nesse exemplo fizemos o uso da palavra extends, para podermos usar a classe Visibility na classe Visibility2, e assim mostrar o funcionamento do protected.

<?php

class Visibility{
	
	private $privado = "Eu sou private";
	protected $protegido = "Eu sou protegido";
	public $publico = "Eu sou publico";
	
	
	private function MostraTodos(){ // Método Privado, So pode ser acessado dentro da Classe.
		echo $this -> privado, "<br>";
		echo $this -> protegido, "<br>";
		echo $this -> publico, "<br>";
	}
	
	public function Show(){
		$this ->MostraTodos(); // Método Privado chamado.( Dentro da CLASSE)
	}
}

$objeto = new Visibility();

echo $objeto -> publico; // Funciona porque eh public
echo $objeto -> privado;  // Nao funcia, esta fora da classe
$objeto -> Show(); // Funciona, show eh public.
$objeto -> protegido; // Nao Funciona.

class Visibility2 extends Visibility{
	
	function Mostrar(){
		echo  "<b>Acessado em Visibulity2  que herda Visibility:</b> ", $this -> protegido;
	}
}

$objeto2 = new Visibility2();
$objeto2 -> Mostrar();

?>

Resolvi deixar o código com comentários que acho que ficou melhor para entender.

A lógica para a declaração dos métodos usando protected, public, e private é a mesma, caso você declarar um método apesar dizendo:

function Metodo(){ } ele será declarado como public, abaixo mais um código cometado, acho que é bem melhor:

visibility_2.php

<?php

/**
 * @author 
 * @copyright 2008
 */

class Visibility2{
	
	private $privado = "Eu sou privado";
	
	private function Prv_Show(){
		echo "<b> Vindo de private: </b>", $this -> privado, "<br>";
	}
	
	protected function Pro_Show(){
		echo "<b> Vindo de protected: </b>",$this -> privado, "<br>";
	}
	
	public function Pub_Show(){
		echo "<b> Vindo de public: </b>", $this -> privado, "<br>";
	}
	
	public function Show_All(){
		$this -> Prv_Show();
		$this -> Pro_Show();
		$this -> Pub_Show();
	}
}

$visibility = new Visibility2();

//$visibility -> Prv_show(); // Fatal error: Call to private method Visibility2::Prv_show() from context '
//$visibility -> Pro_Show(); // Fatal error: Call to protected method Visibility2::Pro_Show() from context ''
$visibility -> Show_All();
?>

Bom, é isso, obviamente é apenas uma pequena intro, ma já da para ter um idéia do que se trata.