Foros del Web » Programando para Internet » PHP »

Problemas con URLs Amigables y PHP

Estas en el tema de Problemas con URLs Amigables y PHP en el foro de PHP en Foros del Web. Buenos dias Ante todo, he buscando bastante por internet y no he visto nada...y si escribo ya es por pura desesperacion, aunque seguro que es ...
  #1 (permalink)  
Antiguo 09/07/2015, 01:37
 
Fecha de Ingreso: abril-2015
Mensajes: 12
Antigüedad: 9 años, 7 meses
Puntos: 0
Problemas con URLs Amigables y PHP

Buenos dias

Ante todo, he buscando bastante por internet y no he visto nada...y si escribo ya es por pura desesperacion, aunque seguro que es la cosa mas tonta del mundo...

Bien, yo tengo este codigo para crear urls amigables

RewriteRule ^artista/([^/]*)$ /artistas-ver.php?nombre=$1

Funciona sin problemas al poner por ejemplo artista/manolo. pero cuando el usuario se llama manolo garcia ahi que ponerlo artista/manolo%20garcia

Mi idea es sustituir eso por un guion, pero realmente he probado mil ejemplos y no doy con ello, ninguno me acaba funcionando.

Si me podeis echar un cable os estaria muy agradecido...
  #2 (permalink)  
Antiguo 09/07/2015, 08:14
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problemas con URLs Amigables y PHP

En serio?
Código PHP:
Ver original
  1. <?php
  2. $nombre  = "Manolo garcia";
  3. $nombre = str_replace(" ", "-", strtolower($nombre));

¿No era tan difícil verdad?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 09/07/2015, 16:00
 
Fecha de Ingreso: abril-2015
Mensajes: 12
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Problemas con URLs Amigables y PHP

Vale, has intentado dejarme en ridiculo, gracias, no lo has conseguido, te explico, esto es un foro donde se aprende tambien, no hace falta ser tan listillo.

Ahora me salen los enlaces con guion, bien, tu parte bien, pero ahora en el htaccess, como lo tendria que modificar?

He probado con

RewriteRule ^artista/(.+)$ /artistas-ver.php?nombre=$1

pero tampoco funciona. Los que estan guion sin problema, con los que tienen guion nada.
  #4 (permalink)  
Antiguo 10/07/2015, 05:26
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 11 años, 2 meses
Puntos: 578
Respuesta: Problemas con URLs Amigables y PHP

Pues algo así:

Código Apache:
Ver original
  1. RewriteRule ^artista/([^/]*)-([^/]*)$ /artistas-ver.php?nombre=$1%20$2
  #5 (permalink)  
Antiguo 11/07/2015, 22:29
 
Fecha de Ingreso: enero-2011
Mensajes: 94
Antigüedad: 13 años, 10 meses
Puntos: 7
Respuesta: Problemas con URLs Amigables y PHP

Tu archivo .htaccess

Rewriterule ^tema/(.*)/(.*)/?$ tema.php?t=$1&n=$2 [L]

Tu archivo php


Código HTML:
Ver original
  1. <a href="http://tupaginaweb.com/tema/<?php echo $row_Publicados['id_tema']; ?>/<?php echo LimpiarUrl($row_Publicados['titulo']); ?>"><?php echo $row_Publicados['titulo']; ?></a>


Función limpiar cadena

Código PHP:
Ver original
  1. if (!function_exists("LimpiarUrl"))
  2. {
  3.     function LimpiarUrl($texto)
  4.     {    
  5.         $texto=utf8_decode($texto);
  6.         $con_acento = utf8_decode("ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ");
  7.         $sin_acento = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
  8.         $con_espacio = " ";
  9.         $sin_espacio = "-";
  10.         $texto= strtr($texto, $con_acento, $sin_acento);
  11.         $texto= strtr($texto, $con_espacio, $sin_espacio);
  12.         $texto = preg_replace("/[^A-Za-z0-9 -]/","",$texto);
  13.         $texto = strtolower(trim ($texto));
  14.        
  15.         return $texto;
  16.     }
  17. }

Última edición por nedyer; 12/07/2015 a las 00:25
  #6 (permalink)  
Antiguo 12/07/2015, 17:07
 
Fecha de Ingreso: abril-2015
Mensajes: 12
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Problemas con URLs Amigables y PHP

Lo he adaptado al codigo y no ha funcionado...

es raro...tendria que modificar algo en el archivo que se veria la ficha del artista?

Con el codigo que has posteado solo puedo verlo como lo veia antes, a la que tiene el - ya la pagina se muestra pero es como si el nombre a mostrar no lo encontrara
  #7 (permalink)  
