Foros del Web » Programando para Internet » PHP »

Aporto una solución y busco otra ;)

Estas en el tema de Aporto una solución y busco otra ;) en el foro de PHP en Foros del Web. Hola a todos, hace un tiempo que uso el siguiente código en mi galería para pasar de una imagen a otra según su orden en ...
  #1 (permalink)  
Antiguo 25/02/2011, 06:27
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 17 años, 11 meses
Puntos: 11
Pregunta Aporto una solución y busco otra ;)

Hola a todos, hace un tiempo que uso el siguiente código en mi galería para pasar de una imagen a otra según su orden en la base de datos, y en caso de que haya un registro borrado, no habría problema, ya que el código no va incrementando o restando 1 al valor ID, sino que selecciona la ID anterior más próxima y la ID siguiente más próxima, por lo que no da margen a error.

El código:

Código PHP:
<?

    
// RECOJES EL VALOR DE ID, PREVIAMENTE REVISAS QUE GET EXISTA
    // Y QUE SEA UN NÚMERO, DE CUALQUIER OTRA FORMA ID DEBE SER IGUAL A 0
    
$id = (int)$_GET['id']; // if isset(...
    
    // LA CONSULTA BUSCA EL ID, SACA EL NÚMERO ANTERIOR Y SIGUIENTE,
    
$query mysql_query("
        select
            *,
            (select max(id_foto) from galeria where id_foto < $id) minimo,
            (select min(id_foto) from galeria where id_foto > $id) maximo
        from galeria
        where id_foto = $id"
);
    
$data mysql_fetch_array($query);
    if (
$data) {
        
// ...
        // MUESTRA LOS BOTONES DE NAVEGACIÓN CORRESPONDIENTES
        
if (!is_null($data['minimo'])) echo '<a href=index.php?seccion=imagen&id=' $data['minimo'] . ' title="Anterior">ANTERIOR</a>';
        if (!
is_null($data['minimo']) && !is_null($data['maximo'])) echo ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ';
        if (!
is_null($data['maximo'])) echo '<a href=index.php?seccion=imagen&id=' $data['maximo'] . ' title="Siguiente">SIGUIENTE</a>';
    } else {
        
// scream_VERY_loud();
        
        // SCREAM !!! ES BROMA. ALGUIEN SIGUIO UN ENLACE INVALIDO O
        // QUISO MANIPULAR EL URL, POR LO QUE EL REGISTRO NO EXISTE
        // BUSCA EL MENOR ID Y REDIRECCIONA PARA BUSCARLO.
        
$query mysql_query("
            select min(id_foto) minimo, count(*) cuenta
            from galeria"
);
 
        if (
$data) {
            if (
$data['cuenta'] != 0)
                
// SI HAY REGISTROS REDIRECCIONA PARA BUSCAR EL MENOR
                
header('Location: index.php?seccion=imagen&id=' $query['minimo']);
            } else {
                
// LA BASE DE DATOS ESTÁ VACIA
                // NOW_scream_VERY_loud();
            
}
        }

?>
El código se puede adaptar fácilmente, supongo que con un mínimo de conocimientos lo podréis adaptar a vuestro sitio.

Ahora viene mi duda, el código anterior funciona a la perfección salvo para mostrar únicamente las imágenes pertenecientes a la misma categoría de la imagen que se está visualizando en el momento.

Así que mi pregunta es, ¿Cómo podrían los botones de anterior y siguiente enlazar solo a imágenes pertenecientes a la misma categoría de la imagen visualizada?

He probado con un LIKE al campo categoria (lógicamente el que guarda el valor de la categoría de la imagen), pero nada...

Pongo el código para que os hagais una idea:

Código PHP:
<?

    
// RECOJES EL VALOR DE ID, PREVIAMENTE REVISAS QUE GET EXISTA
    // Y QUE SEA UN NÚMERO, DE CUALQUIER OTRA FORMA ID DEBE SER IGUAL A 0
    
$id = (int)$_GET['id']; // if isset(...
    
    // LA CONSULTA BUSCA EL ID, SACA EL NÚMERO ANTERIOR Y SIGUIENTE,
    
$query mysql_query("
        select
            *,
            (select max(id_foto) from galeria where id_foto < $id) minimo,
            (select min(id_foto) from galeria where id_foto > $id) maximo
        from galeria
        where id_foto = $id LIKE categoria = '$row[categoria]'"
);
    
