Foros del Web » Programando para Internet » PHP »

A ver como lo explico... mas o menos es: Dudas con busqueda en MySQL

Estas en el tema de A ver como lo explico... mas o menos es: Dudas con busqueda en MySQL en el foro de PHP en Foros del Web. Hola buenas Hace tiempo que no me pasaba por aquí... (php) pero ahora hay algo que me tiene muy perdido, os lo explico: Tengo una ...
  #1 (permalink)  
Antiguo 01/07/2003, 12:25
Avatar de kctus
Usuario baneado!
 
Fecha de Ingreso: noviembre-2002
Ubicación: ToledoBsAsGaliciaBolivia
Mensajes: 1.038
Antigüedad: 22 años
Puntos: 1
Pregunta A ver como lo explico... mas o menos es: Dudas con busqueda en MySQL

Hola buenas

Hace tiempo que no me pasaba por aquí... (php) pero ahora hay algo que me tiene muy perdido, os lo explico:

Tengo una tabla (en MySQL) con datos de conciertos, mas concretamente estan el dia, mes, grupo, localidad... etc.
Y mi idea es que desde un formulario el usuario ponga las condiciones de los conciertos que quiere que se muestre.

Entonces, ya tengo el formulario, con 5 casillas donde introducir: localidad, provincia, grupo, dia y mes. Ese formulario va a otra página donde se tendrían que procesar las variables, y mostrar unicamente los registros que cumplan todas las opciones.
Y ahi me he liado. Lo que yo he hecho es poner por medio de "if" todas las posibilidades posibles de aparición de una o mas variables, porque hay que tener en cuenta que un usuario puede buscar usando una sola condición (mes por ejemplo) y otro puede usar mas de una (grupo y día por ejemplo)

Entonces, mi codigo es este:

Código PHP:
//Conexion con la base
mysql_connect("xxxxx","xxxxx","xxxxxx");


if (isset(
$provincia) and !isset($localidad) and !isset($dia) and !isset($mes) and !isset($grupo)){
$busqueda"provincia='$provincia'"; }
if (isset(
$provincia) and isset($localidad) and !isset($dia) and !isset($mes) and !isset($grupo)){
$busqueda"provincia='$provincia' and localidad='$localidad'"; }
if (isset(
$provincia) and !isset($localidad) and isset($dia) and !isset($mes) and !isset($grupo)){
$busqueda"provincia='$provincia' and dia='$dia'"; }
if (isset(
$provincia) and !isset($localidad) and !isset($dia) and isset($mes) and !isset($grupo)){
$busqueda"provincia='$provincia' and mes='$mes'"; }
if (isset(
$provincia) and !isset($localidad) and !isset($dia) and !isset($mes) and isset($grupo)){
$busqueda"provincia='$provincia' and grupo='$grupo'"; }

if (isset(
$provincia) and isset($localidad) and isset($dia) and !isset($mes) and !isset($grupo)){
$busqueda"provincia='$provincia' and localidad='$localidad' and dia='$dia'"; }
if (isset(
$provincia) and isset($localidad) and !isset($dia) and isset($mes) and !isset($grupo)){
$busqueda"provincia='$provincia' and localidad='$localidad' and mes='$mes'"; }
if (isset(
$provincia) and isset($localidad) and !isset($dia) and !isset($mes) and isset($grupo)){
$busqueda"provincia='$provincia' and localidad='$localidad' and grupo='$grupo'"; }
if (isset(
$provincia) and !isset($localidad) and isset($dia) and isset($mes) and !isset($grupo)){
$busqueda"provincia='$provincia' mes='$mes' dia='$dia'"; }
if (isset(
$provincia) and !isset($localidad) and isset($dia) and !isset($mes) and isset($grupo)){
$busqueda"provincia='$provincia' and grupo='$grupo' and dia='$dia'"; }
if (isset(
$provincia) and !isset($localidad) and !isset($dia) and isset($mes) and isset($grupo)){
$busqueda"provincia='$provincia' and mes='$mes' and grupo='$grupo'"; }