Antiguo 12/07/2015, 19:23
 
Fecha de Ingreso: enero-2011
Mensajes: 94
Antigüedad: 13 años, 10 meses
Puntos: 7
Respuesta: Problemas con URLs Amigables y PHP

<ifmodule mod_rewrite.c>

RewriteEngine On

#AddDefaultCharset utf-8
#AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Rewriterule ^artista/(.*)/?$ artista.php?nombre=$1 [L]

</ifmodule>


Código HTML:
Ver original
  1. <a href="http://tupaginaweb.com/artista/<?php echo LimpiarUrl($row_artista['nombre']); ?>"><?php echo $row_artista['nombre']; ?></a>

en la funcion
remplaza los espacios en blanco de la cadena por cualquier símbolo

Código PHP:
Ver original
  1. $sin_espacio = "-";


Si te sigue llegando la cadena así es porque tienes un problema de configuración de charset malo revisa tu página o como traes la conexión de la base de datos.

Corregir problemas de charset desde la base de datos

Código PHP:
Ver original
  1. $hostname_tuweb = "localhost";
  2. $database_tuweb = "artistas";
  3. $username_tuweb = "root";
  4. $password_tuweb = "123456";
  5. $tuweb = mysqli_connect($hostname_tuweb, $username_tuweb, $password_tuweb) or die("Error: " . mysqli_error($tuweb));
  6.  
  7. mysqli_set_charset($tuweb, "utf8");

en tu html

Código HTML:
Ver original
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  #8 (permalink)  
Antiguo 13/07/2015, 02:53
 
Fecha de Ingreso: abril-2015
Mensajes: 12
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Problemas con URLs Amigables y PHP

Buenos dias

Lo acabo de probar como me has indicado.

El tema es que el enlace con el guion lo genera correctamente, es mas, ahora mismo os puedo enseñar esta prueba

http://www.xsmusic.es/artista/aitor-rewind

pero si os fijais es como si el nombre que busca no apareciese.

He añadido tambien lo del htaccess y lo del archivo de conexion, unido al que yo tenia. Lo del utf8 ya lo tenia en todos los archivos...