$data mysql_fetch_array($query);
    if (
$data) {
        
// ...
        // MUESTRA LOS BOTONES DE NAVEGACIÓN CORRESPONDIENTES
        
if (!is_null($data['minimo'])) echo '<a href=index.php?seccion=imagen&id=' $data['minimo'] . ' title="Anterior"><img src="./images/flechaiz.png" border="0" width="36" alt="Anterior" /></a>';
        if (!
is_null($data['minimo']) && !is_null($data['maximo'])) echo ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ';
        if (!
is_null($data['maximo'])) echo '<a href=index.php?seccion=imagen&id=' $data['maximo'] . ' title="Siguiente"><img src="./images/flechade.png" border="0" width="36" alt="Siguiente" /></a>';
    } else {
        
// scream_VERY_loud();
        
        // SCREAM !!! ES BROMA. ALGUIEN SIGUIO UN ENLACE INVALIDO O
        // QUISO MANIPULAR EL URL, POR LO QUE EL REGISTRO NO EXISTE
        // BUSCA EL MENOR ID Y REDIRECCIONA PARA BUSCARLO.
        
$query mysql_query("
            select min(id_foto) minimo, count(*) cuenta
            from galeria"
);
 
        if (
$data) {
            if (
$data['cuenta'] != 0)
                
// SI HAY REGISTROS REDIRECCIONA PARA BUSCAR EL MENOR
                
header('Location: index.php?seccion=imagen&id=' $query['minimo']);
            } else {
                
// LA BASE DE DATOS ESTÁ VACIA
                // NOW_scream_VERY_loud();
            
}
        }

?>
Si no me he expresado bien, o se me ha olvidado indicaros un dato importante, avisarme para ponerlo rápidamente.

Un saludo y muchas gracias
  #2 (permalink)  
Antiguo 25/02/2011, 08:36
 
Fecha de Ingreso: febrero-2011
Ubicación: Bogota
Mensajes: 2
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Aporto una solución y busco otra ;)

creo que planteaste mal la pregunta (o no la entendí bien :( ) el código funciona pero te esta mostrando todas las imágenes almacenadas, y tu solamente quieres que te muestre las imágenes de la categoría correspondiente a la imagen que se este visualizando?
  #3 (permalink)  
Antiguo 25/02/2011, 09:05
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 17 años, 11 meses
Puntos: 11
Respuesta: Aporto una solución y busco otra ;)

Efectivamente.

Yo tengo una imagen, por ejemplo:

imagen.php?id=01

Éso me muestra un select de 01 con el contenido de sus respectivos campos, nombre, imagen (la url de la imagen, no la imagen en si), otra tabla con sus comentarios y demás.

Justo debajo de la imagen, me visualiza 2 botones, anterior y siguiente, y éstos me envían al anterior o siguiente registro de la tabla galeria respectivamente.

El problema, es que no tienen en cuenta que el anterior registro (imagen), pertenezca a una categoría distinta de la que estaba visualizando.

Espero no haberme liado mucho... si aún no está claro, os hago un dibujo con el paint y listo.
  #4 (permalink)  
Antiguo 25/02/2011, 12:52
 
Fecha de Ingreso: febrero-2011
Mensajes: 9
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Aporto una solución y busco otra ;)

Ese like está mal, fíjate bien.
  #5 (permalink)  
Antiguo 25/02/2011, 14:25
Avatar de oso96_2000  
Fecha de Ingreso: junio-2002
Ubicación: Distrito Federal
Mensajes: 558
Antigüedad: 21 años, 9 meses
Puntos: 35
Respuesta: Aporto una solución y busco otra ;)

Asi a primera vista, se me ocurre que si pones el like ( o cualquier condición) en los selects con los que sacas máximo y minimo, debería funcionar.
__________________
Sin Ideas
  #6 (permalink)  
Antiguo 25/02/2011, 14:29
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 10 meses
Puntos: 528
Respuesta: Aporto una solución y busco otra ;)

En vez de LIKE categoria = '$row[categoria]'
debería ser categoria like '$row[categoria]'
  #7 (permalink)  
Antiguo 25/02/2011, 22:19
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 17 años, 11 meses
Puntos: 11
Respuesta: Aporto una solución y busco otra ;)

Gracias por vuestras respuestas, si, de éso me di cuenta, pero sigo sin encontrar forma humana de hacerlo :S

Mañana seguiré probando, que hoy tengo las neuronas muy sobrecargadas
  #8 (permalink)  
Antiguo 27/02/2011, 18:50
 
Fecha de Ingreso: febrero-2011
Mensajes: 9
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Aporto una solución y busco otra ;)

Prueba ésto:

Código PHP:
<?

    
// RECOJES EL VALOR DE ID, PREVIAMENTE REVISAS QUE GET EXISTA
    // Y QUE SEA UN NÚMERO, DE CUALQUIER OTRA FORMA ID DEBE SER IGUAL A 0
    
$id = (int)$_GET['id']; // if isset(...
    
    // LA CONSULTA BUSCA EL ID, SACA EL NÚMERO ANTERIOR Y SIGUIENTE,
    
