¿Se puede modificar así una url sin que dé error?

Hola amigos, resulta que quiero cambiar la url de mi web de esto:

http://localhost/novedades/novedades.ph ... =al-pacino

A esto:

http://localhost/novedades/al-pacino/al-pacino.php


Resulta que si con mod rewrite las preparo así, da errores php de variables no declaradas.
paco_man escribió:Hola amigos, resulta que quiero cambiar la url de mi web de esto:

http://localhost/novedades/novedades.ph ... =al-pacino

A esto:

http://localhost/novedades/al-pacino/al-pacino.php


Resulta que si con mod rewrite las preparo así, da errores php de variables no declaradas.

Obviamente te faltan datos, en el primer enlace tienes al menos 5 parametros y en la segunda 1 o 2...
No se como funciona tu web, pero de primeras, si quieres conseguir lo que quieres, o reduces la necesidad de tantos parametros, o te fabricas urls mas grandes ej:
localhost/novedades/6/the-great-country/al-pacino/so/2015/a-pacino
WaterDark escribió:
paco_man escribió:Hola amigos, resulta que quiero cambiar la url de mi web de esto:

http://localhost/novedades/novedades.ph ... =al-pacino

A esto:

http://localhost/novedades/al-pacino/al-pacino.php


Resulta que si con mod rewrite las preparo así, da errores php de variables no declaradas.

Obviamente te faltan datos, en el primer enlace tienes al menos 5 parametros y en la segunda 1 o 2...
No se como funciona tu web, pero de primeras, si quieres conseguir lo que quieres, o reduces la necesidad de tantos parametros, o te fabricas urls mas grandes ej:
localhost/novedades/6/the-great-country/al-pacino/so/2015/a-pacino

¿Pero no se puede quitar variables de las url amigables? yo tenía entendido que sí.

Es que verás, tengo que modificar una página que tenía contenido estático (sin base de datos) y que sus url son de este estilo:

http://localhost/novedades/al-pacino/al-pacino.php

