Jump to content

[RESOLVIDO] Get URL


Ivo Pereira

Recommended Posts

Boas pessoal,

nos meus tempos de PHP sei que havia uma função ou algo do género, que permitia "mascarar" os ficheiros, isto é, imaginemos o seguinte caso:

http://www.site.com/?pagina=home

Isto iria, mascarar por exemplo a página entrada.php.

http://www.site.com/?pagina=galeria

Iria mascar fotos.php

Gostaria de saber como fazer algo deste género, viste que já não me lembro, e já andei à procura por PHP Get URL no Google, e acho que não era nada daquilo 🙂

Abraços 🙂

Link to comment
Share on other sites

Isso é só fazer um index.php e lá dentro processas a variável $pagina e fazes include ao respectivo ficheiro .php.

Se a ideia é também esconder o index.php (dando-lhe outro nome), penso que tens de usar .htaccess para fazer redireccionamentos no Apache. Ou definir outro nome para o ficheiro "default".

Link to comment
Share on other sites

Deixo-te aqui um tutorial de htaccess, mas precisamente de como usar de forma basica o mod_rewrite:

http://www.easymodrewrite.com/guide-syntax

Convém ter noções de regexp (expressões regulares) para criar as regras.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Link to comment
Share on other sites

A minha solução (sem mod_rewrite) passa por teres um index.php onde carregas todos os ficheiros que falaste (entrada.php, fotos.php) dentro 🙂 Servirá apenas de posto de controlo para determinar o que é que carrega o quê.

Visto o parâmetro "pagina" diferir do nome dos ficheiros, eu faria assim:

<?php
    $routes = array
    (
        "home" => "entrada.php",
        "galeria" => "fotos.php"
    );

    if(isset($_GET['pagina']) && isset($routes[$_GET['pagina']])) # Se existir o indice nos routes
        require($routes[$_GET['pagina']]); # Carrega o ficheiro respectivo
    else # Senão, manda para um 404 personalizado
    {
        header('error404.php');
        exit();
    }
?>

Atenção que isto é um sistema simples de routing sem expressões regulares nem substituições como as frameworks actuais têm 🙂

Link to comment
Share on other sites

Não me digas que estavas com medo das expressões regulares... 🙂 :)

No entanto, a solução do main_infection está muito boa e segura, do ponto de vista de inclusão de outros ficheiros que não as páginas, pelo que se não precisares de URL's "bonitos", serve muito bem.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Link to comment
Share on other sites

ainda assim, se precisar de usar url's bonitos, podes usar na mesma o mod_rewrite 🙂

basta criares um ficheiro .htaccess na raiz com o seguinte código:

# Activa o URL Rewriting
RewriteEngine On

# Define a base
RewriteBase /

# Permite acesso a todos os ficheiros, desde que directamente
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php?pagina=$0 [PT,L]

Atenção que isto deve funcionar para endereços do tipo:

http://www.exemplo.tld/home/

No entanto, precisas do código que eu coloquei na mesma.... Fixe fixe é ter uma classe de segmentação de endereços ... isso é que é 🙂

Link to comment
Share on other sites

Ora bem...

Vamos por partes...

URL's Bonitos (clean urls):

URL's bonitos (ou clean urls) são endereços no formato:

http://www.exemplo.tld/parametro1/parametro2/parametro3/

ao invés do formato:

http://www.exemplo.tld/index.php?variavel1=parametro1&variavel2=parametro2&variavel3=parametro3

Os clean urls são endereços que além de serem 'bonitos', indicam o que estás a ver logo à primeira vista e para os motores de pesquisa (como o Google) é considerado um ponto forte para um site subir no ranking de pesquisa.

Segmentação de Endereços ou (URI Segmentation)

A Segmentação de Endereços (ou URI Segmentation) é o acto de partir os URLs bonitos em segmentos. Por exemplo, temos o seguinte endereço:

http://www.teste.com/produtos/listar/ordenar-por/referencia:asc/

Uma classe de segmentação de urls vai partir o endereço de modo a ser possível usar os dados 😛 Dessa forma, imagina uma classe do género:

$url = new URL();
echo $url->segment(1);

Isto iria mostrar "produtos";

Ou então

$url = new URL();
echo $url->segment('produtos');

Iria mostrar "listar";

No entanto, para teres uma boa introdução podes também ver a wikipédia:

http://en.wikipedia.org/wiki/Rewrite_engine

👍

Link to comment
Share on other sites

Hmm, tenho de explorar bem isso 👍

Já agora, imagina que tenho um comando SQL que me vá aparecer a página de edição do id 1 de uma tabela, e tal poderia ser feito assim, vá digo eu:

site.com/?editar_noticia&id=1 (nem estou a ver se isto tá correcto 😛 )

Isto o que faria na página de edição, era ir por buscar o número do id pelo GET, e preencher as informações dos campos para editar por aí?

Link to comment
Share on other sites

Certo 😛

Seguindo a tua lógica de cima, seria um endereço do tipo:

site.com/?pagina=editar_noticia&id=1

E o que o PHP faria/fará é:

1 - Verificar qual a página a carregar (neste caso, editar_noticia) e faz o require.

2 - Verificar qual o id (neste caso, 1) e carregar os dados da base de dados referentes ao id = 1 👍

Gosto sempre de referir que os dados passados por URL (ou seja por $_GET) devem ser sempre "escapados" (escaped) para ter a certeza que não estás a meter dados inválidos, XSS ou código de injecção SQL (SQL Injection).

Para isso deves sempre fazer algo do género:

<?php
/** 
  * Usando o teu endereço exemplo: site.com/?pagina=editar_noticia&id
  * E sabendo que ele passa naquele código-exemplo que coloquei aqui antes
  * Vamos imaginar que este ficheiro é o editar_noticia.php
**/

# Primeiro validamos se não foram passados os dados que pretendíamos pelo $_GET
# Neste caso, só precisamos do id
# Nota: separei os if's para se perceber os diferentes passos, visto que têm o mesmo final
# caso se verifiquem .

if( empty($_GET['id']) ) # Se for vazio, reencaminhamos para um sitio qualquer
{
    header('location: /'); # Neste caso, o index
    exit();
}
elseif( ctype_digit($_GET['id']) === FALSE ) # Caso o valor passado no id não seja um dígito
{
    header('location: /'); # Neste caso, o index
    exit();
}

# Se chegar aqui é porque está tudo de acordo
# Depois, vamos então fazer o escape das variáveis que vamos usar no $_GET
foreach($_GET as $key=>$value)
    $_GET[$key] = strip_tags($value);

# Agora, vamos obter os dados da notícia a editar:
# Nota: vou assumir que já tens a conexão à base de dados feita (o mysql_connect e o mysql_select_db)
$result = mysql_query('SELECT * FROM noticias WHERE id = ' . mysql_real_escape_string($_GET['id']));
$record = mysql_fetch_object($result); # Aqui usa o mysql_fetch_object (eu prefiro), mas podes usar o mysql_fetch_assoc()

# Daqui para baixo é só carregares os dados para o form. Exemplo:
?>
<form name="teste" method="post" action="">
    <label for="campo">Campo:</label><input name="campo" id="campo" type="text" value="<?php echo $record->campo;?>" />
</form>

Abraço

Link to comment
Share on other sites

E imagina que eu numa página tenho uma lista de radioboxes, que vieram de uma consulta SQL, e cada uma delas corresponde a item.

Tenho depois uma optionbox com um button, com as opções editar e eliminar. A pessoa escolhe o radio, onde escolhe o item que quer editar ou eliminar, e depois a acção, logo seguiria para uma página do tipo ?accao=editar_noticia&id=x

Como faria eu isto?

  echo '<td><input type="radio" name="'.mysql_result($query, 0).'"  value="'.mysql_result($query, 0).'"/></td>';	

Estou a utilizar isto para dar o nome do id às radios, estou a seguir bem?

E depois?

Abraço e obrigado pela 'paxorra' 🙂

Link to comment
Share on other sites

  • 2 months later...

com o .htaccess se nao me engano farias algo do genero

RewriteRule ^edit/([A-Za-z0-9-]+)/?$ alterar.php?id=$1 [NC,L]
RewriteRule ^del/([A-Za-z0-9-]+)/?$ apagar.php?id=$1 [NC,L]

e qundo reencaminhasse para

www.mypage.com/edit/204/

iria abrir a página alterar.php?id=204

e quando o encaminhamento fosse

www.mypage.com/del/204

iria abrir a página apagar.php?id=204

não sou especialista mas penso que seria assim....

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.