Foros del Web » Programando para Internet » PHP »

Cambiar /articulo.php?id=X por /titulo-del-articulo

Estas en el tema de Cambiar /articulo.php?id=X por /titulo-del-articulo en el foro de PHP en Foros del Web. Hola a tod@s. Creo que me estoy volviendo loco. He probado mil cosas, he leído mil manuales y nada, no lo he conseguido. Para empezar, ...
  #1 (permalink)  
Antiguo 09/03/2011, 00:50
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Cambiar /articulo.php?id=X por /titulo-del-articulo

Hola a tod@s.

Creo que me estoy volviendo loco. He probado mil cosas, he leído mil manuales y nada, no lo he conseguido.

Para empezar, decir que me gustaría cambiar las url's:

www.dominio.com/articulo.php?id=1

Por:

www.dominio.com/titulo-del-articulo

He leído mil post de este foro pero no he logrado dar con la solución. A ver si contando mi caso más detalladamente alguien consigue ayudarme.

Seguramente ahora alguien me dirá "añade estas líneas en tu .htaccess y..." pero nada, eso ya lo he probado de mil maneras, lo más que he conseguido es, con este código:

Cita:
Options +FollowSymLinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteEngine on
RewriteRule ^(.+)$ articulo.php?id=$1
Que url del tipo:

www.dominio.com/articulo.php?id=1

Se vea así (y funcione):

www.dominio.com/1

Pero claro... eso no es lo que quiero. Por si sirve, diré que tengo una tabla en mi base de datos llamada articulos y dentro de ésta varios campos, como id, titulo, url , entre otros.

De tal modo que si añadiera un artículo llamado "Tengo hambre" estos serían los registros en la base de datos:

articulos
----------
id | titulo | url
---------------------------
1 | Tengo hambre | tengo-hambre

Este es el código (después de quitar la morralla para que se vea más claro) que tengo en mi articulo.php

Código PHP:
<?php
include('config.php');
if(isset(
$_GET['id'])){
$id $_GET['id'];
database_connect();
$query "SELECT * from articulos where id = $id";
$echo mysql_error();
$result mysql_query($query);
$num_rows mysql_num_rows($result);
if (
$num_rows == 0) {
    include 
"404.php";;
    exit;
}
while (
$row mysql_fetch_assoc($result)) {
$titulo $row['titulo'];
$contenido $row['contenido'];
$url $row['url'];
    }
}
echo 
$titulo;
echo 
$contenido;
?>
Supongo que si en lugar de la ID (articulo.php?id=1) pudiera mostrar el registro que tengo en url (articulo.php?id=tengo-hambre) podría hacerlo funcionar. Pero claro, he ahí la cuestión, cómo hacerlo y sobre todo que funcione jeje...

Agradecería cualquier ayuda.

PD: no sabía si publicarlo en el foro de PHP o en el de Apache, pero como lo que necesito (creo) es cambiar o meter algo en el código php... por eso lo hice aquí.

Un saludo!
  #2 (permalink)  
Antiguo 09/03/2011, 01:46
Avatar de gogupe  
Fecha de Ingreso: octubre-2006
Ubicación: Mallorca
Mensajes: 897
Antigüedad: 17 años, 6 meses
Puntos: 32
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Hola, a ver si te puedo ayudar con esto.

Me imagino que en la base de datos el campo titulo no es unico ¿verdad?, es decir que se puede repetir, si es así, no puedes poner solamente la url de esta forma: www.dominio.com/titulo-del-articulo ya que te podría dar varios resultado, asi que por un lado tendrías que introducir la id del registro.

Yo pondría la siguiente regla en el htaccess, te la escribo como yo lo tengo en mis páginas.

Código:
RewriteBase /
RewriteRule ^(.*)_(.*).html		articulo.php?id=$2
EL primer valor iría el titulo y el segundo la id, pero solo coge la información del segundo, el titulo puedes poner lo que quieras que no importa que se repita.

Saludos.
  #3 (permalink)  
