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 :-)

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>