Ver Mensaje Individual
  #4 (permalink)  
Antiguo 24/10/2013, 10:57
Avatar de pateketrueke
pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Validacion de query en php

Ya veo, me parece que debemos dividir el gran problema en pequeños problemas.

Lo primero sería extraer todos los datos de dicha consulta, estructurarlos y partir de ahí, validarlos.

Sólo necesitas expresiones regulares para el primer paso:
Código PHP:
Ver original
  1. $query = ' WHERE (t.var1=1 OR t.var1=3) AND (t.tit1=3 OR t.tit1=5) ';
  2. $where = array();
  3.  
  4. // validamos WHERE (trivial)
  5. if (substr(trim($query), 0, 5) == 'WHERE') {
  6.   // extraemos condiciones
  7.   if (preg_match_all('/\(\s*([^()]+?)\s*\)\s*(?=AND|&&|$)/i', $query, $matches)) {
  8.     // iteramos condiciones AND
  9.     foreach ($matches[1] as $match) {
  10.       // sub-condicionales
  11.       $sub = array();
  12.  
  13.       // extraemos sub-condiciones y operadores
  14.       if (preg_match_all('/(\w+)\.(\w+)\s*(!?==?|[<>]=)\s*([\'"][^\'"]*[\'"]|-?[\d.]+)\s*(?=OR|\|\||$)/', $match, $sub_matches)) {
  15.         foreach (array_keys($sub_matches[0]) as $key) {
  16.           $sub []= array(
  17.             'object' => $sub_matches[1][$key],
  18.             'field' => $sub_matches[2][$key],
  19.             'operator' => $sub_matches[3][$key],
  20.             'value' => $sub_matches[4][$key],
  21.           );
  22.         }
  23.       }
  24.  
  25.       $where []= $sub;
  26.     }
  27.   }
  28. }
  29.  
  30. // condiciones
  31. var_dump($where);

Ahora, el proceso de validación es bastante diferente, debes emplear tu ingenio para analizar dicha estructura y resolver esa parte del problema.

Como puedes observar usar sólo expresiones regulares sería insuficiente por la cantidad de opciones que se pueden dar, y dado el caso, no solo sería imposible sino absurdo dejar la tarea únicamente a las expresiones.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.