Foros del Web » Programando para Internet » PHP »

Consulta SQL (Multiples variables en WHERE)

Estas en el tema de Consulta SQL (Multiples variables en WHERE) en el foro de PHP en Foros del Web. Pues estoy haciendo un modulo y la temática es un calendario de conciertos, he logrado crear el formulario para ingresar los datos en la BD ...
  #1 (permalink)  
Antiguo 04/02/2010, 03:51
 
Fecha de Ingreso: noviembre-2009
Mensajes: 21
Antigüedad: 14 años, 5 meses
Puntos: 1
Consulta SQL (Multiples variables en WHERE)

Pues estoy haciendo un modulo y la temática es un calendario de conciertos, he logrado crear el formulario para ingresar los datos en la BD y para extraerlos y mostrarlo, ahora estoy con el de editarlos y borrarlos. Voy bastante bien pero me ha sugido un problema que no consigo deducir como solucionarlo. En mi formulario de busqueda de los conciertos publicados hay 4 valores posibles:

Nombre:
Fecha: (mes) - (año)
Lugar:
Mostrar todo

Si pulsas en mostrar todo, te muestra todos los registros de la base de datos, eso esta bien. El problema es a la hora de la busqueda segun las variables introducidas. He creado este codigo:

Código PHP:
if ($_POST['enviado'] == 'si') {
        
$nombre $_POST['name'];
        
$mes $_POST['mes'];
        
$anno $_POST['anno'];
        
$lugar $_POST['lugar'];
        
$mostrar $_POST['mostrar'];
        
        if (
$mostrar == "todo") {
        
$result mysql_query("SELECT id, nombre, dia, mes, anno, lugar FROM conciertos ORDER BY id DESC;");
        while (
$registro mysql_fetch_array($result)) {
            echo  
$registro[1] . " - " .  $registro[2] . "/" $registro[3] . "/" $registro[4] . " - " $registro[5] . " -> <a href='".$url_path."editar.php?editar=si&id=".$registro[0]."'>Modificar</a><br />";
        }
        
mysql_free_result($result);
        
mysql_close($conexion);
        } else {
            if (
$nombre == ""$nombre="*";
            if (
$mes == "---"$mes="*";
            if (
$anno == "---"$anno="*";
            if (
$lugar == ""$lugar="*";
            
$result mysql_query("SELECT id, nombre, dia, mes, anno, lugar FROM conciertos WHERE nombre Like '$nombre' AND mes Like '$mes' AND anno Like '$anno' AND lugar Like '$lugar' ORDER BY id DESC;");
            while (
$registro mysql_fetch_array($result)) {
                echo  
$registro[1] . " - " .  $registro[2] . "/" $registro[3] . "/" $registro[4] . " - " $registro[5] . " -> <a href='".$url_path."editar.php?editar=si&id=".$registro[0]."'>Modificar</a>";
            }
            
mysql_free_result($result);
            
mysql_close($conexion);
        } 
La segunda parte del codigo deberia buscar los registros segun los valores introducidos en el formulario y lo hace, pero SOLO si han sido rellenados todos y existe equivalencia con todos los campos de un registro. Por lo cual este motor de busqueda deja mucho que desear XDDDD Para solucionarlo se me ocurrio que si se dejaba un campo vacio su valor pasara a ser * (if ($nombre == "") $nombre="*";), asi en el WHERE habria algo asi(nombre Like *). Pero esto tampoco funciona. Tambien probe asi (nombre Like '$nombre*') pero nada.

Pues resumiendo necesito un WHERE que busque registros con similitudes a los valores ingresados, sin necesidad de que sean introducidos todos (Nombre, mes, año y lugar). Alguien se le ocurre algo? T_T

Desde ya gracias.

Última edición por Xabu; 04/02/2010 a las 05:56
  #2 (permalink)  
Antiguo 04/02/2010, 04:59
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 9 meses
Puntos: 12
Respuesta: Consulta SQL (Multiples variables en WHERE)

La verdad es que no entiendo muy bien el tipo de programa que estás haciendo pero bueno te puedo dar algunos comentarios sobre el código que estoy viendo y cómo haría yo lo que he entendido que quieres hacer.
Pero te voy a dejar algunos comentarios para ver si empezamos a orientarte.

Yo creo que puedes gestionar el tipo de consulta desde php y no directamente en mysql. Es decir que depende de lo que te pongan los usuarios puede acudir a un tipo de consulta o a otra. Piensa en ello, la opción mostrar puede ser un (ordenar por fecha, ordenar por nombre del grupo, ordenar por...) Por ejemplo.

Más cosas, al hacer la consulta mysql veo que sacas los valores de la BD a través de índices numéricos, eso está bien y es óptimo si sólo utilizas índices numéricos, pero te va a dificultar la faena mientras haces el código y por lo que veo trabajas con los dos tipos de índices porque usas mysql_fetch_array. Podrías poner por ejemplo los registros de esta forma:

Código PHP:
echo  $registro['nombre'] . " - " .  $registro['dia'] . "/" $registro['anno']... // por ejemplo 
Más cosas, para guardar las fechas hay muchos procedimientos, yo personalmente utilizo el mktime y guardo todo en un solo campo int(11) cuando lo introduzco en la base de datos lo convierto y cuando lo saco le doy el formato que quiero con la función date:

Código PHP:
$fecha_mostrar date("d/m - H:i "$fecha); 
Me olvidaba. Puedes comprobar también si una variable está vacía con el empty($variable)

Y bueno, podemos ir comentando y a ver si conseguimos arreglarte el problema
__________________
Juego de navegador online
  #3 (permalink)  
Antiguo 04/02/2010, 05:17
 
Fecha de Ingreso: noviembre-2009
Mensajes: 21
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Consulta SQL (Multiples variables en WHERE)

Gracias por la respuesta Morior. Veras utilizo los indices númericos solo porque son mas comodos, son pocos campos los de la tabla (8) y me se de memoria ya el orden XD.

Lo que pretendo es que si en el formulario de buqueda se introduce solo "Rock" en el apartado nombre, se busquen todos los registros cuyo nombre coincida con "Rock" o la incluyan sin atender a los otros campos del formulario de busqueda tales como fecha y lugar. Si se introduce el nombre y la fecha, que se busquen los registros que coincidan con el nombre y la fecha sin atender al lugar, etc..

En cuanto al formato de la fecha, hasta ahora estaba guardando el dia en un INT(2) el mes en un CHAR(10) y el año en un INT(4). Es complejo trabajar asi con la fecha, pero es que no encuentro la forma de recoger la fecha deseada mediante un formulario e ingresarla a la base de datos como fecha y luego extraerla y operar con ella >.>...

El empty($variable) es igual a if ($variable="")?¿ Si es el caso se utilizaria asi: if (empty($variable)) ?¿
  #4 (permalink)  
Antiguo 04/02/2010, 05:32
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 9 meses
Puntos: 12
Respuesta: Consulta SQL (Multiples variables en WHERE)

No dudo que te sepas el orden de tus tablas de memoria pero los índices numéricos no han sido pensados porque son más cómodos, todo lo contrario, los índices por nombre están pensados porque son más fáciles de identificar. Pero bueno no vamos a discutir eso. Si vas a usar índides numéricos y ya que estás optimizando el código usa la función que extrae sólo los índices numéricos de la base de datos porque lo que tienes ahora te está sacando los dos Creo que es mysql_fetch_assoc o algo así.

Más cosas, si lo que quieres es que el usuario busque siempre por un campo que podría ser una buena forma de empezar podrías hacer algo al estilo:

Código PHP:
$campo "el campo que quieras que busque"// esto es lo que puedes gestionar desde el php

$r=mysql_query("SELECT * // esto no es bueno pero yo no me sé todos tus campos :)
            FROM conciertos
            WHERE $campo ='$valor'
            ORDER BY id DESC"
// <--OJO AL FINAL DE LA CONSULTA MYSQL NO VA ;
              
or die();
        while (
$row=mysql_fetch_array($r)){
            
extract($row);} 

Y me olvidaba de nuevo con el empty puedes hacer eso:
Código PHP:
if (!empty($_POST['enviado'])) 
Por ejemplo
__________________
Juego de navegador online
  #5 (permalink)  
Antiguo 04/02/2010, 05:52
 
Fecha de Ingreso: noviembre-2009
Mensajes: 21
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Consulta SQL (Multiples variables en WHERE)

Gracias por el consejo del empty y del indice numerico, codigo optimizado ;)

Pero mi duda principal sigue sin resolverse xDDD Se como debo hacer para buscar registros por UN SOLO CAMPO. Mi gran problema es buscar por VARIOS CAMPOS y que ademas algunos puedan estar vacios (es decir da igual el valor en dicho campo, como si es pepe o luis, a blanco y negro). Toda esta duda es dentro del WHERE que tengo en esta linea:

Código PHP:
$result mysql_query("SELECT id, nombre, dia, mes, anno, lugar FROM conciertos WHERE nombre Like '$nombre' AND mes Like '$mes' AND anno Like '$anno' AND lugar Like '$lugar' ORDER BY id DESC"); 
Los valores $nombres, $mes, $anno, $lugar son valores que paso a traves de un formulario y los recojo asi:

Código PHP:
    $nombre $_POST['name'];
        
$mes $_POST['mes'];
        
$anno $_POST['anno'];
        
$lugar $_POST['lugar']; 
Vuelvo a pregunta, que debo hacer para que este codigo funcione SIN NECESIDAD de que todas las variables contengan valores (ya que si funciona si todas tienen valores), ya que quiero que algunas puedan quedarse vacias y entonces su valor sea igual a TODO!!!

Ejemplo:

Nombre: Rock
Mes:
Año: 2013
Lugar:

Al enviar esa busqueda deberia encontrar todos los registros de 2013 que contengan la palabra Rock, y daría igual los valores de los campos lugar y mes ya que serian * (Todos los posibles y existentes).

Muchas gracias por molestarte, ojala ahora lo haya explicado mejor y puedas resolver mi duda XDD
  #6 (permalink)  
Antiguo 04/02/2010, 06:07
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Respuesta: Consulta SQL (Multiples variables en WHERE)

Es que no tenes que poner asi el codigo del LIKE, deberias poner =

Código PHP:
 $result mysql_query("SELECT id, nombre, dia, mes, anno, lugar FROM conciertos WHERE nombre='$nombre' AND mes='$mes' AND anno='$anno' AND lugar='$lugar' ORDER BY id DESC"); 
El like es para hacer busquedas segun patrones que elijas vos. Si queres que te devuelvan todas las filas que tengan "hola" dentro del campo "nombre", etc...
Espero que se haya entendido, tampoco se si buscas usar el "=" y en realidad queres usar LIKE, pero el uso que pones en tu codigo no es el correcto.

Saludos.
  #7 (permalink)  
Antiguo 04/02/2010, 06:18
 
Fecha de Ingreso: noviembre-2009
Mensajes: 21
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Consulta SQL (Multiples variables en WHERE)

Si si, tambien se eso MarioAraque, el Like es para patrones tales como: nombre Like 'm*' y buscaria todos los campos que empezaran por M. Lo he puesto asi porque quiero que busque todos los campos parecidos, le falta el * despues de $nombre... Pero Hasta que no se resuelva mi duda pues no puedo ponerle el *!!!!

T_T

Con esa linea de codigo SOLO BUSCARIA REGISTROS CUYOS CAMPOS FUERAN IDENTICOS A LOS 4 CONSULTADOS! Lo que quiere decir que si se deja uno en blanco no encontrara NINGUN resultado ya que no hay campos vacios en la tabla!!!

Otro ejemplo:

Nombre: Pepito
Lugar: (en blanco)
Fecha: 10 - 2015

Busqueda: No se encuentra ningun registro que contenga Nombre = "Pepito", Lugar = "", Fecha = "10 - 2015".

Me gustaria que bsucara coincidencias no datos esactos. Si pongo Pepito nada mas que busque todos los registros que tengan el nombre Pepito o lo contengan sin importar los demas valores T_t No se si es que me explico mal pero mas claro que el agua no puedo ser T_T

Gracias.
  #8 (permalink)  
Antiguo 04/02/2010, 06:33
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Respuesta: Consulta SQL (Multiples variables en WHERE)

Osea vos queres que, por ejemplo, si ponen un campo en blanco (en tu ejemplo el campo "Lugar") te devuelvan los resultados de la consulta ignorando el valor de "Lugar" ??

Vos queres q te devuelva valores identicos o no? Porque en el ejemplo que pones

Nombre: Pepito
Lugar: (en blanco)
Fecha: 10 - 2015

Te devolveria el campo pepito de esa fecha, pero si tenes en la BD un "Pepito1" con esa fecha misma tambien deberia devolvertelo? Para que sepamos si tenes q usar Like o =.

Yo hice un buscador de ese tipo para una empresa de inmobiliarias, y lo que hacia era armar la consulta dinamicamente, algo asi:

Código PHP:
$query "SELECT id, nombre, dia, mes, anno, lugar FROM conciertos ";

$nombre $_POST["nombre"]
if(
$nombre != ""){
  if(!
strstr($query,"WHERE")){
    
$query .= "WHERE nombre='$nombre' ";
  }
  else{
    
$query .= "AND nombre='$nombre' ";
  }
}

$lugar$_POST["lugar"]
if(
$lugar!= ""){
  if(!
strstr($query,"WHERE")){
    
$query .= "WHERE lugar='$lugar' ";
  }
  else{
    
$query .= "AND lugar='$lugar' ";
  }
}

$fecha$_POST["fecha"]
if(
$fecha!= ""){
  if(!
strstr($query,"WHERE")){
    
$query .= "WHERE fecha='$fecha' ";
  }
  else{
    
$query .= "AND fecha='$fecha' ";
  }

Hace eso y luego dale un echo a $query, y fijate si la consulta se te arma bien, luego le haces el mysql_query y listo!
Lo que yo hice es para campos identicos, pq en mi caso fue para una inmobiliaria que buscaba pisos de X tamaño y en X lugar (entre otras cosas), por lo que debia usar = en vez de LIKE

Saludos.

Última edición por MarioAraque; 04/02/2010 a las 06:56
  #9 (permalink)  
Antiguo 04/02/2010, 06:41
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 9 meses
Puntos: 12
Respuesta: Consulta SQL (Multiples variables en WHERE)

Vale de nuevo no me he explicado bien. Te lo hago y listos XD a ver si me sale. dame unos minutos.

Me autoedito, ya que te lo ha resuelto el compañero. Es más o menos lo que yo estaba haciendo pero de una forma muchísimo más elegante. Gracias por el aporte MarioAraque a mí también me ha servido.
__________________
Juego de navegador online

Última edición por morior; 04/02/2010 a las 06:46
  #10 (permalink)  
Antiguo 04/02/2010, 07:03
 
Fecha de Ingreso: noviembre-2009
Mensajes: 21
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Consulta SQL (Multiples variables en WHERE)

Gracias pero mejor dejarlo debo ser un negado. Ese codigo no me produce ningun resultado ni aunque rellene TODOS los campos. Y lo que buscaba era que produciera resultados introduciendo cualquier campo aunque los demas estuvieran en blanco.

En cuanto a la pregunta de MarioAraque sobre si busco datos esactos o parecidos, pues busco parecidos, es decir Like. De esta forma si busco Rock deberian aparecerme todos los que incluyeran esa palabra.

Podria hacer que tuvieras que ingresar los datos esactos para buscar y tener que rellenarlos todos, pero entonces que mierda de busqueda seria esa? xDDD Quiero que con 1 solo dato se pueda buscar todos los registros equivalentes =/

En fin dejare esto para otro dia a ver si despejado me sale o no.
  #11 (permalink)  
Antiguo 04/02/2010, 07:10
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Respuesta: Consulta SQL (Multiples variables en WHERE)

Hiciste solo copy-paste de lo que puse yo? Muy mal, pensabas que iba a darte el problema resuelto? nisiquiera se lo que tenes q hacer...

Hace un echo $query; luego del codigo que te puse y fijate q te devuelve, apartir de ahi empeza a pulir los problemas que tengas. Acaso no vas a poner mysql_real_escape_string a cada asignacion de valores en las variables? Yo hice algo rapidito, lo demas queda en tus manos...

No se, el buscador lo hice de ese modo y salio perfecto, a morior le sirvio tambien parece. De paso aprovecho para decirle que me alegra mucho que el codigo le haya servido.

Un SELECT no es solo una linea de codigo, a veces tenes que trabajar un poco para llegar al resultado, entre mas complicado sea tu problema mas dificil va a ser encontrarle una solucion...

Saludos.
  #12 (permalink)  
Antiguo 04/02/2010, 07:33
 
Fecha de Ingreso: noviembre-2009
Mensajes: 21
Antigüedad: 14 años, 5 meses
Puntos: 1
Respuesta: Consulta SQL (Multiples variables en WHERE)

No hice copy-paste solamente - .- Obviamente adapte el codigo, por ejemplo el campo fecha no existe, esta dividido en mes - año. En fin seguire dandole vueltas al asunto. Gracias por la ayuda.
  #13 (permalink)  
Antiguo 04/02/2010, 07:38
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 14 años, 9 meses
Puntos: 12
Respuesta: Consulta SQL (Multiples variables en WHERE)

con lo que me ha gustado a mí ése código. Si está muy bien, de verdad, vuélvele a echar una ojeada en serio.
__________________
Juego de navegador online
  #14 (permalink)  
Antiguo 04/02/2010, 07:47
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Respuesta: Consulta SQL (Multiples variables en WHERE)

Fijate los espacios en blanco que hay en cada final de algunas lineas, son importantes pq marcan el espaciado final cuando hagas el mysql_query ... si no te queda todo junto y va a funcionar mal.

Fecha no existe, vas a tener q hacer 2 if mas con anno y dia, espero que tengas suerte. De ultima copia la adaptacion que hayas hecho y lo vemos entre todos.

Saludos.

Etiquetas: multiples, sql, variables
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 04:04.