if (isset(
$provincia) and isset($localidad) and isset($dia) and isset($mes) and !isset($grupo)){
$busqueda"provincia='$provincia' and localidad='$localidad' and dia='$dia' and mes='$mes'"; }
if (isset(
$provincia) and isset($localidad) and isset($dia) and !isset($mes) and isset($grupo)){
$busqueda"provincia='$provincia' and localidad='$localidad' and dia='$dia' and grupo='$grupo'"; }
if (isset(
$provincia) and isset($localidad) and !isset($dia) and isset($mes) and isset($grupo)){
$busqueda"provincia='$provincia' and localidad='$localidad' and grupo='$grupo' and mes='$mes'"; }
if (isset(
$provincia) and !isset($localidad) and isset($dia) and isset($mes) and isset($grupo)){
$busqueda"provincia='$provincia' and grupo='$grupo' and dia='$dia' and mes='$mes'"; }

if (isset(
$localidad) and !isset($provincia) and !isset($dia) and !isset($mes) and !isset($grupo)){
$busqueda"localidad='$localidad'"; }
if (isset(
$localidad) and !isset($provincia) and isset($dia) and !isset($mes) and !isset($grupo)){
$busqueda"localidad='$localidad' and dia='$dia'"; }
if (isset(
$localidad) and !isset($provincia) and !isset($dia) and isset($mes) and !isset($grupo)){
$busqueda"localidad='$localidad' and mes='$mes'"; }
if (isset(
$localidad) and !isset($provincia) and !isset($dia) and !isset($mes) and isset($grupo)){
$busqueda"localidad='$localidad' and grupo='$grupo'"; }

if (isset(
$localidad) and !isset($provincia) and isset($dia) and isset($mes) and !isset($grupo)){
$busqueda"localidad='$localidad' and mes='$mes' and dia='$dia'"; }
if (isset(
$localidad) and !isset($provincia) and isset($dia) and !isset($mes) and isset($grupo)){
$busqueda"localidad='$localidad' and grupo='$grupo' and dia='$dia'"; }
if (isset(
$localidad) and !isset($provincia) and !isset($dia) and isset($mes) and isset($grupo)){
$busqueda"localidad='$localidad' and mes='$mes' and grupo='$grupo'"; }

if (isset(
$localidad) and !isset($provincia) and isset($dia) and isset($mes) and isset($grupo)){
$busqueda"localidad='$localidad' and grupo='$grupo' and dia='$dia' and mes='$mes'"; }

if (isset(
$dia) and !isset($localidad) and !isset($provincia) and !isset($mes) and !isset($grupo)){
$busqueda"dia='$dia'"; }
if (isset(
$dia) and !isset($localidad) and !isset($provincia) and isset($mes) and !isset($grupo)){
$busqueda"dia='$dia' and mes='$mes'"; }
if (isset(
$dia) and !isset($localidad) and !isset($provincia) and !isset($mes) and isset($grupo)){
$busqueda"dia='$dia' and grupo='$grupo'"; }

if (isset(
$dia) and !isset($localidad) and !isset($provincia) and isset($mes) and isset($grupo)){
$busqueda"dia='$dia' and mes='$mes' and grupo='$grupo'"; }

if (isset(
$mes) and !isset($localidad) and !isset($dia) and !isset($provincia) and !isset($grupo)){
$busqueda"mes='$mes'"; }

if (isset(
$mes) and !isset($localidad) and !isset($dia) and !isset($provincia) and isset($grupo)){
$busqueda"mes='$mes' and grupo='$grupo'"; }

if (isset(
$grupo) and !isset($localidad) and !isset($dia) and !isset($provincia) and !isset($mes)){
$busqueda"grupo='$grupo'"; }

$consulta=mysql_db_query("base_de_datos","select * from conciertos where '$busqueda' order by dia"); 
Como veis, he puesto por medio de los if, isset y !isset todas las posibilidades posibles, para que cada uno en su caso, se genere la variable $busqueda donde estén las condiciones.

