Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Problema al listar tabla relacionadas

Estas en el tema de Problema al listar tabla relacionadas en el foro de Mysql en Foros del Web. Hola buenas, tengo un problema, bueno ya me dijeron en otra parte del foro que parece que no estoy devolviendo las variables, y que no ...
  #1 (permalink)  
Antiguo 03/01/2015, 10:37
 
Fecha de Ingreso: octubre-2014
Mensajes: 70
Antigüedad: 9 años, 6 meses
Puntos: 0
Pregunta Problema al listar tabla relacionadas

Hola buenas, tengo un problema, bueno ya me dijeron en otra parte del foro que parece que no estoy devolviendo las variables, y que no debo usar el "Like". dejare el codigo para ver que consejos me pueden dar o como puedo mejorarlo, no se de que otra forma hacerlo, el problema se genero porque agregue una tabla relacionada de generos, antes de eso me funcionaba bien el buscador y con un amigo tratamos de arreglarlo pero nada se soluciono, desde ya pido disculpas por mi inexperiencia porque soy nuevo en esto.

Aqui les dejo el codigo

Desde ya gracias al que lo lea y todo eso.
PD: Estos son los errores que arroja

"( ! ) Notice: Undefined variable: consulta in C:\wamp\www\pag2\pagina\buscaproducto2.php on line 180"
Este la tengo definida mas arriba en la consulta

y este

"( ! ) Warning: mysql_fetch_array() expects parameter 1 to be resource, null given in C:\wamp\www\pag2\pagina\buscaproducto2.php on line 180"

Saludos
Código SQL:
Ver original
  1. SELECT
  2. video.idvideo,
  3. video.nombre,
  4. video.link,
  5. video.sinopsis,
  6. video.fecha,
  7. video.direccion,
  8. gen_video.idvideo,
  9. gen_video.idgenero
  10. FROM
  11. video,
  12. gen_video
  13. WHERE
  14.   video.nombre LIKE '%".$_POST['nombre']."%'
  15. AND video.link LIKE '%".$_POST['link']."%'
  16. AND video.sinopsis LIKE '%".$_POST['sinopsis']."%'
  17. AND video.fecha LIKE '%".$_POST['fecha']."%'
  18. AND video.direccion LIKE '%".$_POST['direccion']."%'
  19. AND gen_video.idgenero LIKE '%".$_POST['generos']."%'
  20. AND gen_video.idvideo = video.idvideo

Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.

Última edición por gnzsoloyo; 03/01/2015 a las 11:12
  #2 (permalink)  
Antiguo 03/01/2015, 11:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema al listar tabla relacionadas

Los mensajes de PHP no son tema de este foro. Solo trataremos aqui con lo referido a SQL. Esos mensajes solo nos dicen que no estás obteniendo resultados, es decir que la consulta no dispara errores pero devuelve un resultado vacío.
Por lo pronto hay que tener en cuenta que para que la consulta que haces devuelva algo, todas las condiciones que pones en el WHERE deben obligatoriamente cumplirse con al menos un registro al mismo tiempo... ¿Eso lo verificaste manualmente?

Lo primero que deberías hacer es verificar primero si realmente tienes datos que cumplan la condición básica, la que relaciona las tablas, y es mejor no hacerlo con JOIN implícitos, sino explicitos:
Código MySQL:
Ver original
  1.     V.idvideo,
  2.     V.nombre,
  3.     V.link,
  4.     V.sinopsis,
  5.     V.fecha,
  6.     V.direccion,
  7.     G.idvideo,
  8.     G.idgenero
  9.     video V INNER JOIN gen_video G ON V.idvideo = G.idvideo
Si esa consulta devuelve al menos un registro, está bien escrita y hay datos. Si hay más de un registro en cada tabla.. entonces tienes datos sucios en alguna parte, porque debería devolver al menos un registro de Video por cada Genero con el que se relacione.

Ahora bien, si todo anda bien, pero las condiciones son opcionales, es decir, no todas pueden estar siendo cargadas o algunas sólo se cumplen en unos registros y no en otros, esa consulta no te devolverá esos registros de cumplicmiento parcial.
¿Se enteinde?
En ese caso, cuando son opcionales, corresponde usar OR y no AND:
Código MySQL:
Ver original
  1.     V.idvideo,
  2.     V.nombre,
  3.     V.link,
  4.     V.sinopsis,
  5.     V.fecha,
  6.     V.direccion,
  7.     G.idvideo,
  8.     G.idgenero
  9.     video V INNER JOIN gen_video G ON V.idvideo = G.idvideo
  10.     V.nombre LIKE '%$nombre%'
  11.     OR V.link LIKE '%$link%'
  12.     OR V.sinopsis LIKE '%$sinopsis."%'
  13.     OR V.fecha LIKE '%$fecha%'
  14.     OR V.direccion LIKE '%$direccion%'
  15.     OR V.idgenero LIKE '%$generos%';