$query mysql_query("
        select
            *,
            (select max(id_foto) from galeria where id_foto < $id) minimo,
            (select min(id_foto) from galeria where id_foto > $id) maximo
        from galeria
        where galeria.id_foto = $id
        AND galeria.categoria LIKE = '$row[categoria]'"
);

    
$data mysql_fetch_array($query);
    if (
$data) {
        
// ...
        // MUESTRA LOS BOTONES DE NAVEGACIÓN CORRESPONDIENTES
        
if (!is_null($data['minimo'])) echo '<a href=index.php?seccion=imagen&id=' $data['minimo'] . ' title="Anterior"><img src="./images/flechaiz.png" border="0" width="36" alt="Anterior" /></a>';
        if (!
is_null($data['minimo']) && !is_null($data['maximo'])) echo ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ';
        if (!
is_null($data['maximo'])) echo '<a href=index.php?seccion=imagen&id=' $data['maximo'] . ' title="Siguiente"><img src="./images/flechade.png" border="0" width="36" alt="Siguiente" /></a>';
    } else {
        
// scream_VERY_loud();
        
        // SCREAM !!! ES BROMA. ALGUIEN SIGUIO UN ENLACE INVALIDO O
        // QUISO MANIPULAR EL URL, POR LO QUE EL REGISTRO NO EXISTE
        // BUSCA EL MENOR ID Y REDIRECCIONA PARA BUSCARLO.
        
$query mysql_query("
            select min(id_foto) minimo, count(*) cuenta
            from galeria"
);
 
        if (
$data) {
            if (
$data['cuenta'] != 0)
                
// SI HAY REGISTROS REDIRECCIONA PARA BUSCAR EL MENOR
                
header('Location: index.php?seccion=imagen&id=' $query['minimo']);
            } else {
                
// LA BASE DE DATOS ESTÁ VACIA
                // NOW_scream_VERY_loud();
            
}
        }

?>
  #9 (permalink)  
Antiguo 27/02/2011, 19:12
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 17 años, 11 meses
Puntos: 11
Respuesta: Aporto una solución y busco otra ;)

Hola meister, gracias por tu ayuda.

De momento me sigue saliendo un error donde tendrían que salir los enlaces para pasar al anterior y siguiente registro que coincida con la categoría de la imagen:

[phpBB Debug] PHP Notice: in file /home/a1919488/public_html/imagen.php on line 54: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

Ese error está en la línea que dice:

$data = mysql_fetch_array($query);

Pero está claro que el error está en la modificación que has hecho, y el mysql fetch array se limita a ejecutarlo.

¿Alguien tiene alguna otra idea? he probado de todo, añadiendo el like al select del > y del <, pero sigue saliendo error :S
  #10 (permalink)  
Antiguo 27/02/2011, 19:29
 
Fecha de Ingreso: abril-2006
Mensajes: 105
Antigüedad: 17 años, 11 meses
Puntos: 11
Respuesta: Aporto una solución y busco otra ;)

Por favor, moderadores, siento tanto mensajito, borren mi mensaje anterior.

Ahora aporto la solución que he conseguido (gracias meister, corregí algunos fallos en tu código y lo solucioné):

Código PHP:
<?

    
// RECOJES EL VALOR DE ID, PREVIAMENTE REVISAS QUE GET EXISTA
    // Y QUE SEA UN NÚMERO, DE CUALQUIER OTRA FORMA ID DEBE SER IGUAL A 0
    
$id = (int)$_GET['id']; // if isset(...
    
    // LA CONSULTA BUSCA EL ID, SACA EL NÚMERO ANTERIOR Y SIGUIENTE,
    
$query mysql_query("
        select
            *,
            (select max(id_foto) from galeria where id_foto < $id AND temagaleria LIKE $temagaleria) minimo,
            (select min(id_foto) from galeria where id_foto > $id AND temagaleria LIKE $temagaleria) maximo
        from galeria
        where id_foto = $id AND temagaleria LIKE $temagaleria"
);


    
$data mysql_fetch_array($query);
    if (
$data) {
        
// ...
        // MUESTRA LOS BOTONES DE NAVEGACIÓN CORRESPONDIENTES
        
if (!is_null($data['minimo'])) echo '<a href=index.php?seccion=imagen&id=' $data['minimo'] . ' title="Anterior"><img src="./images/flechaiz.png" border="0" width="36" alt="Anterior" /></a>';
        if (!
is_null($data['minimo']) && !is_null($data['maximo'])) echo ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ';
        if (!
is_null($data['maximo'])) echo '<a href=index.php?seccion=imagen&id=' $data['maximo'] . ' title="Siguiente"><img src="./images/flechade.png" border="0" width="36" alt="Siguiente" /></a>';
    } else {
        
// scream_VERY_loud();
        
        // SCREAM !!! ES BROMA. ALGUIEN SIGUIO UN ENLACE INVALIDO O
        // QUISO MANIPULAR EL URL, POR LO QUE EL REGISTRO NO EXISTE
        // BUSCA EL MENOR ID Y REDIRECCIONA PARA BUSCARLO.
        
$query mysql_query("
            select min(id_foto) minimo, count(*) cuenta
            from galeria"
);
 
        if (
$data) {
            if (
$data['cuenta'] != 0)
                
// SI HAY REGISTROS REDIRECCIONA PARA BUSCAR EL MENOR
                
header('Location: index.php?seccion=imagen&id=' $query['minimo']);
            } else {
                
// LA BASE DE DATOS ESTÁ VACIA
                // NOW_scream_VERY_loud();
            
}
        }

?>
La variable $temagaleria la definí antes del código que muestro, pero es simplemente mostrar el valor del campo temagaleria, o si queréis adaptar el código del nombre de la columna de vuestra tabla.

Muchas gracias a todos y espero que le sirva a alguien.

Un saludo

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:22.