Antiguo 09/03/2011, 05:17
Avatar de xalupeao  
Fecha de Ingreso: mayo-2008
Ubicación: Santiago, Chile
Mensajes: 749
Antigüedad: 15 años, 11 meses
Puntos: 12
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

es cosa que cambies la consulta, es decir que sea asi.

Código PHP:
Ver original
  1. $query = "SELECT * from articulos where titulo=$id";

saludos.
__________________
Hosting en Chile en Silverhost - La solución en Hosting en Chile.
  #4 (permalink)  
Antiguo 09/03/2011, 06:38
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Hola. Gracias por vuestras sugerencias.

Haciéndolo como me dice gogupe funciona, es decir, que aunque ponga en el navegador de enlace

www.dominio.com/skasf-adafad-afad-fadjjf_5.html

Funciona y se muestran los datos solicitados del artículo con id 5. Pero claro, así no es como me gustaría dejarlo, me gustaría que fuera sin el número de la ID a ser posible XD. Los artículos no van a repetir título, pues son pocos (ya están redactados) y todos diferentes, así que por eso no habría problema.

Y cambiando el id = $id por el titulo = $id como apuntaba xalupeao, salta el 404.php

El código completo de mi articulo.php es este:

Código PHP:
<?php 
include('config.php'); 
if(isset(
$_GET['id'])){ 
$id $_GET['id']; 
database_connect(); 
$query "SELECT * from articulos where id = $id"
$echo mysql_error(); 
$result mysql_query($query); 
$num_rows mysql_num_rows($result); 
if (
$num_rows == 0) { 
    include 
"404.php";; 
    exit; 

while (
$row mysql_fetch_assoc($result)) { 
$titulo $row['titulo']; 
$contenido $row['contenido']; 
$url $row['url']; 
    } 

echo 
$titulo
echo 
$contenido
?>
<?php
$consulta 
mysql_query("SELECT * FROM articulos, categorias WHERE categoria = id_categoria AND id_categoria = '$categoria[id_categoria]' AND id NOT IN ($id) AND excluir != 1 ORDER BY titulo ASC");
while (
$row mysql_fetch_array($consulta)){
$titulo $row['titulo'];
echo 
"$titulo";
}  
?>
Pero como digo si cambio el id = $id por titulo = $id me abre el 404.php. Y si quito el

Código PHP:
if ($num_rows == 0) {  
    include 
"404.php";;  
    exit;  

Se muestra todo vacío, vamos, valores en blanco y sino me da error de mysql_fetch_assoc() y demás XD

En fin, ¿tan difícil es? yo es que ya no sé qué hacer ni qué probar
  #5 (permalink)  
Antiguo 09/03/2011, 06:57
 
Fecha de Ingreso: julio-2010
Ubicación: Galicia
Mensajes: 91
Antigüedad: 13 años, 9 meses
Puntos: 9
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Si los artículos están ya todos escritos y no van a ser más, por qué no los haces directamente sobre html? así te quedaría www.dominio.com/nombre_archivo
^^'
  #6 (permalink)  
Antiguo 09/03/2011, 07:05
Avatar de gogupe  
Fecha de Ingreso: octubre-2006
Ubicación: Mallorca
Mensajes: 897
Antigüedad: 17 años, 6 meses
Puntos: 32
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Cita:
Iniciado por xalupeao Ver Mensaje
es cosa que cambies la consulta, es decir que sea asi.

Código PHP:
Ver original
  1. $query = "SELECT * from articulos where titulo=$id";

saludos.
Aquí el fallo que veo es que no cierras entre comillas simples $id;

$query = "SELECT * from articulos where titulo='$id'";

Pruébalo asi que seguro que debe funcionar.

Si no se repite los titulos, cambia la regla de htaccess y seguro que funcionará

Ya nos cuenta.
  #7 (permalink)  
Antiguo 09/03/2011, 07:11
 
Fecha de Ingreso: julio-2010
Ubicación: Galicia
Mensajes: 91
Antigüedad: 13 años, 9 meses
Puntos: 9
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Si el ID es un número no hace falta encerrarlo entre comillas simples, no?
Eso creo, vamos ^^
  #8 (permalink)  
Antiguo 09/03/2011, 07:21
Avatar de gogupe  
Fecha de Ingreso: octubre-2006
Ubicación: Mallorca
Mensajes: 897
Antigüedad: 17 años, 6 meses
Puntos: 32
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Cita:
Iniciado por Narxon Ver Mensaje
Si el ID es un número no hace falta encerrarlo entre comillas simples, no?
Eso creo, vamos ^^
No es necerario cerrarlo entre comillas, aunque también funcionaría, pero es que está haciendo la consulta "Titulo", y eso es un campo de texto, por eso la variable $id, contendrá texto, que por otro lado no se debería llamar asi, pero eso ya es cosa del programado

Saludos.
  #9 (permalink)  
Antiguo 09/03/2011, 07:24
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Cita:
Iniciado por gogupe Ver Mensaje
$query = "SELECT * from articulos where titulo='$id'";

Pruébalo asi que seguro que debe funcionar.
Sigue pasando lo mismo...
  #10 (permalink)  
Antiguo 09/03/2011, 07:32
Avatar de gogupe  
Fecha de Ingreso: octubre-2006
Ubicación: Mallorca
Mensajes: 897
Antigüedad: 17 años, 6 meses
Puntos: 32
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

haz que muestre por pantalla la variable $query a ver si está recogiendo bien los datos.

echo $query;

A ver que te imprime por pantalla.
  #11 (permalink)  
Antiguo 09/03/2011, 07:39
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Poniendo ese echo $query; si entro por ejemplo en: /articulo.php?id=4

Esto es lo que me muestra:

SELECT * from articulos where titulo = 4

Es eso lo que me preguntas? La verdad es que soy un poco "inútil" en esto del PHP XD
  #12 (permalink)  
Antiguo 09/03/2011, 08:22
 
Fecha de Ingreso: julio-2010
Ubicación: Galicia
Mensajes: 91
Antigüedad: 13 años, 9 meses
Puntos: 9
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Pytufyn, creo que lo que tienes que tener en la variable id es el titulo
Cita:
Iniciado por gogupe
está haciendo la consulta "Titulo", y eso es un campo de texto, por eso la variable $id, contendrá texto, que por otro lado no se debería llamar asi, pero eso ya es cosa del programado
de hecho sería lo más fácil, si los títulos no se repiten haz la consulta directamente por título en vez de ID, es decir, en el $_Get en vez de recoger la id, pásale el título, no se si me explico muy bien...
  #13 (permalink)  
Antiguo 09/03/2011, 08:59
Avatar de gogupe  
Fecha de Ingreso: octubre-2006
Ubicación: Mallorca
Mensajes: 897
Antigüedad: 17 años, 6 meses
Puntos: 32
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Cita:
Iniciado por PYTUFYN Ver Mensaje
Poniendo ese echo $query; si entro por ejemplo en: /articulo.php?id=4

Esto es lo que me muestra:

SELECT * from articulos where titulo = 4

Es eso lo que me preguntas? La verdad es que soy un poco "inútil" en esto del PHP XD
Entonces está mal, esto tiene toda la pinta que es el ID.

la verdad es que te has hecho un lio, estás mezclando id con titulo, como se llama la variable GET O POST que recoge el titulo ?
  #14 (permalink)  
Antiguo 09/03/2011, 15:11
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Gracias por vuestras respuestas!

Uff gogupe, y tanto que tengo un cacao mental...

A falta de alguna otra solución, de momento lo dejaré con /3-titulo-del-articulo . Para los enlaces lo hago con

Código PHP:
echo "<a href=\"$id-$url\">$titulo</a>"
Y en el .htaccess con

Cita:
RewriteEngine on
RewriteRule ^([0-9]+)\-([a-zA-Z0-9-]*)$ articulo.php?id=$1
No es lo que quería en un inicio, pero así me funciona, que no es poco.
  #15 (permalink)  
Antiguo 10/03/2011, 23:48
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Ufff, me ha costado, pero al final ha sido una bobada:

En el .htaccess

Cita:
RewriteRule ^(.*)$ articulo.php?url=$1
Y en articulo.php

Código PHP:
if(isset($_GET['url'])){
$url $_GET['url']; 
Luego en la consulta

Código PHP:
$query "SELECT * from articulos where url = '$url'"
No sé por qué no me funcionaba antes, si lo probé un millón de veces y siempre me daba error (desde localhost). Hoy con la web subida al servidor lo hice a la primera y me salió.

Ahora me gustaría saber si puedo hacer otra cosa. Es decir, si el título del artículo es "Hoy llueve mucho" y entro a /hoy-llueve-mucho pues funciona a la perfección, pero si entro a /hoy-llueve-muchoo o a cualquier otra dirección /kjasdjkhad o lo que sea, me abre la página pero dando error

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in...

Entonces, me gustaría saber cómo puedo hacer para que si entro a alguna dirección que no coincida con el registro del campo "url" de mi db que me redirija a la portada o algo así.

Supongo que sería algo así no?

Código PHP:
if($_GET["url"] != $url){
include(
'error404.php');
    exit;

O algo parecido (eso lo he probado pero no funciona), no sé, a ver si alguien me puede ayudar, que por lo que he podido ver en el foro por aquí hay cada crack del php de aúpa ojalá yo algún día pudiera saber tanto.
  #16 (permalink)  
Antiguo 11/03/2011, 01:39
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Creo que tu primer codigo para esto que quieres hacer ahora estaba bien pero debes agregar algunas cosas:
Código PHP:
$query "SELECT * from articulos where id = $id"
//$echo = mysql_error(); //ESTA NO LA NECESITAS
//A ESTA LE AGREGAS UN @
$result = @mysql_query($query); 
//EN CASO QUE TENGA ERRORES NO LOS MOSTRARA EN LA PAGINA
//ACA TOMAS EL NUMERO DE REGISTROS ENCONTRADOS Y TAMBIEN AGREGA @
$num_rows = @mysql_num_rows($result); 
//CAMBIA EL == POR <= 
if ($num_rows <= 0) {
    include 
"404.php";
    die(); 
//CAMBIA EXIT POR DIE ASI NO EJECUTAS NADA MAS

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #17 (permalink)  
Antiguo 12/03/2011, 00:28
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Gracias Marvin, he cambiado esas cosas que me has indicado.
  #18 (permalink)  
Antiguo 20/03/2011, 10:47
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Hola nuevamente, tengo un problema. Lo que quiero hacer ahora es que al entrar en dominio.com me redirija a www.dominio.com es decir, que me añada las www.

Esto es lo que tengo en el archivo .htaccess:

Cita:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^dominio\.com$ [NC]
RewriteRule ^(.*)$ http://www.dominio.com/$1 [R=301,L]
RewriteRule ^(.*)$ articulo.php?url=$1
Pero nada, no funciona. Muestra mensaje de error en una de las consultas a la base de datos y las url amigables dejan de funcionar.
  #19 (permalink)  
Antiguo 20/03/2011, 12:31
Avatar de chechu_  
Fecha de Ingreso: mayo-2007
Mensajes: 282
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

perdon, ¿redirección 301?

Redirect 301 http://dominio.com http://www.dominio.com/index.php

¿Pordria ser una solución?
  #20 (permalink)  
Antiguo 20/03/2011, 13:33
 
Fecha de Ingreso: junio-2003
Mensajes: 104
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Cambiar /articulo.php?id=X por /titulo-del-articulo

Hola chechu_ lo he intentado pero no me redirecciona.

He probado con lo siguiente:

Cita:
RewriteRule ^([a-zA-Z0-9_-]+)$ articulo.php?url=$1
RewriteCond %{HTTP_HOST} ^dominio\.com$ [NC]
RewriteRule ^(.*)$ http://www.dominio.com/$1 [R=301,L]
Y si entro en http://dominio.com me redirecciona sin problemas a http://www.dominio.com

Pero si entro en http://dominio.com/hola-que-tal en lugar de quedarme http://www.dominio.com/hola-que-tal me muestra en la barra de direcciones http://www.dominio.com/articulo.php?url=hola-que-tal

En fin menudo lío

Etiquetas: Ninguno
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 12:57.