sql_insertar() – pg_send_prepare && pg_send_execute
Esta semana estuve liado con un script que hiciera el clásico ABC (altas, bajas y cambios) en una BD de PostgreSQL. Sí, como siempre PostgreSQL pero el por que de esa desición es harina de otro costal, vamos al grano, estaba con el script y honéstamente ya se deterioraron mis habilidades de hacer las cosas a pata; tenía rato que no hacía estas chivas, ya me había acostumbrado al metodo CodeIgniter el caso es que me dió mucha hueva hacer el INSERT INTO a la base de datos con la clásiquísima sentencia escrita a mano, con sus campos y valores, entonces pensé “la programación debe ser divertida y ahorrarte trabajo”, así que la hice, no es nada del otro mundo, solamente construye una instrucción SQL (INSERT INTO) con los parametros que se le mandan, funciona con las funciones integradas de php pg_send_prepare() y pg_send_execute() Greets:
/*
* @author Pedro [ge3k] Navarro
* @type function
* @name sql_insertar()
* @description Crea dinámicame una instrucción SQL - INSERT INTO a partir de los parametros que le sean asignados
* @parameters (array) $params
* @version 0.5
* @return (string) $returnSendInsertQuery: Regresa una cadena de caracteres que representa una instrucción SQL válida
* @date June 03, 2009
* @license Artistic License or wathever, this code its free and redistributable.
* @Greets ***k001 && nahual***
*/
function sql_insertar ($params){
//ordenamos los parametros por el valor de su llave; en este caso, $params comprende un arreglo $_POST
ksort($params);
//se extraen las llaves y los valores por separado, estamos seguros de que sí corresponden unas a otras por que
//en la sentencia de arriba nos encargamos de eso.
$params_name = array_keys($params);
$params_value = array_values($params);
//Comenzando instrucción:
$sqlInsertQuery = ' INSERT INTO my_table ';
$sqlInsertQuery .= '(';
//declaramos una variable para poner los campos que se verán afectados.
$campos = '';
//Bucle for: itera entre todos los parametros que traé el (array)$params_name
for ($i = 0; $i < count($params_name); $i++) {
//aquí se agregan los parametros que no se deseen incluir como campos en la instrucción
if ($params_name[$i]!='do' &&
$params_name[$i]!='f' &&
$params_name[$i]!='imprimir' &&
$params_name[$i]!='guardar'
) {
//comienzo a concatenar campos
$campos .= $params_name[$i];
//sí va en el penúltimo, entonces ya no debe agregar otra comma al final de la siguiente iteración
if ($i < count($params_name) -1){ $campos .= ','; }
}
}
//concateno los campos a la primera variable que contiene el inicio de la instrucción
$sqlInsertQuery .= $campos;
//ahora siguen los valores
$sqlInsertQuery .= ')VALUES(';
//ejecuto un query con los campos que necesito de la tabla
$result = pg_query($this->dbconnect(),'SELECT '.$campos.' FROM my_table;');
//Bucle for: itera entre todos los parametros que traé el (array)$params_value
for($i = 0; $i < count($params_value); $i++){
if ($params_name[$i]!='do' &&
$params_name[$i]!='f' &&
$params_name[$i]!='imprimir' &&
$params_name[$i]!='guardar'
) {
//preparo el query, para que quede de esta forma $1, $2, $3, ...
$sqlInsertQuery .= ' $'.($i + 1);
//sí va en el penúltimo, entonces ya no debe agregar otra comma al final de la siguiente iteración
if ($i < count($params_value) -1){ $sqlInsertQuery .= ','; }
//con pg_field_type le pregunto a PostgreSQL ¿Qué tipo de dato tiene el campo que tiene la posición numerica de $i
$field_type = pg_field_type($result, $i);
//el paso de la muerte:
switch ($field_type){
//en caso de que el campo tenga algo que ver con alfanuméricos va aquí
case "bpchar":
$sqlInsertQuery .= ' \''.$params_value[$i].'\'';
//sí va en el penúltimo, entonces ya no debe agregar otra comma al final de la siguiente iteración
if ($i < count($params_value) -1){ $sqlInsertQuery .= ','; }
break;
//todo lo que lleve unicamente numeros va aquí
case "int4":
$sqlInsertQuery .= $params_value[$i].'';
//sí va en el penúltimo, entonces ya no debe agregar otra comma al final de la siguiente iteración
if ($i < count($params_value) -1){ $sqlInsertQuery .= ','; }
break;
//definitivamente no sabemos qué puede pasar, así que por si las moscas lo metemos como texto.
default:
$sqlInsertQuery .= ' \''.$params_value[$i].'\'';
//sí va en el penúltimo, entonces ya no debe agregar otra comma al final de la siguiente iteración
if ($i < count($params_value) -1){ $sqlInsertQuery .= ','; }
break;
}
}
}
//termino la instrucción INSERT INTO de SQL de la debida manera
$sqlInsertQuery .= ');';
//pido una conexión a la base de datos
$cnn = $this->dbconnect();
//preparo el query con el SQL que hice
pg_send_prepare($cnn, 'my_query', $sqlInsertQuery);
$resultPrepareInsertQuery = pg_get_result($cnn) || die (pg_last_error($cnn) );
//ejecuto query y le mando los parametros
pg_send_execute($cnn, "my_query", $params_value);
$resultSendInsertQuery = pg_get_result($cnn) || die(pg_last_error($cnn));
return $resultSendInsertQuery;
}
?>
Espero puedan criticar la función, para hacerla mejor ó resolverle pedos, sí es que alguien la prueba y los encuentra. Espero sus comentarios






