Foros del Web » Programando para Internet » PHP »

Necesito vuestros sabios consejos....a modo de reto!

Estas en el tema de Necesito vuestros sabios consejos....a modo de reto! en el foro de PHP en Foros del Web. buenas a todos, necesito vuestros consejos con una intranet que estoy realizando. tengo un listado de una bd. hasta aqui ningun problema. el problema viene ...
  #1 (permalink)  
Antiguo 03/09/2008, 02:11
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
buenas a todos,

necesito vuestros consejos con una intranet que estoy realizando. tengo un listado de una bd. hasta aqui ningun problema.

el problema viene cuando quiero realizar consultas guiadas, es decir, consultas pasando unas variables al sistema. y es aqui donde ya las ideas se me han 'fundido'.

tengo 2 posibles variables, es decir, tengo 2 selects:

categoria, provincia

y un buscar. la idea es que el listado que obtendremos pase a la bd el resultado de la consulta, segun le pasen la categoria, la provincia o las 2.

tengo un listado tal que asi:

Código:
$sql1 = "SELECT * FROM datos_ofertas WHERE provincia='$provincia' AND categoria='$categoria'";
$registros = mysql_query($sql1);
ya he hecho que tanto en el select de categorias como en el de provincias, que puedas seleccionar la opcion Todas, que tiene como value 0. he intentado hacer if, else etc.. pero no consigo dar con todas las opciones.

alguuien tiene alguna sugerencia, idea para orientarme?

saludos

vuelvo a ser yo,

mas que nada es que no se si lo hago mal, pero me salen tantas opciones a evaluar...

1) categoria == 0

2) provincia == 0

3) categoria y provinvia == 0

4) categoria != 0

5) provincia !=0

6) categoria y provincia !=0

estoy super liado!!!

ninguna sugerencia?

saludos

Última edición por GatorV; 03/09/2008 a las 08:14
  #2 (permalink)  
Antiguo 03/09/2008, 04:19
 
Fecha de Ingreso: agosto-2008
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 7
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

puedes usar un buscador mira este para orientarte, si tienes problemas pra entenderlo pregunta: http://www.forosdelweb.com/f18/busca...o-paso-619232/
  #3 (permalink)  
Antiguo 03/09/2008, 04:29
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

ufff ilie,

me he perdido. creo que lo mio iria encaminado al post que rewspondes tu, aunque si te soy sincero.. me pierdoo!!

pues explicarme eso del criterio?

saludos
  #4 (permalink)  
Antiguo 03/09/2008, 04:47
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

Yo lo haría así:
Código PHP:
$where = array();

if( 
$provincia != )
{
    
$where[] = "provincia='$provincia'";
}


if( 
$categoria != )
{
    
$where[] = "categoria ='$categoria '";
}

if( !empty(
$where) )
{
    
$where_sql implode(' AND '$where);
}

$sql1 "SELECT * FROM datos_ofertas $where_sql"
Un saludo
  #5 (permalink)  
Antiguo 03/09/2008, 05:10
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
gracias jerkan,

he probado tu codigo y me da error. te pongo como queda en mi aplicacion, ya que como lo he implementado, quizas haga algo mal:

Código:
$where = array();


if( $provincia != 0 )
{
    $where[] = "provincia='$provincia'";
}


if( $categoria != 0 )
{
    $where[] = "categoria ='$categoria'";
}

if( !empty($where) )
{
    $where_sql = implode(' AND ', $where);
}


$sql1 = "SELECT * FROM datos_ofertas $where_sql";
$registros = mysql_query($sql1);
//Primera parte de la paginación
$total_regs=mysql_num_rows($registros);
$por_pag=20;
$total_pags=ceil($total_regs/$por_pag);
if(isset($pag))
{
$inicio=($pag-1)*$por_pag;
}
else
{
$inicio="0";
$pag="1";
}
$sql= "SELECT * FROM datos_ofertas $where_sql ORDER BY fecha DESC LIMIT ".$inicio.",".$por_pag;
$resultados = mysql_query($sql);
que hago mal?

no acabo de entender tu programacion

creo que la consulta siempre me devuelve los mismos datos...

Última edición por GatorV; 03/09/2008 a las 08:17
  #6 (permalink)  
Antiguo 03/09/2008, 05:37
 
Fecha de Ingreso: agosto-2008
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 7
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

Cita:
Lo que se puede hacer es al obtener los criterio de búsqueda dividirlos en sus respectivas palabras:

Código PHP:
Código PHP:
//por ejemplo 
if($criterio1 != ""){ 
$listaCriterio1 explode(' ',$criterio1);  

//y con ello formar la condición de búsqueda: 
//si hubiera criterios anteriores hay que comprobarlos por si hay que añadir AND a la claúsura WHERE:  

if($sqlCriterioAnterior != ""  ){$sqlCriterio1 "AND (";} 
else{
$sqlCriterio1 "(";} 

for(
$i 0$i<count($listaCriterio1); $i++){ 
if(
$i>0){$sqlCriterio1.="OR ";} 
$sqlCriterio1 .= "Criterio1 REGEXT '$listaCriterio1[$i]' "

$sqlCriterio1.=") "
$criterioAnterior.=$sqlCriterio1

Donde REGEXP podemos verlo explicado aquí: http://dev.mysql.com/doc/refman/5.0/es/regexp.html

$sqlCriterioAnterior se refiere al criterio
Los paréntesis es porque hacemos queremos que coincidan todos los criterios pero también que en cada uno aparezca al menos una de las expresiones:

(a || b || c ...)&&( d || e || f...).... donde (a || b || c ...) es un criterio de búsqueda.
(esta fórmula se puede sustituir por la que se quiera)

Y por último componer la consulta:

$sqlTotal="Select * FROM ... WHERE $criterioAnterior....;

Los criterios de búsqueda son los condicionantes que añadas a tu consulta (WHERE ....), es decir, los inputs de tu formulario. Este buscador está pensado para que si introduces más de una palabra en un criterio (input) el buscador te las busque por separado y no todas juntas, es decir, no busca estrictamente lo que pones, sino, las palabras que pones.

Con un ejemplo lo verás mejor. Si buscas nombres y pones en el campo "jose manuel" el buscador te buscará tanto "jose" como "manuel" no estrictamente "jose manuel" y si pones sólo "jose" también te buscará cualquier nombre que contenga "jose".

Ahora ten en cuenta que en código sólo está para un criterio (para más sólo tienes que hacer un for con $_POST ó $_GET y en vez de $criterio1 poner $$_POST[$j], qeudando así:

Código PHP:
$sqlCriterio "";//contendrá la condición WHERE...
$sqlCriterioAnterior ="";//indicará si es el primer atributo a buscar
$criterios = array(Criterio1Criterio2...)//Aqui sustituye los criterios por el nombre de cada uno de los atributos de la tabla.


for($j =0$j<count($_POST); $j++){//un ciclo por cada criterio
//comprobamos si ha habido criterios de búsqueda anterirores:
if($sqlCriterioAnterior != ""  ){$sqlCriterio "AND (";} 
else{
$sqlCriterio1 "(";} 

//Obtenemos valores introducidos:
$listaCriterio explode(' ',$_POST[$j]);//obtenemos los distintos términos introducidos

for($i 0$i<count($listaCriterio); $i++){  
if(
$i>0){$sqlCriterio.="OR ";}  
$sqlCriterio1 .= "$criterios[$j] REGEXT '$listaCriterio[$i]' ";  
}  
$sqlCriterio.=") ";  
$criterioAnterior.=$sqlCriterio;  
}  

como indiqué antes la consulta se basa en operadores lógicos cuya representación sería esta:

( a || b || c ...)&&( d || e || f...).... donde (a || b || c ...) es un criterio de búsqueda y a, b ... son las palabras introducidas.


Si no entiendes algo en concreto no dudes en preguntar

Última edición por ilie; 03/09/2008 a las 05:55
  #7 (permalink)  
Antiguo 03/09/2008, 05:42
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

Cita:
Iniciado por ferranWEB Ver Mensaje
gracias jerkan,

he probado tu codigo y me da error. te pongo como queda en mi aplicacion, ya que como lo he implementado, quizas haga algo mal:

Código:
$where = array();


if( $provincia != 0 )
{
    $where[] = "provincia='$provincia'";
}


if( $categoria != 0 )
{
    $where[] = "categoria ='$categoria'";
}

if( !empty($where) )
{
    $where_sql = implode(' AND ', $where);
}


$sql1 = "SELECT * FROM datos_ofertas $where_sql";
$registros = mysql_query($sql1);
//Primera parte de la paginación
$total_regs=mysql_num_rows($registros);
$por_pag=20;
$total_pags=ceil($total_regs/$por_pag);
if(isset($pag))
{
$inicio=($pag-1)*$por_pag;
}
else
{
$inicio="0";
$pag="1";
}
$sql= "SELECT * FROM datos_ofertas $where_sql ORDER BY fecha DESC LIMIT ".$inicio.",".$por_pag;
$resultados = mysql_query($sql);
que hago mal?
Fallo mío. Tienes que cambiar lo siguiente:
Código PHP:
if( !empty($where) )
{
    
$where_sql 'WHERE '.implode(' AND '$where);

  #8 (permalink)  
Antiguo 03/09/2008, 05:52
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

sigue sin funcionarme

me da el mismo resultado siempre
  #9 (permalink)  
Antiguo 03/09/2008, 05:54
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

Deberías comprobar siempre el valor que te devuelve mysql_query. Si te da error, mira el error con mysql_error.
  #10 (permalink)  
Antiguo 03/09/2008, 05:58
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
es que me fijo en una cosa jerkan...

estamos mirando que categoria y provincia != 0 eso querra decir que tendran valor.. pero es que no acabo de entender lo que hace el codigo exactamente. lo normal, si se pasasen las dos variables siempre con valor seria:

Código:
$sql1 = "SELECT * FROM datos_ofertas WHERE provincia='$provincia' AND categoria='$categoria'";
es decir, eso me funciona, lo que quiero conseguir es que el usuario tenga la posibilidad de poner en el select de categoria y en el select de provincia "todas las opciones" cuyo valor para nosotros es 0...

me explico?

algo tiene que estar mal por el echo $where_sql no me da ningun valor..

Última edición por GatorV; 03/09/2008 a las 08:18
  #11 (permalink)  
Antiguo 03/09/2008, 06:02
 
Fecha de Ingreso: agosto-2008
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 7
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

asígnale alguna clave a cada elemento del array
  #12 (permalink)  
Antiguo 03/09/2008, 06:05
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

ilie, a que te refieres exactamente?
  #13 (permalink)  
Antiguo 03/09/2008, 06:12
 
Fecha de Ingreso: agosto-2008
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 7
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

comprueba por separado cada una de las acciones:

Cita:
$where = array();


if( $provincia != 0 )
{
$where[] = "provincia='$provincia'";
}

print_r(where);

if( $categoria != 0 )
{
$where[] = "categoria ='$categoria'";
}
print_r(where);
if( !empty($where) )
{
$where_sql = implode(' AND ', $where);
}
echo $whrere_sql;
  #14 (permalink)  
Antiguo 03/09/2008, 06:22
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

$categoria y $provincia dónde se instancian?
  #15 (permalink)  
Antiguo 03/09/2008, 06:25
 
Fecha de Ingreso: agosto-2008
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 7
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

son los inputs introducidos en el formulario

luego:

$provinvia = $_POST['provincia']
  #16 (permalink)  
Antiguo 03/09/2008, 07:29
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

las variables les recibo bien, es decir, por GET y tal como indica ilie.

pq no me funciona!!
  #17 (permalink)  
Antiguo 03/09/2008, 08:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

El código de Jerkan te debería de funcionar, pero prueba esto para ver como se esta construyendo el SQL:
Código PHP:
$where = array();

if( 
$provincia != )
{
    
$where[] = "provincia='$provincia'";
}


if( 
$categoria != )
{
    
$where[] = "categoria ='$categoria '";
}

$where_sql '';
if( 
count($where) > )
{
    
$where_sql ' WHERE ' implode(' AND '$where);
}

var_dump($where);

$sql1 "SELECT * FROM datos_ofertas $where_sql"
echo 
$sql1
Saludos.
  #18 (permalink)  
Antiguo 03/09/2008, 10:39
 
Fecha de Ingreso: enero-2002
Mensajes: 1.872
Antigüedad: 22 años, 3 meses
Puntos: 3
Respuesta: Necesito vuestros sabios consejos....a modo de reto!

buenas,

gracias a los 3! al final ha funcionado el tema, pero con una pequeña variacion. he tenido que cambiar el valor del select, y en vez de poner 0, poner "". me ha quedado asi:

Código:
$where = array();


if ( $provincia != "" )
{
    $where[] = "provincia='$provincia'";
	
}

if ( $canal != "" )
{
    $where[] = "canal='$canal'";
	
}

if ( $categoria != "" )
{
    $where[] = "categoria='$categoria'";
	
}

if( !empty($where) ) 
{ 
    $where_sql = 'WHERE '.implode(' AND ', $where); 
}  


$sql1 = "SELECT * FROM datos_ofertas $where_sql";
$registros = mysql_query($sql1);
//Primera parte de la paginación
$total_regs=mysql_num_rows($registros);
$por_pag=20;
$total_pags=ceil($total_regs/$por_pag);
if(isset($pag))
{
$inicio=($pag-1)*$por_pag;
}
else
{
$inicio="0";
$pag="1";
}
$sql= "SELECT * FROM datos_ofertas $where_sql ORDER BY fecha DESC LIMIT ".$inicio.",".$por_pag;
$resultados = mysql_query($sql);
asi me va perfecto...

no se como agradeceros vuestra ayuda!! sin vosotros no habria podido hacerlo, gracias a los 3!! pero en especial a ilie y jerkan por vuestra paciencia!!!

saludos,

ferranWEB
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:35.