Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Crear URL's amigables a partir de una entrada

Estas en el tema de Crear URL's amigables a partir de una entrada en el foro de PHP en Foros del Web. Hola a todos, tengo una duda que espero que me ayuden a resolver. Tengo una página en la cual se registran entradas, todas ellas tienen ...
  #1 (permalink)  
Antiguo 22/02/2013, 09:43
Avatar de Adbane  
Fecha de Ingreso: junio-2011
Mensajes: 86
Antigüedad: 12 años, 10 meses
Puntos: 6
Pregunta Crear URL's amigables a partir de una entrada

Hola a todos, tengo una duda que espero que me ayuden a resolver.

Tengo una página en la cual se registran entradas, todas ellas tienen un número ID que se genera automáticamente, de 10 carácteres entre números y letras (no es el ID de cada registro en la tabla). Me gustaría mediante urls dinámicas tener un enlace para cada entrada, el primero paso sería haciendo urls amigables para luego convertirlas en dinámicas.

Las entradas de la página se imprimen mediante SQL y PHP, con un bucle, en todas las entradas se ve el número ID generico, como si fuera el título de esta. La idea es que pulsando el ID (o la entrada) te lleve a "www.misitio.com/4785E48166" suponiendo que "4785E48166" es el ID de esta. Usando un código en PHP como este:

Código PHP:
Ver original
  1. echo "<a href='/".$id."'>".$id."</a>";

Hace tiempo ya trabajé con urls amigables, pero usando contenido HTML previamente creado, es decir, sin extraer el contenido de una tabla e imprimiendo en cada url, por eso no tengo ni idea de como hacerlo, y buscando por internet solo encuentro explicaciones de como convertir urls amigables en dinámicas, sin decir como se hacen primeros las amigables, de aquí la necesidad de ayuda.

Si alguien puede ayudarme, le estaré agradecido :D
__________________
Diseñador web por amor al arte, o al HTML mejor dicho
  #2 (permalink)  
Antiguo 22/02/2013, 10:20
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 8 meses
Puntos: 2114
Respuesta: Crear URL's amigables a partir de una entrada

En realidad las URL amigables son siempre dinámicas si así se especifica. Y no tiene nada que ver con PHP. Con PHP —o HTML— sólo visualizas enlaces, que pueden existir o no, en el navegador.

Simplemente tienes que crear una expresión regular que concuerde con esa cadena generada automáticamente. Que en tu caso sería algo como [0-9A-Za-z]{10} y ponerla en tu .htaccess con las demás opciones para usar el módulo rewrite de Apache.

Pero, la información que pases por URL, es decir, tu cadena generada automáticamente, tiene que existir en algún lugar de tu base de datos, para relacionarla con el registro y luego poder mostrarlo.
  #3 (permalink)  
Antiguo 22/02/2013, 10:33
Avatar de Adbane  
Fecha de Ingreso: junio-2011
Mensajes: 86
Antigüedad: 12 años, 10 meses
Puntos: 6
Respuesta: Crear URL's amigables a partir de una entrada

Cita:
Iniciado por Bonez Ver Mensaje
En realidad las URL amigables son siempre dinámicas si así se especifica. Y no tiene nada que ver con PHP. Con PHP —o HTML— sólo visualizas enlaces, que pueden existir o no, en el navegador.

Simplemente tienes que crear una expresión regular que concuerde con esa cadena generada automáticamente. Que en tu caso sería algo como [0-9A-Za-z]{10} y ponerla en tu .htaccess con las demás opciones para usar el módulo rewrite de Apache.

Pero, la información que pases por URL, es decir, tu cadena generada automáticamente, tiene que existir en algún lugar de tu base de datos, para relacionarla con el registro y luego poder mostrarlo.
Todo el contenido se extrae de la base de datos, y es aquí dónde estoy estancado, pues no tengo ni idea de como pasar esa información por url...
__________________
Diseñador web por amor al arte, o al HTML mejor dicho
  #4 (permalink)  
Antiguo 22/02/2013, 13:08
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 8 meses
Puntos: 2114
Respuesta: Crear URL's amigables a partir de una entrada

La pasas por URL al construir el enlace en PHP/HTML.

Las URLs no se "crean" en ningún sitio. Tú pones tu enlace que apunte por ejemplo a miweb.com/tG67uJ651d. Y cuando tengas configurado tu .htaccess con su correspondiente expresión regular, entonces Apache al recibir esa petición de URL desde el navegador mirará ese archivo y buscará qué hacer con una url que "sea de 10 letras y/o números". Y como encontrará una concordancia, entonces llamará al archivo que hayas indicado en el archivo .htaccess.