Y no se porque, nunca encuentra nigún resultado. Es decir, debe de fallar algo de ese código... (y como me suele pasar, quizas sea lo mas simple)

Agradeceria cualquier ayuda

Muchas gracias amigos

Última edición por kctus; 01/07/2003 a las 12:30
  #2 (permalink)  
Antiguo 01/07/2003, 12:52
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 22 años, 5 meses
Puntos: 16
Hola,

Hombre, puedes hacer un echo $busqueda para ver exactamente que condicion estas ejecutando.

Pero sinceramente, yo te diria que reprogramases (refactorices) el codigo.

Yo en estos casos lo que hago es crear incrementalmente la condicion. Sobre todo cuando quiero una combinacion de todos los campos y las condiciones siempre se unen con el mismo operador (AND o OR). Seria algo asi:
Código PHP:
$busqueda='';  //inicializamos la condicion

if (isset($provincia)) {
  
$busqueda.=" AND provincia='$provincia";  // añadimos a la condicion el campo provincia
}
if (isset(
$localidad)) {
  
$busqueda.=" AND localidad='$localidad";  // añadimos a la condicion el campo localidad
}
if (isset(
$dia)) {
  
$busqueda.=" AND dia='$dia";  // añadimos a la condicion el campo dia
}
if (isset(
$mes)) {
  
$busqueda.=" AND mes='$mes";  // añadimos a la condicion el campo mes
}
if (isset(
$grupo)) {
  
$busqueda.=" AND grupo='$grupo";  // añadimos a la condicion el campo grupo
}

