Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tylër

sobre o artigo "Função para criar URL amigável com PHP"

Recommended Posts

Boa tarde,

 

sobre o artigo Função para criar URL amigável com PHP, tenho algumas dúvidas que gostaria de esclarecer, pois este artigo é perteito!!! ^^

 

Esta é minha aplicação:

 

Imagem Postada

 

 

Bom, a princípio, pensei que funcionaria, bom, mas não como eu queria...

A página /applications/index.php encontra-se da seguinte maneira:

 

<?php
include('config/connection.php');
//configurar manutencao do site
include("config/maintanance.php");
include("config/param.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
 	<title><?php echo $title_site.' - '.$desc_site; ?></title>
<?php
 	if( $page=="" ) {
 	include("ts_includes/home.php");
 	} else if( $page=="products" ) {
 	include("ts_includes/products.php");
 	}
 	?>

A página /config/param.php:

<?php
$page = filter_var( @$_GET[ 'id_post' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );
$id = filter_var( @$_GET[ 'id' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );

// se solicitou alguma pagina
if( isset($_GET['id_post']) || isset($_GET['id']) )
{
	switch( $page ) {
 	case 'products':
 	$desc_site = 'Produtos';
 	$content = 'Produtos!';
 	break;
 	case 'contact':
 	$desc_site = 'Contato';
 	$content = 'Entre em contato conosco';
 	break;
 	case 'rss':
 	include("ts_includes/rss.php");
 	break;

 	default:
 	$desc_site = 'Error 404 - Esta página não existe!';
 	$content = 'Esta página não existe!';
	}
}
?>

O que acontece eh quando eu acesso uma url do tipo: http://localhost/products

ou http://localhost/contact

sempre vai para mesma página inical, o título não muda, nem nada....

 

O que estou fazendo de errado?

 

Se precisarem de mais informações sobre a aplicação, podem perguntar....

 

Att.

 

Eh, já que não tem como eu editar, então vamos recriar o post....

 

 

Bom, eu preciso capturar os parâmetros desta url:

 

http://localhost/products/site1

 

ou http://localhost/products/1

 

Mas utilizando a página main.php do artigo citado acima, eu teria que criar a página products.php e pegar apenas uma id, mas na verdade, estou passando "products" e "1" ou "site1" como parâmetros de index.php, sem criar outra página....

 

main.php

 

include('url_response.php');
$urlpatterns = array(
	'/'=>'index.php',
	'/(?P<page>\w+)'=>'index.php',
	'/post/(?P<page>\w+)'=>'post.php',
	);
url_response($urlpatterns);

Minha dúvida é como fazer para capturar 2 ou mais parâmetros utilizando urlpatterns.

 

'/(?P<page>\w+)'=>'index.php', em index eu precisaria passar uma string e uma ou mais ids como valores

'/post/(?P<page>\w+)'=>'post.php', --> eu precisaria passar uma string e uma id como valores

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola meu amigo Tylër

 

 

eu vi esse artigo aqui no imasters para ser sincero eu achei muito doido a criacao de url amigavel :)

$page = filter_var( @$_GET[ 'id_post' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );
$id = filter_var( @$_GET[ 'id' ] , FILTER_SANITIZE_STRING , FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW );

 

 

isso você pode troca por mysql

$page=mysql_escape_string($_GET["id_post"]);

 

minha segunda dica seria legal em vez de usar o switch :)

você fazer essa busca via banco de dados igual faz o wordpress :)

dar para imaginar esse switch com 50 entradas

 

 

sobre o htacess

 

um exemplo bem simples para você montar

 

RewriteRule ^index/termometro/([a-zA-Z0-9_-]*)/([a-zA-Z0-9_-]*)/([a-zA-Z0-9_-]*)$ termometro.php?mes=$1&ano=$2&pagina=$3

 

aqui eu to pegando tres parametro :)

 

ou seja você pode personalizar as entradas do seu site :)

 

eu acho mais simples dessa forma

 

alem de ser mais rapido

 

ponto a ser avaliado pela minha dica

gerenciamento de url amigavel via banco

uma camada maior de segurança e

reducao de linhas de code :)

 

um abraço meu velho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, tem razão!

Quando eu tinha parceria em uma empresa que tava abrindo, eu utilizava checagem do arquivo que pegava o parâmetro pelo banco, nem sei pq não tô programando assim agora rsrsrsrsr

 

 

Bom, mas sobre os demais pontos, não dá pra eu ficar utilizando escape mysql, pois nem todos os submits são pra inserir no banco, e esta função só funciona se for realizar consultas no banco, não é mesmo? ;)

 

Bom, o que eu tô querendo mesmo é realizar algo como:

 

main.php

