elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  filtrar contenido con jquery
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: filtrar contenido con jquery  (Leído 6,452 veces)
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: filtrar contenido con jquery
« Respuesta #10 en: 18 Noviembre 2015, 17:40 pm »

Pues ahora que lo dices, al principio se imprimia el \n, pero porque se me olvido cambiar las comillas normales '\n' a dobles "\n". Ahora imprime el salto de linea, ¿eso no debe dar ningún error no? Si se ponen saltos de linea sin variables y no pasa nada. (Lo he quitado y nada, el mismo error sin saltos de linea)

Acaba de encontrar un supuesto error:

Código
  1. SELECT t1.id, t2.*
  2. FROM for_sale t1
  3. INNER JOIN property t2 ON t2.id = t1.id
  4. WHERE t2.USE = 1
  5. AND t2.TYPE = 2
  6. OR t2.TYPE = 3
  7. NULL
  8. NULL
  9. NULL
  10. NULL
  11. LIMIT ?, ?

Podria ser por las variables que se imprimen como NULL, sin embargo le acaba de poner else unset() a los IFs y sigue tirando el mismo error. Ya no sé que más probar...

Código
  1. if ($filter_type != NULL) {
  2.    foreach ($filter_type as $type=>$value) {
  3.        if ($type === 0) {
  4.            $type_cond = 'AND t2.type = ' . $value;
  5.        } else {
  6.            $type_cond .= $type_cond . "\n OR t2.type = " . $value;
  7.        }
  8.    }
  9. } else unset($filter_status); // Ya no imprime NULL dentro del prepare()
  10.  

EDITO: Que extraño, al marcar 3 checkboxes se repite el primero... Puede ser el foreach (que lo dudo) o el array...

Código
  1. MySQLi failed: You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near 't2.type = 1
  2. OR t2.type = 2AND t2.type = 1AND t2.type = 1
  3. OR t2.type = 2
  4. OR t2' at line 5<br><br />

Esos dos AND despues del primer OR están de más... ¿Como es posible que se este imprimiendo asi?

Al parecer lo del NULL no tiene nada que ver, no se llega a imprimir, asi que esos unset() están de más.


« Última modificación: 18 Noviembre 2015, 18:04 pm por gAb1 » En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: filtrar contenido con jquery
« Respuesta #11 en: 18 Noviembre 2015, 18:09 pm »

Esto ya se vuelve un problema de PHP y MySQL:

Tienes que usar los paréntesis y USE y TYPE son palabras reservadas. Por eso la etiqueta code te resalta en rojo esas palabras:

Código
  1. SELECT t1.id, t2.*
  2. FROM for_sale t1
  3. INNER JOIN property t2 ON t2.id = t1.id
  4. WHERE t2.`USE` = 1
  5. AND (t2.`TYPE` = 2 OR t2.`TYPE` = 1 OR t2.`TYPE` = 3)
  6. AND (t2.`STATUS` = 0 OR t2.`STATUS` = 1 OR t2.`STATUS` = 2)
  7. AND (t2.bhk = 3 OR t2.bhk = 1 OR t2.bhk = 2)

Está es una forma de hacerlo con PHP:

Código
  1. <?php
  2. function agregaCondicionCompuesta($campo, $valores){
  3.    $red = function($acc, $valor) use ($campo){
  4.   $condicion = "$campo = $valor";
  5.   if($acc){
  6.   return $acc . ' OR ' . $condicion;
  7.   } else {
  8.     return $condicion;
  9.   }
  10. };
  11.    $reduced = array_reduce($valores, $red);
  12.    return count($valores) > 1 ? "($reduced)" : $reduced;
  13. }

O una manera más sencilla de verla sin el reduce:

Código
  1. function agregaCondicionCompuesta($campo, $valores){
  2.  $query = '';
  3.  foreach($valores as $index => $valor){
  4.    $condicion = "$campo = $valor";
  5.    if($index == 0){
  6.      $query .= $condicion;
  7.    } else {
  8.      $query .= ' OR ' . $condicion;
  9.    }
  10.  }
  11.  return count($valores) > 1 ? "($query)" : $query;
  12. }

Después simplemente agregas las condiciones compuestas:

Código
  1. $filtros = [0, 1];
  2. $use = [1];
  3. echo agregaCondicionCompuesta('t2.`USE`', $use) . ' AND ' . agregaCondicionCompuesta('t2.`TYPE`', $filtros);
  4. //t2.`USE` = 1 AND (t2.`TYPE` = 0 OR t2.`TYPE` = 1)
  5.  

Claro que esto deja mucho que desear porque te pueden hacer SQL Injection. Puedes usar '?' en lugar de $valor si vas a usar prepared statements:

Código
  1. $condicion = "$campo = ?";

Luego simplemente haces el bind de las variables con un for. Ojo que los parámetros van en orden, y si tienes otros parámetros antes estos tienen que ser puestos primero.

Ultimadamente creo que sería mejor que en lugar de usar múltiples ORs usaras la función IN de MySQL:

Código
  1.    SELECT t1.id, t2.*
  2.    FROM for_sale t1
  3.    INNER JOIN property t2 ON t2.id = t1.id
  4.    WHERE t2.`USE` = 1
  5.    AND t2.`TYPE` IN(1, 2, 3);
  6.    AND t2.`STATUS` IN(0, 1, 2)
  7.    AND t2.bhk IN(1, 2, 3)

Estoy seguro que te puedes imaginar formas de como agregar los valores tu solo a lo que hay dentro de el IN.


« Última modificación: 18 Noviembre 2015, 18:11 pm por MinusFour » En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: filtrar contenido con jquery
« Respuesta #12 en: 18 Noviembre 2015, 18:33 pm »

Tienes razón, debería escapar las palabras reservadas (aunque ese no fuera el problema). El problema estaba en la primera condición, que no dejaba un espacio o un salto de linea y se juntaba "use = 1AND t2.type".

Gracias por las funciones, tenia pensado hacer una cuando funcionara bien. Sobre lo del SQL Injection dudo mucho que se pueda hacer usando enteros  ;D Aunque sería mejor practica usar el bind_param es más trabajo.

Voy a adaptar la función que usa el reduce para usar el IN, yo tambien creo que mejor. Aunque aún estoy pensando en como hacerlo...  :rolleyes: Primero usar IN en lugar de ORs y lo del bind_param... En cuanto lo tenga edito.

Por mi se puede mover al subforo de PHP, donde podrá ser visto por todos.

Gracias!

EDITO: Al final no me hizo falta el array_reduce()

Código
  1. function addQueryCond($col, $values) {
  2.  
  3.    $red = function($acc, $values) use ($col) {
  4.  
  5.        $condition = '';
  6.        $count = count($values);
  7.  
  8.        foreach ($values as $key=>$value) {
  9.            if ($key === 0) {
  10.                $condition = "\nAND ". $col . ' IN(?';
  11.                if ($count === 1) {
  12.                    $condition .= . $condition . ')';
  13.                }
  14.            } else if ($key < $count) {
  15.                $condition .= $condition . ', ?';
  16.            } else {
  17.                $condition .= $condition . ', ?)';
  18.            }
  19.        }
  20.    };
  21.  
  22.    return array($condition, $count); // count para el bind_param
  23. }
  24.  

Luego para hacer el bind_param()... No lo tengo claro aun xD

EDITO 2: A ver no se me ocurre como reducir esto...

Código
  1. if ($filter_type != NULL) {
  2.    $data = addQueryCond('t2.`type`', $filter_type);
  3.    $type_cond = $data[0];
  4.    $type_count = $data[1];
  5. }
  6.  
  7. if ($filter_status != NULL) {
  8.    $data = addQueryCond('t2.`status`', $filter_status);
  9.    $status_cond = $data[0];
  10.    $status_count = $data[1];
  11. }
  12.  
  13. if ($filter_bhk != NULL) {
  14.    $data = addQueryCond('t2.bhk', $filter_bhk);
  15.    $bhk_cond = $data[0];
  16.    $bhk_count = $data[1];
  17. }
  18.  
  19. if (isset($type_count)) {
  20.    foreach($type_count as $count) {
  21.        $var = 'type' . $count;
  22.        foreach($filter_type as $filter) {
  23.            $$var = $filter;
  24.        }
  25.    }
  26. }
  27. if (isset($status_count)) {
  28.    foreach($status_count as $count) {
  29.        $var = 'status' . $count;
  30.        foreach($filter_status as $filter) {
  31.            $$var = $filter;
  32.        }
  33.    }
  34. }
  35. if (isset($bhk_count)) {
  36.    foreach($bhk_count as $count) {
  37.        $var = 'bhk' . $count;
  38.        foreach($filter_bhk as $filter) {
  39.            $$var = $filter;
  40.        }
  41.    }
  42. }

Al parecer con PDO se puede hacer mucho más facilmente lo que quiero, voy a mirar como funciona.
« Última modificación: 19 Noviembre 2015, 03:35 am por gAb1 » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
jquery cambio dinamico contenido con PHP
PHP
Carlosnuel 4 6,992 Último mensaje 13 Diciembre 2009, 02:30 am
por Carlosnuel
[SOLUCIONADO] Cargar contenido + JQuery.Load()
Desarrollo Web
Shell Root 2 2,753 Último mensaje 16 Noviembre 2012, 22:28 pm
por Shell Root
ocultar un contenido en jquery
Desarrollo Web
landerzx 2 1,962 Último mensaje 10 Enero 2013, 18:23 pm
por landerzx
regex para filtrar caracteres especiales en jquery
Desarrollo Web
gAb1 2 3,821 Último mensaje 20 Abril 2016, 16:28 pm
por gAb1
Google afirma que es incapaz de filtrar todo el contenido pirata de manera ...
Noticias
wolfbcn 0 1,873 Último mensaje 4 Diciembre 2017, 01:14 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines