Manipulación y análisis de sentencias sql

abril 6, 2013

Aquí tenéis dos funciones para la manipulación y análisis de sentencias SQL SELECT.
La función “sql_select2clauses” extrae en un array las clausulas SQL de un sentencia. Podéis cambiar una de ellas y volver a obtener la sentencia con la función inversa “sql_clauses2select”.

Por ejemplo:
– podéis cambiar el orden de la sentencia.
– añadir un limite.
– obtener la sql para contar los registros.

Códigos de ejemplos:
// para contar los registros de una SQL
$clausulas = sql_select2clauses("SELECT id,name FROM users WHERE tipo=1");
$clausuas["SELECT"] = "count(id)";
$sql = sql_clauses2select($clausulas);

// cambiar la pagina
$clausulas = sql_select2clauses("SELECT id,name FROM users WHERE tipo=1 LIMIT 2,25");
$clausuas["LIMIT"] = "3,25";
$sql = sql_clauses2select($clausulas);

// cambiar el orden
$clausulas = sql_select2clauses("SELECT id,name FROM users WHERE tipo=1 LIMIT 2,25");
$clausuas["ORDER BY"] = "name DESC";
$sql = sql_clauses2select($clausulas);

Ahora, las librerias


function sql_clauses2select ($clauses) {
	$orderedClauses = array("SELECT","FROM","WHERE", "GROUP","HAVING","ORDER BY","LIMIT");
	$parts=array("SELECT"=>"SELECT *");
	foreach ($orderedClauses as $clause){
		if ( isset($clauses[$clause]) ){
			$parts[$clause] = $clause . " " . $clauses[$clause];
		}
	}
	return implode(" ",$parts);
}


function sql_select2clauses($sql){	
	$state = 0;	//0=normal 1=over quote 2=over double quote
	$token ="";	
	$clauses = array("FROM","WHERE", "GROUP","HAVING","ORDER BY","LIMIT");
	$founds=false;	
	$previous="";
	
	$sql= trim($sql);
	if ( stripos($sql,"SELECT")!==0 ){
		return false;
	}
		
	for($i= strlen($sql)-1;$i>=0;$i--){
		$char= $sql[$i];
		if ( $state==0 ){
			if ( $char==" " || $char=="," ) { 			
				$token = strtoupper($token);								
				if ($token == "BY" && strtoupper(substr($sql,$i-5,5))=="ORDER") {
					$i -= 5; //5 = length order
					$founds["ORDER BY"]= trim(substr($previous,2)); // 2 length of "BY;
					$previous="";				
				} elseif ( in_array($token,$clauses)) {
					$founds[$token]= trim(substr($previous,strlen($token))); //extract $token;
					$previous="";				
				}				
				$token ="";
			} else {
				$token = $char .$token;
			}
			
		} elseif ( ($state==1 && $char=="'") OR ($state==2 && $char=='"') ){
			$state=0;
		}
		$previous = $char . $previous;
	}
	$founds["SELECT"] = trim(substr($previous,7)); 	
	
   return array_reverse($founds);
}

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: