Foros del Web » Programando para Internet » PHP »

Duda sobre consulta a BBDD

Estas en el tema de Duda sobre consulta a BBDD en el foro de PHP en Foros del Web. Hola, Esta vez mi duda es sobre una consulta a una BBDD. El problema es que en una parte de mi sitio web dejo actualizar ...
  #1 (permalink)  
Antiguo 06/01/2008, 05:16
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 4 meses
Puntos: 8
Duda sobre consulta a BBDD

Hola,

Esta vez mi duda es sobre una consulta a una BBDD. El problema es que en una parte de mi sitio web dejo actualizar campos existentes en una BBDD. La tabla en cuestión contiene los datos de unos clientes con campos como Nombre, Apellido, Edad,..., ID cliente,... y en el momento en que dejo actualizar los datos de un cliente permito buscar al cliente por los siguientes campos:
Nombre
Apellido
Edad
Provincia
Población
ID cliente

No hace falta rellenar todos los campos, así que el buscador mostrará todas las coincidencias que haya encontrado ordenadas por el apellido.
Hasta aquí todo bien.

El primer problema que tengo es que si solo se rellena uno de los campos de texto realiza la búsqueda "perfecta". La única pega es que si yo pongo en Nombre la letra A me aparecen todos los nombres que la contienen y yo solo quisiera mostrar los que empiezan por la cadena introducida.

Y el segundo problema es que si relleno uno de los campos de texto y uno de los de numeros a la vez no hace la búsqueda bien, solo hace caso a la del número.

Muestro el código de la consulta a ver si alguien me pude decir que hago mal. Muchas gracias por adelantado!

Código PHP:
if (!empty($_POST['nombre']) || !empty($_POST['apellido']) || !empty($_POST['edad']) || !empty($_POST['profesion']) 
    || !empty(
$_POST['provincia']) || !empty($_POST['poblacion']) || !empty($_POST['ID']))
    {
        
$con mysql_connect("localhost","root","123456789");
    if (!
$con)
         die(
'Impossible connectar: ' mysql_error());
    
mysql_select_db("tfc"$con);
    
$sql "SELECT *FROM datos WHERE Nombre LIKE '%".$_POST'nombre']."%'
AND  Apellido LIKE '%"
.$_POST['apellido']."%'
AND Profesion LIKE '%"
.$_POST['profesion']."%'
AND Provincia LIKE '%"
.$_POST['provincia']."%'
AND Poblacion LIKE '%"
.$_POST['poblacion']."%'
AND ID =  '"
.$_POST['ID']."'
AND Edad = '"
.$_POST['ID']."' ORDER By Apellido";
    
$result mysql_query($sql,$con);
    if(
mysql_num_rows($result)>0)
    {
        echo 
"<h2><font color=\"#317082\">Selecciona el cliente que deseas actualizar</font></h2>";
        echo 
"<table bgcolor=\"#DDDDDD\" align=center style=\"border:2px outset black\">"
        for (
$i 0$i mysql_num_fields($result); $i++) 
            {  
                print 
"<th>".mysql_field_name($result$i)."</th>\n";  
            }  
        while (
$registro mysql_fetch_row($result)) 
            { 
                echo 
"<tr>"
                            foreach(
$registro  as $clave
            { 
                echo 
"<td bgcolor=\"#BBBBBB\"style=\"border:2px groove black\" align=\"center\">",$clave,"</td>"
            } 
            } 
                echo 
"</tr></table>";
                exit;
        }
        else
        {
            
$message "<h2><font color=\"red\">No hay coincidencias. Vuelve a realizar la búsqueda.</font></h2>";
            }
        }
else
    
$message"<h2><font color=\"#317082\">Que cliente deseas actualizar?</font></h2><br>";
    
echo 
$message;
?> 
PD: Si alguien ve algún otro fallo o alguna forma de optimizar el codigo siempre es bienvenido!!!
  #2 (permalink)  
Antiguo 06/01/2008, 06:59
 
Fecha de Ingreso: junio-2007
Ubicación: por ahi
Mensajes: 262
Antigüedad: 16 años, 10 meses
Puntos: 4
Re: Duda sobre consulta a BBDD

respecto a lo del nombre simplemente es que el like no empieze con % es decir:

Nombre LIKE '".$_POST'nombre']."%'

Sobre la parte de numeros y letras puedes ser un poco mas claro. Que es lo que esta saliendo mal.
  #3 (permalink)  
Antiguo 06/01/2008, 10:17
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Duda sobre consulta a BBDD

Supongo que con los numeros te refieres a los campos id y edad. En tu consulta, colocas:

Código PHP:
"
AND ID =  '"
.$_POST['ID']."' 
AND Edad = '"
.$_POST['ID']."' ORDER By Apellido"
Por lo tanto, si colocas un id, buscará todas las coicidencias que tengan ese id, y como se supone que es unico, sólo te mostrará un resultado o ninguno. Lo mismo para la edad.
Prueba cambiando eso por:

Código PHP:
"
AND ID LIKE  '"
.$_POST['ID']."%'
AND Edad LIKE = '"
.$_POST['ID']."%' ORDER By Apellido"
o en todo caso:
Código PHP:
$sql "SELECT * FROM datos WHERE (Nombre LIKE '%".$_POST'nombre']."%' [/color]
AND  Apellido LIKE '%"
.$_POST['apellido']."%'
AND Profesion LIKE '%"
.$_POST['profesion']."%' 
AND Provincia LIKE '%"
.$_POST['provincia']."%' 
AND Poblacion LIKE '%"
.$_POST['poblacion']."%') 
OR ID =  '"
.$_POST['ID']."' 
OR Edad = '"
.$_POST['ID']."' ORDER By Apellido"
Un saludo,
  #4 (permalink)  
Antiguo 07/01/2008, 02:41
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 4 meses
Puntos: 8
Re: Duda sobre consulta a BBDD

Hola,
Muchas gracias por contestar a los dos!

hernandos, respecto a lo que tu dices el que no te entiende soy yo... El operador LIKE %..% es para que busque las coincidencias aun que la palabra a buscar no esté completada. Lo que pretendo es que si busco el nombre Carlos, introduciendo Car ya me lo encuentre.
Del tema de los números me refiero a que como tengo campos de strings y de integers no se como hacer la búsqueda combinada de los dos. Si yo relleno solo el campo de nombre y dejo el resto en blanco (suponiendo que los de enteros estén deshabilitados) me hace la búsqueda. Si hago lo mismo pero al revés (habilitos enteros y deshabilito los strings) tambíen la realiza. Pero a la que hago la búsqueda conbinada no va bien. Creo que está por que al no poner nada en el campo de los enteros el espacio vacio no lo interpreta igual en los strings y en los integers... Pero no estoy seguro y por eso posteé.

okram, tu si que me has entendido, pero las soluciones que me has propuesto ya las probé antes de postear y nada. Hacía una consulta de un registro que sique existe rellenando todos los campos y me decía que no existía. Yo creo que el fallo está en lo que le he comentado a hernandos. Creo que el error está en que el string no interpreta igual el caracter vacío que los integers.

Por otro lado, tengo el inconveniente de lo que os dije de la consutla de una cadena. Si escribo 'a' me muestra (por ejemplo):
Angel
Carlos
David
Alberto

Cuando yo lo que quiero es que únicamente me muestre:

Angel
Alberto

Ya que son los que empiezan por 'a', no que me muestro todos los que contienen la letra.

Quizás pido mucho...

Muchas gracias de antemano!
Saludos.
  #5 (permalink)  
Antiguo 07/01/2008, 02:54
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Re: Duda sobre consulta a BBDD

Cita:
Iniciado por crujikoki
Por otro lado, tengo el inconveniente de lo que os dije de la consutla de una cadena. Si escribo 'a' me muestra (por ejemplo):
Angel
Carlos
David
Alberto

Cuando yo lo que quiero es que únicamente me muestre:

Angel
Alberto
Como ya te dijo hernandos, para eso utiliza el comodín % solamente al final en el operador LIKE.
Código PHP:
"... nombre LIKE '".$_POST['nombre']."%' AND ..." 
Saludos
  #6 (permalink)  
Antiguo 07/01/2008, 03:02
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Re: Duda sobre consulta a BBDD

Para que te muestre los que empiezan por la cadena que pasas es lo que dice hernandos.

El otro fallo es porque estas poniendo en la consulta todos los campos, aunque no tengan valor en el formulario. Con los campos string te sale bien de casualidad, porque al ser el campo vacio estas buscando '%%' que es cualquier cadena. Lo que tienes que hacer es crear la parte where solo con los campos que tiene valor en el formulario:
Código PHP:
$where=array();
if (!empty(
$_POST['nombre'])) {
  
$where[]="Nombre LIKE '{$_POST['nombre']}%'";
}
if (!empty(
$_POST['apellido'])) {
  
$where[]="Apellido LIKE '{$_POST['apellido']}%'";
}
if (!empty(
$_POST['edad'])) {
  
$where[]="edad={$_POST['edad']}";
}
if (
0==count($where)) {
  
$cad_where='';
} else {
  
$cad_where=implode(' AND ',$where);
  
$cad_where='WHERE '.$cad_where;
}
$sql "SELECT *FROM datos $cad_where ORDER By Apellido"
  #7 (permalink)  
Antiguo 07/01/2008, 04:22
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 4 meses
Puntos: 8
Re: Duda sobre consulta a BBDD

Buah, muchas gracias a los dos! No entí bien lo que me dijo hernandos. Ahora lo entiendo!!!

Respecto a lo que dices Darkj, no entiendo muy bien la sintaxis que empleas. Si que se lo que haces (que me parece de crack tu solución) pero no la sintaxis.
Esto es lo que me mata:

if (0==count($where)) {
$cad_where='';
} else {
$cad_where=implode(' AND ',$where);
$cad_where='WHERE '.$cad_where;
}

Entiendo que vas insertando AND entre cada una de las posiciones del array para que queda la consulta como debe pero la condición del if no la entiendo y por supuesto, al no entenderla no se por que cuando se cumple haces $cad_where=''.
  #8 (permalink)  
Antiguo 07/01/2008, 05:59
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Re: Duda sobre consulta a BBDD

$where es el array con las condiciones que van en el WHERE de la consulta. Si el numero de condiciones es 0, entonces no hay parte WHERE y por eso la cadena vacia. Es decir, si tu en tu formulario no rellenas ningun campo, $cad_where sera cadena vacia.

Y hago $cad_where=''; porque despues de ese if $cad_where debe tener un valor (para poder usarlo en la consulta), asi que en las 2 ramas del if hay que asignarle un valor.

Es el tipico codigo que lo preparas una vez y luego te tiras años haciendo copypaste.
  #9 (permalink)  
Antiguo 07/01/2008, 14:49
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Duda sobre consulta a BBDD

Cita:
Iniciado por DarkJ Ver Mensaje
Es el tipico codigo que lo preparas una vez y luego te tiras años haciendo copypaste.
Y se puede simplificar mucho, a una sola linea:

Código PHP:
$cad_where = (count($where) == 0) ? "" "WHERE ".implode(' AND ',$where); 
Un saludo,
  #10 (permalink)  
Antiguo 07/01/2008, 17:02
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 4 meses
Puntos: 8
Re: Duda sobre consulta a BBDD

Bueno pues lo dicho, la solución me parece de crack!!!

okram, la tuya creo que también tiene tela, pero como tu sintaxis me parece complicada no la entiendo... (soy bastante nuevo en esto)
De todas formas gracias a todos por que ya tengo lo que quería. Seguramente os molestaré para alguna otra cosilla.

Muchas gracias de nuevo!!!
Saludos.
  #11 (permalink)  
Antiguo 07/01/2008, 17:32
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Duda sobre consulta a BBDD

Es como realizar un if. La manera simplificada es por medio de un signo de interrogacion (?) y dos puntos (:), algo asi:

Código PHP:
if(condicion) {
    
$variable "valor si true";
} else {
    
$variable "valor si false";
}
 
//Es lo mismo que:
 
$variable = (condicion) ? "valor si true" "valor si false"
Puede servirte de muchas maneras, todo es cosa de agarrarle el hilo. Por ejemplo:

Código PHP:
$numero_de_script 1;
 
echo 
"Hola mundo, este es mi " . (($numero_de_script === 1) ? "primer" "segundo") . " script <br />";
 
$numero_de_script++;
 
echo 
"Hola mundo, este es mi " . (($numero_de_script === 1) ? "primer" "segundo") . " script <br />";
 
/* 
Imprime:
 
Hola mundo, este es mi primer script
Hola mundo, este es mi segundo script
 
*/ 
Otro ejemplo:

Código PHP:
function es_par($numero) {
    return ((
$numero 2) == 0);
}
 
$numero 4;
 
echo 
"El número $numero es " . (es_par($numero) ? "par" "impar"); 
Un saludo,

Última edición por okram; 07/01/2008 a las 17:38
  #12 (permalink)  
Antiguo 08/01/2008, 03:48
 
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona
Mensajes: 289
Antigüedad: 16 años, 4 meses
Puntos: 8
Re: Duda sobre consulta a BBDD

Pues lo dicho, que sois unos cracks!! Ahora te he entendido.
Muchas gracias por todo!
Saludos.
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 10:06.