Por ejemplo tienes en tu .htaccess algo así:
Código Apache:
Ver original
  1. RewriteEngine On
  2. RewriteRule  ^[0-9A-Za-z]{10}/?$ /entrada.php?id=$1 [L]

Entonces en el archivo entrada.php recoges el dato pasado por URL mediante $_GET['id']. Y a partir de ahí, sacas lel registro relativo a ese dato.
  #5 (permalink)  
Antiguo 22/02/2013, 13:58
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: Crear URL's amigables a partir de una entrada

Deberias explicar como le pasas esos datos al html para armar la url con id.
Lo ideal sería traer el titulo de la entrada de la la base de datos y a partir de eso usar una funciona como esta:
Código PHP:
Ver original
  1. function toAscii($str, $replace = array(), $delimiter = '-')
  2. {
  3.     if (!empty($replace)) {
  4.         $str = str_replace((array)$replace, ' ', $str);
  5.     }
  6.  
  7.     $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
  8.     $clean = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $clean);
  9.     $clean = strtolower(trim($clean, '-'));
  10.     $clean = preg_replace("/[\/_|+ -]+/", $delimiter, $clean);
  11.  
  12.     return $clean;
  13. }

y la usas asi:
Código PHP:
Ver original
  1. echo "<a href='/".toAscii($title)."'>".$id."</a>";

entonces si tu titulo era "esto es un tutorial de php" quedaria:
esto-es-un-tutorial-de-php

espero te sirva
  #6 (permalink)  
Antiguo 22/02/2013, 14:08
Avatar de Adbane  
Fecha de Ingreso: junio-2011
Mensajes: 86
Antigüedad: 12 años, 10 meses
Puntos: 6
Respuesta: Crear URL's amigables a partir de una entrada

Cita:
Iniciado por Bonez Ver Mensaje
La pasas por URL al construir el enlace en PHP/HTML.

Las URLs no se "crean" en ningún sitio. Tú pones tu enlace que apunte por ejemplo a miweb.com/tG67uJ651d. Y cuando tengas configurado tu .htaccess con su correspondiente expresión regular, entonces Apache al recibir esa petición de URL desde el navegador mirará ese archivo y buscará qué hacer con una url que "sea de 10 letras y/o números". Y como encontrará una concordancia, entonces llamará al archivo que hayas indicado en el archivo .htaccess.

Por ejemplo tienes en tu .htaccess algo así:
Código Apache:
Ver original
  1. RewriteEngine On
  2. RewriteRule  ^[0-9A-Za-z]{10}/?$ /entrada.php?id=$1 [L]

Entonces en el archivo entrada.php recoges el dato pasado por URL mediante $_GET['id']. Y a partir de ahí, sacas lel registro relativo a ese dato.
Perfecto, funciona, pero solo con enlaces como este: "misitio.com/entrada.php?id=212491D07D".
Ahora bien, la parte del htaccess no logro que funcione correctamente. Me gustaría saber a que hace referencia el $1. Normalmente si paso mi ID generico de 10 caracteres por una variable (es decir, $212491D07D) no lo reconoce. Lo que yo hago es crear una variable que recoge el valor del $_GET['id'] y la paso por la sentencia SQL con un WHERE para seleccionar los valores que necesito, ya si eso luego lo imprimo.

Aunque si pongo en el htaccess el siguiente código:
Código Apache:
Ver original
  1. RewriteEngine On
  2. RewriteRule  ^[0-9A-Za-z]{10}/?$ /entrada.php?id=212491D07D [L]

Y luego ingreso la url "misitio.com/212491D07D", reconoce el contenido que pertenece a "212491D07D". :/

EDIT: Bueno más o menos diría que solucionado, quitando la expresión regular, he puesto (\w+), que sería el valor que se guarda en el $1. Aunque desconozco si es la mejor manera de hacerlo...

Quedaría así:
Código Apache:
Ver original
  1. RewriteEngine On
  2. RewriteRule  ^(\w+)/?$ /entrada.php?id=212491D07D [L]
__________________
Diseñador web por amor al arte, o al HTML mejor dicho

Última edición por Adbane; 22/02/2013 a las 14:26 Razón: Más o menos solucionado.

Etiquetas: amigables, dinamicas, enlaces, entrada, url
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:21.