'/(?P<page>w+\/?P<id>w+)'=>'index.php',
Isso aí não funciona, sempre cai no bad request da página url_response.php

 

Estou tentando passar 2 parâmetros como referência mas não consigo....

Já pesquisei sobre preg_match com urlpatterns mas não encontrei nada parecido...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cada louco com sua loucura , eu la sei pq você esta programado assim ta fazendo sol :)

deve ser a influencia do sol :)

 

agora serio eu achei esse modelo que você colcou muito louco ,apesar que o wordpress faz via banco de dados isso que você procura

 

para te explicar seria complexo demais

 

na logica seria ele jogar todo o site para index e faz o gerenciamento via banco de dados

 

sobre o escape mysql nao e necessario inserir no banco e so uma camada de protecao no seu code :)

 

e clar que você pode colocar um "if " para ver ser esta passando numero ou string e trata isso e claro

 

mais no post anterior eu te mostrei

RewriteRule ^index/termometro/([a-zA-Z0-9_-]*)/([a-zA-Z0-9_-]*)/([a-zA-Z0-9_-]*)$                    termometro.php?mes=$1&ano=$2&pagina=$3 
            aonde estou/pagina da expresao /campo a  procurar /campo a  procurar /campo a  procurar  pagina de resposta e parametro passado via get :)

 

deu para pega a ideia agora ?

um abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, isso foge totalmente do exemplo do tutorial....

Alguém tem alguma forma de me ajudar com este exemplo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Povo seguinte tava lendo ai o post, eu utilizo de outro modo vejam

 

<?php
$Routes = array(
	  	'/' 	=> 'home.php',
		'/home'	=> 'home.php',
		'/cadastro' => 'cadastro.php',
		// Acessa todas as noticias mas sem utilizar parâmetros
		'/noticias'	=> 'noticias.php',
		// busca notícias por categoria e id
		'/noticias/(?P<categoria>\w+)/id:(?P<id>\d+)' => 'noticias.php',
		// Exemplo da url funcionando com paginação ^^
		'/ranking/page:(?P<page>\d+)' => 'ranking.php'
	  );

function normalize($url){
if( preg_match('/[a-z]+:+[0-9]/', $url) ):
	return $url;
endif;

$url = "/$url";

while( strpos($url, '//') ):
	$url = str_replace('//', '/', $url);
endwhile;

rtrim($url, '/');

return ( empty($url) ) ? '/': $url;
}

function response($Routes){
$Request = str_replace( normalize(PROJECT), '', $_SERVER['REQUEST_URI'] );
$Path = APP;
foreach( $Routes as $Alias => $File ):
	if( !file_exists(APP.$File) ):
		// Arquivo de 404 referente ao erro URL n encontrada.
		include(APP.'404.php');
	else:
		if( preg_match('@^{$Alias}$@',$Request, $_GET) ):
			include(APP.$File);
		else:
			// Arquivo diferenciado do 404 dizendo erro ao processar sua URL ou o q você quiser
			include(APP.'process.php');
		endif;
	endif;
endforeach;
}

?>

desse modo eu posso utilizar de vaaaaaaaaarios modos usando ex:

 

/noticias/esportes/id:15

ou

/noticias/esportes

ou

/noticias/id:15

 

de modos bem flexíveis bastanto apenas add o modo desejado no $Routes;

meu único problema até hj sempre foi

passar como PROJECT o seguinte valor

 

dirname($_SERVER['PHP_SELF']);

toda vez q passo ele, no caso pra q o dir do projeto seja pego automaticamente o script da pau e funciona ñ mais.

o pq, simples qnd você coloca o nome no project ele ta assim:

// Sem barras
// Retorna: nome_do_dir_do_projeto
define('PROJECT', 'nome_do_dir_do_projeto');

// agora usando o dirname ele retorna assim:
// Retorno: /nome_do_dir_do_projeto
define('PROJECT', dirname($_SERVER['PHP_SELF']));

Ai por causa da maldira barrinha / por alguma razão o script buga, ja tentei usar explode('/', PROJECT);

mais por alguma razão o script altera automaticamente o nome do projeto, ex:

/WebRs

com explode se eu n digito nada ele fica igual, agora se eu passo algum param na URL ex:

/cadastro

ele retorna

/WebRS/cadastro

preceberam q o WebR"S" fico maiúsculo, n intendi esse bug ainda, se alguém puder me ajudar a fixar pra poder utilizar com o dirname(), eu agradeceria mt, bom mais inquanto isso... testem essa modificação da função original q postei acima, digam se deu algum resultado no projeto de vc6.

 

t+ vlw

 

Att.WilliamF.

Porto Alegre, 16 de Março de 2012.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.