Estoy depurando un poco tu código para hacerlo mas legible. A nivel de PHP, es mejor transferir los parametros recibidos a variables, cosa de poder manejar un código mas limpio (tema off topic, pero que valía la pena aclarar).

Y antes de que preguntes: Esos "V" y "G", son alias dados a las tablas para facilitar la legibilidad del SQL. (ver http://dev.mysql.com/doc/refman/4.1/en/identifiers.html)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 03/01/2015, 15:45
 
Fecha de Ingreso: octubre-2014
Mensajes: 70
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problema al listar tabla relacionadas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Los mensajes de PHP no son tema de este foro. Solo trataremos aqui con lo referido a SQL. Esos mensajes solo nos dicen que no estás obteniendo resultados, es decir que la consulta no dispara errores pero devuelve un resultado vacío.
Por lo pronto hay que tener en cuenta que para que la consulta que haces devuelva algo, todas las condiciones que pones en el WHERE deben obligatoriamente cumplirse con al menos un registro al mismo tiempo... ¿Eso lo verificaste manualmente?

Lo primero que deberías hacer es verificar primero si realmente tienes datos que cumplan la condición básica, la que relaciona las tablas, y es mejor no hacerlo con JOIN implícitos, sino explicitos:
Código MySQL:
Ver original
  1.     V.idvideo,
  2.     V.nombre,
  3.     V.link,
  4.     V.sinopsis,
  5.     V.fecha,
  6.     V.direccion,
  7.     G.idvideo,
  8.     G.idgenero
  9.     video V INNER JOIN gen_video G ON V.idvideo = G.idvideo
Si esa consulta devuelve al menos un registro, está bien escrita y hay datos. Si hay más de un registro en cada tabla.. entonces tienes datos sucios en alguna parte, porque debería devolver al menos un registro de Video por cada Genero con el que se relacione.

Ahora bien, si todo anda bien, pero las condiciones son opcionales, es decir, no todas pueden estar siendo cargadas o algunas sólo se cumplen en unos registros y no en otros, esa consulta no te devolverá esos registros de cumplicmiento parcial.
¿Se enteinde?
En ese caso, cuando son opcionales, corresponde usar OR y no AND:
Código MySQL:
Ver original
  1.     V.idvideo,
  2.     V.nombre,
  3.     V.link,
  4.     V.sinopsis,
  5.     V.fecha,
  6.     V.direccion,
  7.     G.idvideo,
  8.     G.idgenero
  9.     video V INNER JOIN gen_video G ON V.idvideo = G.idvideo
  10.     V.nombre LIKE '%$nombre%'
  11.     OR V.link LIKE '%$link%'
  12.     OR V.sinopsis LIKE '%$sinopsis."%'
  13.     OR V.fecha LIKE '%$fecha%'
  14.     OR V.direccion LIKE '%$direccion%'
  15.     OR V.idgenero LIKE '%$generos%';
Estoy depurando un poco tu código para hacerlo mas legible. A nivel de PHP, es mejor transferir los parametros recibidos a variables, cosa de poder manejar un código mas limpio (tema off topic, pero que valía la pena aclarar).

Y antes de que preguntes: Esos "V" y "G", son alias dados a las tablas para facilitar la legibilidad del SQL. (ver http://dev.mysql.com/doc/refman/4.1/en/identifiers.html)
Hola, gracias por tu respuesta tan detallada y por tomar el tiempo de hacerla, El primer codigo que pusiste me devolvio todos los datos datos que tengo ingresado y bien, y ahora respecto a la 2da no lo entendi muy bien, con el or, es como si el dato estuviera vacio y no es necesario que este con datos, a eso te refieres?

Desde ya muchas gracias.

Saludos
  #4 (permalink)  
Antiguo 03/01/2015, 16:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema al listar tabla relacionadas

Cita:
respecto a la 2da no lo entendi muy bien, con el or, es como si el dato estuviera vacio y no es necesario que este con datos, a eso te refieres?
El WHERE trabaja sobre lo que se denomina "Lógica Proposicional", y tanto el AND como el OR son la aplicación práctica de ello, a partir de las tablas de verdad (ver Tablas de Verdad). ¿Eso lo has visto?
Bueno, el AND es una proposición conjuntiva, lo que implica que para que se cumpla y devuelva datos, las dos partes unidas por un AND deben ser verdad. Siempre.


En tu caso, lo que pusiste es que cada una de las condiciones debía ser TRUE, todas, y como el WHERE se verifica para cada uno de los registros que la relacion de tablas en el FROM devuelve, sólo podrías obtener aquellos registros donde todas las condiciones tienes TRUE.
Si al menos una de las condiciones no se cumple, ese registro no se devuelve.
Por eso recibes una tabla vacía.

En OR es la disyunción lógica (A ó B, ó ambos), y expresa que es verdad si al menos uno de las proposiciones es verdad.


Entonces, devuelve aquellos registros donde al menos una de las condiciones se cumple.

En tu caso, me refiero a "opcionales" a la situación en que el usuario no completa todos los campos en el formulario, y cuando se envía a realizar la búsqueda, alguno de los valores no está (cadena vacía), o bien está mal escrito, pero alguno de los otros si se envió y aparece en el registro.
En esa situación el uso de OR permite que con que solo se cumpla una de las comparaciones, el registro sea devuelto como resultado.

¿Se entiende mejor?

Ahora bien, desde el punto de vista de SQL, lo correcto y para evitar errores de interpretación es, como ya te lo mencioné antes, que las comparaciones contra valores escalares no usen LIKE, sino =, <, >, o BETWEEN. También se debe tener en cuenta que si son números, no deben quedar encerrados entre apostrofos, para evitar conversiones implícitas que afecten la performance.

En definitiva, la sintaxis correcta de tu query, para MySQL sería:
Código MySQL:
Ver original
  1.     V.idvideo,
  2.     V.nombre,
  3.     V.link,
  4.     V.sinopsis,
  5.     V.fecha,
  6.     V.direccion,
  7.     G.idvideo,
  8.     G.idgenero
  9.     video V INNER JOIN gen_video G ON V.idvideo = G.idvideo
  10.     V.nombre LIKE '%$nombre%'
  11.     OR V.link LIKE '%$link%'
  12.     OR V.sinopsis LIKE '%$sinopsis."%'
  13.     OR V.fecha ='$fecha'
  14.     OR V.direccion LIKE '%$direccion%'
  15.     OR V.idgenero = '$generos';
Esto, asumiendo que "idgenero" es un ID numerico, y que "fecha" es un campo DATE o DATETIME. Si es un VARCHAR está mal.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 03/01/2015, 16:22
 
Fecha de Ingreso: octubre-2014
Mensajes: 70
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Problema al listar tabla relacionadas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
El WHERE trabaja sobre lo que se denomina "Lógica Proposicional", y tanto el AND como el OR son la aplicación práctica de ello, a partir de las tablas de verdad (ver Tablas de Verdad). ¿Eso lo has visto?
Bueno, el AND es una proposición conjuntiva, lo que implica que para que se cumpla y devuelva datos, las dos partes unidas por un AND deben ser verdad. Siempre.


En tu caso, lo que pusiste es que cada una de las condiciones debía ser TRUE, todas, y como el WHERE se verifica para cada uno de los registros que la relacion de tablas en el FROM devuelve, sólo podrías obtener aquellos registros donde todas las condiciones tienes TRUE.
Si al menos una de las condiciones no se cumple, ese registro no se devuelve.
Por eso recibes una tabla vacía.

En OR es la disyunción lógica (A ó B, ó ambos), y expresa que es verdad si al menos uno de las proposiciones es verdad.


Entonces, devuelve aquellos registros donde al menos una de las condiciones se cumple.

En tu caso, me refiero a "opcionales" a la situación en que el usuario no completa todos los campos en el formulario, y cuando se envía a realizar la búsqueda, alguno de los valores no está (cadena vacía), o bien está mal escrito, pero alguno de los otros si se envió y aparece en el registro.
En esa situación el uso de OR permite que con que solo se cumpla una de las comparaciones, el registro sea devuelto como resultado.

¿Se entiende mejor?

Ahora bien, desde el punto de vista de SQL, lo correcto y para evitar errores de interpretación es, como ya te lo mencioné antes, que las comparaciones contra valores escalares no usen LIKE, sino =, <, >, o BETWEEN. También se debe tener en cuenta que si son números, no deben quedar encerrados entre apostrofos, para evitar conversiones implícitas que afecten la performance.

En definitiva, la sintaxis correcta de tu query, para MySQL sería:
Código MySQL:
Ver original
  1.     V.idvideo,
  2.     V.nombre,
  3.     V.link,
  4.     V.sinopsis,
  5.     V.fecha,
  6.     V.direccion,
  7.     G.idvideo,
  8.     G.idgenero
  9.     video V INNER JOIN gen_video G ON V.idvideo = G.idvideo
  10.     V.nombre LIKE '%$nombre%'
  11.     OR V.link LIKE '%$link%'
  12.     OR V.sinopsis LIKE '%$sinopsis."%'
  13.     OR V.fecha ='$fecha'
  14.     OR V.direccion LIKE '%$direccion%'
  15.     OR V.idgenero = '$generos';
Esto, asumiendo que "idgenero" es un ID numerico, y que "fecha" es un campo DATE o DATETIME. Si es un VARCHAR está mal.
Ah ok gracias por tu respuesta, muchas gracias por tomarte todo el tiempo para darme tantos detalles de verdad se agradece.

Saludos

Etiquetas: fecha, php, relacionadas, select, sql, tabla
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 06:15.