if (
''!=$busqueda) {  // si se ha añadido alguna condicion
  
$busqueda=substr($busqueda,4); // quitamos los 4 primeros caracteres " AND"
  // realizamos la consulta
  
$consulta=mysql_db_query(...);
} else {
  
// si no se ha pasado ningun valor

Por supuesto, tambien usaria mysql_select_db() (www.php.net/mysql_select_db) y mysql_query() (www.php.net/mysql_query) en lugar de mysql_db_query() (esta deprecated, y pueden eliminarla en cualquier momento sin avisar). Tambien usaria mysql_error() (www.php.net/mysql_error) para que muestre el mensaje de error de MySQL en caso de producirse. Y tambien recordar que si haces la comparacion con = el texto del formulario y el texto en la base de datos debe ser identico. Quizas haciendo el echo de $busqueda y probandola directamente en MySQL (con phpMyAdmin, por ejemplo) veas que los valores no coinciden. Busca en el manual de www.mysql.com el operador de comparacion LIKE.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 01/07/2003, 16:21
Avatar de Sexma  
Fecha de Ingreso: junio-2003
Ubicación: Valencia
Mensajes: 109
Antigüedad: 21 años, 5 meses
Puntos: 0
Hay que reconocer que el codigo de kctus es una currada , cuando estes programando y veas que hay muchos ifs seguidos replanteate el codigo porque seguro que debe haber otra solucion. No se si sabras algo de costes de algoritmos pero tu codigo es un pelin ineficiente en cuanto a costes.

Ala a practicar mas.
__________________
CLUB ESPORTIU UNIVERSITAT DE VALENCIA

Visita la pagina de la UV-O



  #4 (permalink)  
Antiguo 01/07/2003, 16:43
Avatar de kctus
Usuario baneado!
 
Fecha de Ingreso: noviembre-2002
Ubicación: ToledoBsAsGaliciaBolivia
Mensajes: 1.038
Antigüedad: 22 años
Puntos: 1
Ey Sexma, me rei mucho mientras lo hacia.. eso si, luego acabe viendo isset y simbolitos de admiración ( ! ) por todos lados

Por cierto, gracias Josemi, ya puse tu recomendación pero aún no lo he podido probar porque me pasa otra cosa...

Código PHP:
// parte final del codigo, antes está lo que tu pusiste

if (''!=$busqueda) {  // si se ha añadido alguna condicion
  
$busqueda=substr($busqueda,4); // quitamos los 4 primeros caracteres " AND"

  // realizamos la consulta
$consulta=mysql_db_query("base_de_datos","select * from conciertos where '$busqueda'");
echo 
"  <table>
        <tr> 
          <td>Fecha</td>
          <td>Grupo</td>
          <td>Localidad</td>
          <td>Hora</td>
          <td>Lugar</td>
          <td>Precio</td>
          <td>Información</td>
        </tr> "
;
while (
$row=mysql_fetch_array($consulta))
{
echo 
'  <tr> 
          <td> '
.$row["dia"].' - '.$row["mes"].' </td>
          <td> '
.$row["grupo"].' </td>
          <td> '
.$row["localidad"].' ( '.$row["provincia"].' )</td>
          <td> '
.$row["hora"].' </td>
          <td> '
.$row["lugar"].' </td>
          <td> '
.$row["precio"].' </td>
          <td> '
.$row["otros"].' </td> ';
}
echo 
'      </table> ';
} else {
echo 
"Lo sentimos, pero no hay ningún concierto que cumpla las condiciones que seleccionaste, prueba a ampliar la busqueda";

Eso es el final, y me da error en la linea donde empieza el "while" me dice: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/blablabla...

Eso ya me ha pasado otras veces, pero al final conseguida solucionarlo. Pero esta vez por mas que pruebo, no lo quito

  #5 (permalink)  
Antiguo 01/07/2003, 17:29
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 10 meses
Puntos: 5
$consulta=mysql_db_query("base_de_datos","select * from conciertos where $busqueda");

Quita las comillas a $busqueda
__________________
Manoloweb
  #6 (permalink)  
Antiguo 01/07/2003, 17:53
Avatar de kctus
Usuario baneado!
 
Fecha de Ingreso: noviembre-2002
Ubicación: ToledoBsAsGaliciaBolivia
Mensajes: 1.038
Antigüedad: 22 años
Puntos: 1
Gracias ManoloWeb, lo hice pero no resulto :( Sigue el error en la misma linea (la del while())
  #7 (permalink)  
Antiguo 01/07/2003, 17:54
Avatar de camargo  
Fecha de Ingreso: abril-2002
Ubicación: Kerétaro, Méjiko
Mensajes: 1.045
Antigüedad: 22 años, 7 meses
Puntos: 2
el mysql_db_query ya es algo viejo, hay q actualizarlo a mysql_query, entonces quedaria asi:

$consulta = mysql_query("base_de_datos","SELECT * FROM conciertos WHERE $busqueda");

y quitas las comillas como lo dice Manoloweb ;)

Salu2
__________________
http://www.chorcha.com

Última edición por camargo; 01/07/2003 a las 17:56
  #8 (permalink)  
Antiguo 01/07/2003, 17:59
Avatar de camargo  
Fecha de Ingreso: abril-2002
Ubicación: Kerétaro, Méjiko
Mensajes: 1.045
Antigüedad: 22 años, 7 meses
Puntos: 2
Otra cosa q estoy viendo es que el while lleva un ELSE, cuando nunca lo deberia llevar,, puedes manejar el DO, pero no un ELSE ,, ahi debes cambiar el while por un if($row=mysql_fetch_array($consulta)){

entonces asi podra funcionar

__________________
http://www.chorcha.com
  #9 (permalink)  
Antiguo 01/07/2003, 18:00
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 10 meses
Puntos: 5
kctus

Ese error es tipico de las ocasiones en las que la consulta no se ha hecho correctamente. Aunque el error te lo da en la linea donde haces el fetch de la fila de resultados, se refiere a que el link de la consulta es inválido, así que hay que mirar al query, no al fetch...

como dice camargo, preferentemente usa:
mysql_query();
__________________
Manoloweb
  #10 (permalink)  
Antiguo 01/07/2003, 18:02
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 22 años, 10 meses
Puntos: 5
No, camargo el ELSE es para el IF inicial, el WHILE esta bien cerrado...

Je je... ya tienes sueño.
__________________
Manoloweb
  #11 (permalink)  
Antiguo 01/07/2003, 18:05
Avatar de camargo  
Fecha de Ingreso: abril-2002
Ubicación: Kerétaro, Méjiko
Mensajes: 1.045
Antigüedad: 22 años, 7 meses
Puntos: 2
jeje,, razon.. no habia visto la llave } anterior.. jeje
__________________
http://www.chorcha.com
  #12 (permalink)  
Antiguo 01/07/2003, 18:23
Avatar de kctus
Usuario baneado!
 
Fecha de Ingreso: noviembre-2002
Ubicación: ToledoBsAsGaliciaBolivia
Mensajes: 1.038
Antigüedad: 22 años
Puntos: 1
Gracias de nuevo ManoloWeb,y Camargo

Pero claro.. siempre algo me anda mal.. empiezo a preocuparme

Ya cambie el mysql_query(); quite las comillas... y me seguia dando error.

Entonces, cambie una cosa del código de Josemi.

Código PHP:
if (isset($provincia)) {
  
$busqueda.=" AND provincia='$provincia";  // añadimos a la condicion el campo provincia

Le faltaba una comilla simple despues de $provincia. Al hacer eso ya no me da error ninguno, pero...

Ahora siempre se me muestra la tabla de resultados, pero sin resultados. Es decir, solo las cabeceras. Por un regla de tres simple, supongo que eso es porque la variable $busqueda existe aunque no tiene el valor que debería tener,no? Es decir, algo puede andar raro en el código de Josemi
  #13 (permalink)  
Antiguo 02/07/2003, 01:32
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 22 años, 5 meses
Puntos: 16
Hola,

Estos dedos mios

Pero veo que no has seguido todos mis consejos. Mira mysql_error() (www.php.net/mysql_error). Sirve para mostrar el mensaje de error de MySQL. Su uso normal es:
Código PHP:
$consulta=mysql_query($sql,$con) or die(mysql_error()); 
Tambien deberias acostumbrarte a comprobar que el valor devuelto por mysql_query() no es false, que es lo que devuelve en caso de error de MySQL, como en este caso (otras funciones mysql_*() funcionan igual).

Y tambien lo que deberias hacer (creo que tambien lo comente) es hacer un echo $busqueda para ver realmente la consulta que se ejecuta. Quizas no es lo que crees. Y como dije, si es posible, pon la consulta directamente en phpMyAdmin, para ver si la consulta devuelve o no. Por cierto, tambien antes (durante el diseño de la consulta) deberias haber hecho pruebas "a mano" para encontrar el esqueleto de la consulta.

Por cierto, isset() es para saber si esta definida la variable, pero puede estar definida pero sin valor. Esto puede pasar con campos de formulario, que aunque no le hayas metido valores, si se definen sus variables en PHP.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #14 (permalink)  
Antiguo 03/07/2003, 19:10
Avatar de kctus
Usuario baneado!
 
Fecha de Ingreso: noviembre-2002
Ubicación: ToledoBsAsGaliciaBolivia
Mensajes: 1.038
Antigüedad: 22 años
Puntos: 1


Muchas gracias Josemi

Cita:
Por cierto, isset() es para saber si esta definida la variable, pero puede estar definida pero sin valor. Esto puede pasar con campos de formulario, que aunque no le hayas metido valores, si se definen sus variables en PHP.
Ahi estaba el error, en $busqueda se mandaban todas las variables aunque no tuvieran valor.

Lo he solucionado cambiando cada isset() por:

Código PHP:
if (''!=$provincia) {
  
$busqueda.=" AND provincia='$provincia'";

Gracias de nuevo
  #15 (permalink)  
Antiguo 04/07/2003, 01:35
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 22 años, 5 meses
Puntos: 16
Podrias usar empty() (www.php.net/empty).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
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:13.