Es un jaleo la verdad...pero no se porque puede ser! :(
  #9 (permalink)  
Antiguo 13/07/2015, 09:46
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problemas con URLs Amigables y PHP

Código Apache:
Ver original
  1. RewriteEngine on
  2.  
  3. RewriteRule ^artista/([a-zA-Z0-9_-]+)$ artistas-ver.php?nombre=$1

artistas-ver.php
Código PHP:
Ver original
  1. <?php
  2.     var_dump($_GET);

http://localhost/artista/aitor-rewind
Código HTML:
Ver original
  1. array (size=1)
  2.   'nombre' => string 'aitor-rewind' (length=12)
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #10 (permalink)  
Antiguo 13/07/2015, 13:31
 
Fecha de Ingreso: abril-2015
Mensajes: 12
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Problemas con URLs Amigables y PHP

Creo que no me he explicado bien ya que no entiendo muy bien el ultimo comentario...

os dejo el artistas-ver.php que es donde se veria cada enlace (logico)

Código PHP:
<?php
    
    
require('conexion.php');

    
$nombre=$_GET['nombre'];
    
    
    
$query="SELECT id, nombre, ciudad, nacional, biografia, estilos, imagen, facebook_url, twitter_url, soundcloud_url, patrocinado FROM artistas WHERE nombre='$nombre'";
    
    
$resultado=$mysqli->query($query);
    
    
$row=$resultado->fetch_assoc();
    

?>
Ahora mismo cojo el nombre de $nombre desde el get y asi es como lo muestro. He probado a cambiar ahi tambien como me habeis indicado pero nada.

Al generar el enlace SI lo hace con guion
  #11 (permalink)  
Antiguo 13/07/2015, 20:28
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problemas con URLs Amigables y PHP

A ver...

Puedo equivocarme, pero me parece que no estas poniendo nada de tu parte y esperas que alguien te lo resuelva, o al menos esa es la impresión que me dan tus comentarios.

¿Probaste a debuggear la variable $_GET a ver que tiene?
Deberías, pero si no lo hiciste, yo lo hice por ti, eso es lo que te puse en el mensaje anterior, si entras a artista/aitor-rewind entonces $_GET["nombre"] es igual a aitor-rewind.

Por lo tanto, cuando quieres hacer WHERE nombre='$nombre' eso es siempre falso, ningun artista se llama aitor-rewind, en su lugar, posiblemente alla uno que se llame Aitor rewind.

En tu primer mensaje tu lo que pediste es una via para convertir "Aitor rewind" en "aitor-rewind" para poder crear un link y usarlo en la url, eso ya lo tienes resuelto, el problema que tienes ahora es que necesitas hacer el camino opuesto, de "aitor-rewind" tienes que ir a "Aitor rewind" y eso no es posible. ¿Porque? bueno, porque hay multitud de nombres posibles que respondan a "aitor-rewind", por nombrar algunos: "Aitor rewind", "AITOR REWIND" "AiToR ReWinD" "Aítór RÉwíND" "áitór rewínd", etc

Lo que hiciste se llama formalmente encriptacion de una via, es el mismo principio que siguen las funciones hash, en tu caso el resultado ademas es de longitud variable.

El problema que tienes se puede tratar de dos formas distintas dependiendo del estado del proyecto.

Caso 1: El proyecto esta en desarrollo y hay tiempo de modificarlo
Solucion: Agregar a la tabla articulos un campo nuevo llamado "slug" donde se guarda el nombre del artista pero en el formato que se veria la url, este campo se le puede permitir al usuario escribirlo a la hora de la carga o bien calcularlo automaticamente antes de guardar, es el que usas luego en las urls en vez del nombre.

Caso 2: El proyecto ya esta avanzado, tienes varios miles de registros y varias decenas de tablas relacionadas, necesitas implementar urls amigables pero la alternativa anterior implica refactorizar el 90% del sistema.
Solucion: Pensar a las urls amigables como un modulo independiente, puedes usar una clase como esta la cual desarrolle hace un año para una situacion de este tipo o cualquier otra similar.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #12 (permalink)  
Antiguo 14/07/2015, 03:15
 
Fecha de Ingreso: abril-2015
Mensajes: 12
Antigüedad: 9 años, 7 meses
Puntos: 0
Respuesta: Problemas con URLs Amigables y PHP

Te equivocas, y hablas sin saber, y en serio, para eso mejor uno se queda callado...

Si escribo aqui es porque llevo bastante tiempo investigando sobre el problema. Que tu eres muy listo y lo has conseguido solucionar a la primera, felicidades, pero yo no, y por eso pregunto.

Estoy valorando las dos opciones que comentas, la primera al tener mas de mil registros creo que es un poco inviable tocar toda la base de datos.

Con la segunda opcion, la he estado revisando y parece estar muy bien tu clase, pero...aunque resulte absurdo para ti, o sencillamente muy facil. No veo la forma de integrar esa clase con mi codigo, osease como lo uso para que me genere las urls amigables.

Sinceramente si vas a escribir en plan borde, prefiero que ni contestes, porque la prepotencia de alguien que sabe mas que otro, es basicamente absudo, porque estas en un foro de ayuda, no en un foro de a ver quien sabe mas. Asique comportate, que imagino que ya no eres un crio.

PD: Gracias por tus respuestas
  #13 (permalink)  
Antiguo 14/07/2015, 10:28
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Problemas con URLs Amigables y PHP

Cita:
Te equivocas, y hablas sin saber, y en serio, para eso mejor uno se queda callado...

Si escribo aqui es porque llevo bastante tiempo investigando sobre el problema. Que tu eres muy listo y lo has conseguido solucionar a la primera, felicidades, pero yo no, y por eso pregunto.
Hablo basandome en esto, donde los primero 15 resultados responden a tu pregunta, por lo tanto supongo que no buscaste en google primero (Eso esta en las normas del foro, las cuales aceptaste a la hora de registrarte, no lo digo yo).

Muchos usuarios leen tu tema y ni responden justamente por ese motivo, porque asumen (con motivos) que esperas una solucion hecha y no pones nada de tu parte.

Yo tambien creo eso, pero aun asi te respondo y te ayudo ¿No crees que eso sea comportarse debidamente? ¿No te parece que en vez de ofenderte y enojarte con el que te ayuda de alguna manera, una mejor forma de "comportarse" seria evaluar sus propuestas y pasar por alto aquellas palabras que no te afectan? La forma de mostrar que estoy equivocado, que te juzgue mal y que realmente hable sin saber, hubiera sido que nos mostraras solo 10 de esos ejemplos
Cita:
realmente he probado mil ejemplos
con solo publicar 10 ejemplos de esos que probaste, o los links a donde los sacaste, hubiera quedado mas que claro que estaba equivocado.
¿O acaso prefieres que no responda mas? Si es la segunda opción, avísame que no sigo invirtiendo tiempo en tu causa.


La clase esa no esta muy documentada que digamos, te paso un ejemplo de uso para que te des una idea de como funciona.
Te aviso que cuando la hice estaba pensada para funcionar en un buscador de casi dos decenas de filtros generando urls amigables para cada busqueda donde habia justamente muchos parametros, en tu caso solo tienes 1 lo cual simplifica bastante las cosas.

En localhost, en la carpeta raiz, hay 4 archivos:

.htaccess
Código Apache:
Ver original
  1. RewriteEngine on
  2.  
  3. RewriteRule ^artista/([a-zA-Z0-9_-]+)$ test.php?grupo=artista&token=$1
  4.  
  5. RewriteRule ^cancion/([a-zA-Z0-9_-]+)$ test.php?grupo=cancion&token=$1

test.php
Código PHP:
Ver original
  1. <?php
  2.     require "FriendlyUrl.php";
  3.    
  4.     echo "<h1>Crear dos tokens para usar en los links</h1>";
  5.        
  6.     $friendly_artista = new FriendlyUrl("artista");    // Estos nombres no tienen nada que ver con los nombres de las tablas.
  7.     $friendly_cancion = new FriendlyUrl("cancion");    // Estos nombres no tienen nada que ver con los nombres de las tablas.
  8.    
  9.    
  10.     // Aca agregas como primer paramero, el id del autor, es decir, el valor de la clave primaria del registro a identificar
  11.     // Como segundo parametro, el texto amigable que lo representa.
  12.     // Como tercer paramero va el orden, eso es en caso de que tengas varios datos, en tu caso solo hay uno y da lo mismo cualquier numero, pero pon uno que te acuerdes porque despues lo vas a necesitar, ej: 0.
  13.     $friendly_artista->add(345, "aitor-rewind", 0);
  14.    
  15.     // Esto es lo mismo, solo que esta url amigable correspondera a una cancion en vez de a un artista.
  16.     $friendly_cancion->add(873, "la-luna-y-el-jilguero", 0);
  17.    
  18.     // Generas 2 tokens amigables, uno para un artista y otro para una cancion.
  19.     // Estos token particulares, seran el mismo texto que les pasaste en el add.
  20.     // Pero solo porque es un caso basico particular.
  21.     $token_artista = $friendly_artista->generate();
  22.     $token_cancion = $friendly_cancion->generate();
  23.        
  24.     echo "<a href='/artista/$token_artista'>Artista</a><br>";
  25.     echo "<a href='/cancion/$token_cancion'>Cancion</a><br>";
  26.    
  27.     // Aca recibir los tokens por url y realizar el proceso inverso.
  28.     if(!empty($_GET)) {
  29.         // Mostrar por pantalla
  30.         var_dump($_GET);
  31.         $friendly = new FriendlyUrl($_GET["grupo"]);
  32.         // Intentar hacer lo siguiente.
  33.         $friendly->decompiler($_GET["token"]);
  34.         $partes = $friendly->getParts();
  35.         var_dump($partes);    
  36.        
  37.         // El primer subindice (0) corresponde al valor que le hallas puesto en el tercer parametro al llamar al metodo add previamente, debes usar el mismo.
  38.         // El segundo subindice (0) hace referencia al numero de parametro en esa posicion, en este caso solo hay uno y por lo tanto es 0, ya que el primer elemento de un array tiene como subindice 0.
  39.         // El tercer subindice (0) hace referencia al valor de la url que quieras obtener, si usas 0, estas obteniendo el id, si usas 1 estas obteniendo el texto.
  40.         echo "La url corresponde a ".$_GET["grupo"]." y el id del elemento de la url es: ".$partes[0][0][0]."<br>";
  41.         echo "La url corresponde a ".$_GET["grupo"]." y el texto del elemento de la url es: ".$partes[0][0][1];        
  42.     }

config.php
Código PHP:
Ver original
  1. <?php
  2.     define("BD_USUARIO", "root");
  3.     define("BD_PASSWORD", "");
  4.     define("BD_NAME", "test");

y el cuarto es FriendlyUrl.php que te puedes descargar del repositorio.

en el ejemplo puse artistas y canciones para que se entienda un poco mas para que sirve el parámetro del constructor, puedes tener tantos grupos como quieras o incluso urls amigables diferentes para cada idioma.

Para que te des una idea de la potencia de la clase, puedes entrar a esta web, hacer una busqueda en el formulario principal y luego ir cambiando los filtros de la barra de la izquierda, veras que los links son extremadamente amigables y contienen un monton de filtros y parametros.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: amigables, urls
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 21:29.