Pero si ahora cambio la url, los comentarios de facebook, los likes de facebook y el posicionamiento de google se pierden. :( Los likes, comentarios y posicionamiento apuntan a esa url.

Por eso me gustaría que conserve exactamente esa estructura.
Los parametros en si no se pierden, sino que se transforman, ejemplo:
locahost/novedades.php?pagina=3
lo puedes transformar a
localhost/novedades/3/
El parametro sigue existiendo, el mod_rewrite o un controlador se debe encargar de traducir la segunda dirección a la primera internamente.

Ahora sobre la web que mencionas, el contenido es estatico y vas a convertirlo en dinamico?(osea va a usar una DB supongo, no?)
El contenido estatico que existe va a seguir existiendo dentro de la DB?
Si es el caso, pues deberás definir en la DB que las llaves primarias o identificativas sean parametros de la url, de forma que con la información contenida en esta url
localhost/novedades/al-pacino/al-pacino.php
puedas identificar el contenido en la DB.

Otro método es que mezcles las webs, y dejes el contenido estatico añadiendo nuevas secciones, o urls para el nuevo contenido dinamico....

Sobre google, pues no tienes porque perder posicion si te preparas un redireccionamientos en las viejas URLs, no que no se es si las cosas de facebook se pueden mover.
WaterDark escribió:Los parametros en si no se pierden, sino que se transforman, ejemplo:
locahost/novedades.php?pagina=3
lo puedes transformar a
localhost/novedades/3/
El parametro sigue existiendo, el mod_rewrite o un controlador se debe encargar de traducir la segunda dirección a la primera internamente.

Ahora sobre la web que mencionas, el contenido es estatico y vas a convertirlo en dinamico?(osea va a usar una DB supongo, no?)
El contenido estatico que existe va a seguir existiendo dentro de la DB?
Si es el caso, pues deberás definir en la DB que las llaves primarias o identificativas sean parametros de la url, de forma que con la información contenida en esta url
localhost/novedades/al-pacino/al-pacino.php
puedas identificar el contenido en la DB.

Otro método es que mezcles las webs, y dejes el contenido estatico añadiendo nuevas secciones, o urls para el nuevo contenido dinamico....

Sobre google, pues no tienes porque perder posicion si te preparas un redireccionamientos en las viejas URLs, no que no se es si las cosas de facebook se pueden mover.

Muchas gracias por tu ayuda, de verdad.

O sea, ¿la llave primaria de la db podría ser por ejemplo esto?

al-pacino

Y a partir de eso ya buscar los demás campos de la fila. ¿Se podría?
Si puede ser la llave primaria, siempre que identifique de forma única un registro, si no es el caso, pues no...
WaterDark escribió:Si puede ser la llave primaria, siempre que identifique de forma única un registro, si no es el caso, pues no...

He añadido una fila con nombre url y al querer pillar la variable de la url para hacer la búsqueda me da error.

$sql="SELECT
titulo,
credencial,
informacion
FROM novedad WHERE url=".$_GET['url'];


mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given


No sé como solucionarlo. [facepalm]

EDITO: Estoy leyendo que poner como clave primaria un varchar ralentizaría el acceso a la base de datos. Al final tendré que perder los comentarios, no creo que exista solución al problema. [buuuaaaa]
paco_man escribió:
WaterDark escribió:Si puede ser la llave primaria, siempre que identifique de forma única un registro, si no es el caso, pues no...

He añadido una fila con nombre url y al querer pillar la variable de la url para hacer la búsqueda me da error.

$sql="SELECT
titulo,
credencial,
informacion
FROM novedad WHERE url=".$_GET['url'];


mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given


No sé como solucionarlo. [facepalm]

EDITO: Estoy leyendo que poner como clave primaria un varchar ralentizaría el acceso a la base de datos. Al final tendré que perder los comentarios, no creo que exista solución al problema. [buuuaaaa]

$sql = "...............";
$result = mysqli_query($conexion, $sql) or die("Error en la consulta");
$row = mysqli_fetch_array($result);
........

Si, VARCHAR es mas lento que INT, pero si no vas a tener un sistema justo de recursos para la cantidad de visitas y tamaño de base de datos, puede asumirse.
Por cierto, no tienes porque ser si o si la primary key la url, si ya tenias una primary key, puedes dejarla, lo unico que debes hacer es declarar la url como UNIQUE.
WaterDark escribió:
paco_man escribió:
WaterDark escribió:Si puede ser la llave primaria, siempre que identifique de forma única un registro, si no es el caso, pues no...

He añadido una fila con nombre url y al querer pillar la variable de la url para hacer la búsqueda me da error.

$sql="SELECT
titulo,
credencial,
informacion
FROM novedad WHERE url=".$_GET['url'];


mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given


No sé como solucionarlo. [facepalm]

EDITO: Estoy leyendo que poner como clave primaria un varchar ralentizaría el acceso a la base de datos. Al final tendré que perder los comentarios, no creo que exista solución al problema. [buuuaaaa]

$sql = "...............";
$result = mysqli_query($conexion, $sql) or die("Error en la consulta");
$row = mysqli_fetch_array($result);
........

Si, VARCHAR es mas lento que INT, pero si no vas a tener un sistema justo de recursos para la cantidad de visitas y tamaño de base de datos, puede asumirse.
Por cierto, no tienes porque ser si o si la primary key la url, si ya tenias una primary key, puedes dejarla, lo unico que debes hacer es declarar la url como UNIQUE.

Muchas gracias, ya descarto usar varchar porque no sé si en un futuro la web tendrá más visitas. [buuuaaaa]
en apache2 se hace con mod_rewrite
Al final lo he solucionado, he puesto que la búsqueda la haga por el nombre en vez de por el id, un lío pero ha salido bien. Aunque me preocupa que se vea afectado el rendimiento pero me han dicho que no pasa nada a no ser que la base de datos tenga 100.000 registros.
Si te sirve como dato, 0.1s ha tardado una DB mysql 5.6 en encontrar un registro VARCHAR entre 488.000 registros, y tarda 0.001s si el VARCHAR tiene un indice(por ejemplo UNIQUE valdría).
La máquina es un VPS con un nucleo de un i7 a 3.1Ghz.
11 respuestas