Estuve peleando como pendejo contra el puto encoding de html en Internet Explorer, por que resulta que la mamada esa no sabe interpretar el meta tag

  <meta http-equiv="Content-Type" content="text/html; charset=utf8" />

y fué un verdadero pedo encontrar la sintáxis adecuada de htmlentities() para que funcionara bien, después de mucho interpretar el manual, dejo a su disposición un ejemplo que funciona bastante bien, en IE6-7, Opera, FF3 y Chrome. Continue reading »

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

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: Continue reading »

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

Primero, un poco de contexto… En el jale tengo que hacer un query para un mini-reporte que servirá de guía para “X” area, así que hice un query usando la siguiente instrucción:
*El SGBDR es PostgreSQL

	SELECT pi.anio,pi.proyecto,pp.area,m.meta,c.promesa	,c.avance,c.comentarios,((c.avance / c.cantidad ) * 100) as porcentaje

	FROM piezas pi FULL JOIN participantes_proyecto pp
	ON pi.proins_clave_anio = pp.proins_clave_anio
	AND pi.id = pp.id 

	FULL JOIN metas m
	ON m.id = pp.id
	AND m.area = pp.area
	AND m.anio = pp.anio

	FULL JOIN calendarizacion c
	ON c.anio = m.anio
	AND c.area = m.area

	WHERE pi.anio = 2010
	AND pp.area = 'Informatica'; Continue reading »
SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
 

En este post mostraré como modificar las cabeceras de APACHE con PHP usando las herramientas CodeIgniter y PrototypeJS para crear errores de servidor al vuelo y recogerlos con
Ajax.Request(); para hacer uso de los eventos que ofrece. En este ejemplo usaré 3 de ellos…

onLoading: Para alterar el dom con un texto mientras responde el server

onFailure: Para recoger el error y mostrarlo alterando el dom del html

onSuccess: Para mostrar la respuesta *correcta* que esperamos del server.

Controlador:

class Controlador extends Controller{
    function ejemplo ()
    {
       $param['dato'] = $this->input->post('dato', TRUE);
        // suponiendo que hay dos variables que a huevo deben
        // coincidir para llegar al siguiente proceso
        // si las variables son iguales, entonces muestra la vista
        if ($param['dato'] == 1)
        {
            $this->load->view('opciones');
            // en caso contrario, invoca a la función privada _get500();
        } else {
            $this->_get500();
        }
    }

    // Escribe el "Response status" de respuesta para AJAX.onFailure
    function _get500()
    {
        header("HTTP/1.0 500 Hubo una madre que fallo, por lo pronto no jala.");
    }
}

Ahora, este es el archivito.js que manda llamar el controlador.

function get500()
{
     var url = base_url;
    var $_C = 'controlador/ejemplo';
    url += $_C;
    var notice = $('notifications');
    new Ajax.Request(url, {
      method: 'post',
      {
      parameters: {dato: $F('dato')}
      }

      onLoading: function(transport){
          notice.update('CARGANDO ESTA CHINGADERA').setStyle({ background: '#dfd' });
      },

      onFailure: function(transport) {
          notice.update(transport.statusText).setStyle({ background: '#dfd' });
      },

      onSuccess: function (transport){
          notice.update(transport.responseText).setStyle({ background: '#dfd' });
      }
    });
    new Effect.Appear('notifications');

}

Ahora, la vista donde se observaran los efectos del código


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

Casi nunca le pico al Youtube, por que no le se, pero hoy me dió por investigarle a “Los videos que se están mirando” y me salió esta joyita, resulta que esta es una agrupación de morritas Sur Koreanas que tienen un ritmito pegajoso… honéstamente sí suena mejor que Daddy Yankee y RBD ft. Paquita la del Barrio… Salieron a la lúz en el 2008
Se llaman Lee Chae Rin (Hangul: 이채린) de 18, Park Bom (Hangul: 박봄) de 25, Park Sandara (박산다라) de 24 y Gong Minji (공민지) de 15, no son necesariamente un grupo de cualidades artísticas / musicales prominentes, pero sí estan bien pegajosas sus rolas, tata-tata-tattaaaa (así tararéo Yo ¿y qué pedo?).

Y aunque no son una cosa chingona como esta

Sí tienen coreografías casi iguales, se podría decir que las chamaquitas del segundo video montan las coreografías y todas esas madres para ellas.

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

Sí eres de esos a los que les fastidia doblar la ropa y que te quede chueca como a mi… Aquí tienes un artefacto para que todo sea chingón.

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

La semana pasada puse un artículo donde explícaba mi propuesta para el envío de parametros entre modelos y controladores del framework de codeigniter; ahora se me ocurrió la fabulantástica idea de hacer lo mismo, pero esta vez de la vista al controlador. Actualmente uso prototypejs para el manejo de operaciones/acciones con ajax y para los efectillos uso scriptaculous. El caso es que dejaré un ejemplo muy sencillo de como hacer esto, tanto de la vista y el script de JS así como el controlador y obviamente con el ejemplo anterior de pasar parametros como un arreglo al modelo

//MODELO
/*
*Este es el ejemplo de como el MODELO recibe parametros desde el
*controlador mediante un arreglo descriptivo
*/
<php if (!defined("BASEPATH")) { exit("No direct access allowed");}
class Getusuarios extends Model {

  function __construct(){
    parent::Model();
  } 

  function details($parametros = NULL){
    //Checo que el arreglo de parametros contenga datos
    if (is_array($parametros)){
      //Creo la sentencia SQL para extraer los datos
      $sqlUsuariosDetalle = ' SELECT * ';
      $sqlUsuariosDetalle .= ' FROM Users ';
      $sqlUsuariosDetalle .= ' WHERE uid = ? ';
      $sqlUsuariosDetalle .= ' AND dep = ? ';
      //ejecuto el query a la base de datos pasandole el arreglo que
      //viene del controlador
      $rs = $this->db->query($sqlUsuariosDetalle, $parametros);
      //checo que contenga datos
      if ($rs->num_rows() > 0){
        //en caso de que contenga datos regreso el resultado
        $result = $rs->result();
        return $result;
      //no hay datos, no regreso nada.
      } else { return FALSE; }
    //si no hay parametros, no hay consulta
    } else { return FALSE; }

  }

  function list () {
    //creo la sentencia sql para obtener los datos
    $sqlListaUsuarios = ' SELECT uid, name ';
    $sqlListaUsuarios .= ' FROM Users ';
    $sqlListaUsuarios .= ' WHERE gid >= 12 ';
    //ejecuto el query en la base de datos.
    $rs = $this->db->query($sqlListaUsuarios);
    //checo que traiga datos
    if ($rs->num_rows() > 0){
      //De tener algo, regreso el resultado
      return $rs->result();
    //Si no hay datos, regreso falso
    } else { return FALSE; }

  }
}
?>

Ahora veamos como se aplícan ambos ejemplos en el controlador, tanto para recibir parametros desde la vista con JS mandados con prototype y a su vez como manda los parametros al modelo por medio del arreglo.

//Controlador
<php if (!defined("BASEPATH")) { exit("No direct access allowed");}
class Usuarios extends Controller {

  function __construct(){
    parent::Controller();
    $this->load->model('getusuarios');
  }

  function detalles(){

    //convierto lo que viene de la cadena en un arreglo.
    $param = explode(',',$this->input->post('params'));

    if ($param[0] > -1 ) {

      $dep = $param[1]!=5?$param[1]:-1;

      $dao_params['id'] = $param[0];
      $dao_params['dep'] = $param[1];
      //envío el arreglo de parametros al modelo.
      $recordset = $this->getusuarios->details($dao_params);

      if (count($recordset) > 0) { $data['registros'] = $recordset; } else { $data['registros'] = NULL; }

      $this->load->view('user_details',$data);

    } else { $this->usuarios(); }

  }

  function lista(){

    $recordset = $this->getdepartamentos->list();

    if (count($recordset) > 0) {

      $datos = array('-1'=>"Seleccione");

      foreach($recordset as $rs){ $datos[$rs->id] = $datos[$rs->nombre_dep]; }
      $data['lista_departamentos'] = $datos;

    } else { $data['lista_departamentos'] = NULL; }

    $this->load->view('users_list',$data);
  }
}
?>
//VISTA







Próximamente me pondré a jugar con JSON para poner ejemplos, espero les ayude y les guste el post, por favor no olviden dejar su comentario.
Saludos.

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

He estado pensando acerca de unas cuantas cosas que he hecho en PHP con CodeIgniter, me dí cuenta que sí en una función de PHP recibes 1 solo parametro entre controladores y modelos te ahorras unos cuantos teclazos….

Ejemplo de caso habitual de paso de parametros entre controlador y modelo:

****Controlador*****

<?php if (! defined('BASEPATH') ) { exit ('No direct script access allowed'); end();}
class Proove extends Controller{
  function __construct(){
	parent::Controller();
	$this->load->model('proove');
  }

  function index () {$this->proove();}

  function proove ($param1, $param2, $param3 = '', $param4 = -1){
	if (empty ($param3) ) {$param3 = 'GUEST';}
	//doing amazing stuff and stunts with this params
	$var = $this->proove->get_users($param1, $param2, $param3);
	if ($var) {
	  $data['records'] = $var;
	  $this->load->view('index.php',$data);
	}
  }
}

?>

****Controlador*****

<?php if (! defined('BASEPATH') ) { exit ('No direct script access allowed'); end();}

class Proove extends Model{

  function __construct (){
	parent::Model();
  }

  function get_users ($param1, $param2, $param3){
	$sql = 'SELECT * ';
	$sql .= ' FROM users ';
	$sql .= ' WHERE type = \''.$param1.'\'';
	$sql .= ' AND kind = \''.$param2.'\'';
	$sql .= ' AND domain = \''.$param3.'\'';
	$rsproove = $this->db->query($sql);

	if ($rsproove->num_rows()){
	  return $rsproove->result();
	} else {
	  return FALSE;
	}
  }
}

?>

Okay, continuemos… PHP te permite el uso de arreglos asociativos por lo cual podríamos usar esto para el paso de parametros a las funciones que sean necesarios. Lidiar con arreglos es muchas veces enfadoso, más sí no son asociativos, por que la iteración con bucles se vuelve pesada y más sí eres principiante como Yo y no sabes como accesar bien al índice que necesitas; en cambio con un arreglo asociativo (qué para mi gusto son como un hash de perl) puedes dirigirte perfectamente al índice que quieres del arreglo con el que estas trabajando…

La idea es principalmente usar los arreglos asociativos como parametro único, de esta manera podrías solo preocuparte por saber el nombre del índice que esperas y no por n parametros y validarlos todos.

Tengamos en mente el siguiente escenario de programación. Estás usando CodeIgniter (aplicación demo sin la aplicación de esta idea aquí)

Estas haciendo una clase que tiene varios metodos, uno de ellos necesita una serie de parametros muy específicos donde todos esos parametros son requeridos; haces tu validación con JS ó con algun framework, hasta aquí todo bien, te aseguras de que los parámetros llegan perfecto al método de la clase que quieres y haces de nuevo una validación para evitar “que te metan gol”. Una vez hecho eso, entonces comienzas a escribir chingomil (muchas) líneas de código con las que harás cosas impresionantes en tu aplicación. Bueno, imagina que tiempo después de que tu aplicación ha sido liberada alguien se encuentra TAMPER DATA en los agregados de FIREFOX y lo instala en su máquina *no estoy suponiendo que alguien va a hackearte, sino que un individuo curioso con el mínimo grado de conocimientos informáticos, decide probar lo que ha leído en un manualito de 20 minutos por que tiene tiempo libre*. Entonces comienza el juego, el píca un botón y le pregunta sí quiere modificar los parametros enviados, acepta la petición y pum a menear todo. Bueno, ahí tienes que tus validaciones con JavaScript han sido fácilmente burladas. Luego ¿qué sige?, fácil, tu controlador responderá de acuerdo a como ha sido creado, tomará los parametros y jugará con ellos, lo dificil del caso es cuando expones el borrado de usuarios de una tabla ó la alteración de los mismos, ya que puedes caer fácilmente en un SQL Injection Attack o algo por el estilo.

Veámos, aquí va el truco, como no puedes impedir que el usuario sea metiche y juegue con tu trabajo, entonces lo que sigue es ir un paso adelante; puesto que la mayoría de ataques exitosos de cualquier tipo a casi cualquier tipo de sitio son debido a un error humano, pués haremos esto más divertido, tanto para la persona que curiosea la respuesta del sitio como a nosotros mismos como programadores.

CodeIgniter tiene una librería para la base de datos llamada Active Record Class así como una cosa llamada SQL Binding, ambas dos sirven para cosas que tienen que ver con la base de datos. Active Record Class sabe defenderse de SQL Injection Attack, Cross Scripting Attack y otras chucherías del tipo nada más que para mi gusto, la librería es como un diamante en bruto, falta pulirla y en lo personal no me gusta. ¿Sí eres alguien que prefiere construir los queries a mano y sentir el poder del SQL en tus manos?, entonces el siguiente párrafo es para ti, veamos:

****Controlador*****

<?php if (! defined('BASEPATH') ) { exit ('No direct script access allowed'); end();}

class Proove extends Controller{

  function __construct(){
	parent::Controller();
	$this->load->model('proove');
  }

  function index () {$this->proove();}

  function proove (){

	//El último parámetro (TRUE) en $this->input->post('variable', TRUE) protege tu entrada de XSS
	$parametros[0] = $this->input->post('param1',TRUE) == '' ? $this->input->post('param1',TRUE) : '-1' ;
	$parametros[1] = $this->input->post('param2',TRUE) == '' ? $this->input->post('param2',TRUE) : '-1' ;
	$parametros[2] = $this->input->post('param3',TRUE) == '' ? $this->input->post('param3',TRUE) : '-1' ;
	$parametros[3] = $this->input->post('param4',TRUE) == '' ? $this->input->post('param4',TRUE) : '-1' ;
	$var = $this->proove->get_users($parametros);

	if ($var) {
	  $data['records'] = $var;
	  $this->load->view('index.php',$data);
	}
  }
}

?>

****Modelo*****

<?php if (! defined('BASEPATH') ) { exit ('No direct script access allowed'); end();}

class Proove extends Model{

  function __construct (){
	parent::Model();
  }

  function get_users ($parametros){
	if (is_array($parametros)){
	  $sql = ' SELECT * ';
	  $sql .= ' FROM users ';
	  $sql .= ' WHERE type = ? ';
	  $sql .= ' AND kind = ? ';
	  $sql .= ' AND domain = ? ';

	  $rsproove = $this->db->query($sql, $parametros);

	  if ($rsproove->num_rows()){
		return $rsproove->result();
	  } else {
		return FALSE;
	  }
	} else {
	  return FALSE;
	}
  }
}
?>

Notarás que las modificaciones han sido mínimas, pero esto te da a cambio de modificar tu código un poco más de tranquilidad ya que puedes explotar la ventaja de escape de bad characters que un framework como CodeIgniter te ofrece, hay muchísimo más que publicar de esta herramienta y de otras tantas que apenas estoy conociendo y no he tenido tiempo de picar.

Espero que el artículo haya sido de interés y opines al respecto.

PHP CodeIgniter JavaScript Framework SQL Sql Injection Attack XSS

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

Learning to learn how to understand women…

When a man is marriend or even if a men its not married, just have a couple and says “I got everything under control”  its bullshit, he is a lier… But fortunately I give you one choice to translate the discussion about your wifes and women in general.

SociBook del.icio.us Digg Facebook Google Yahoo Buzz StumbleUpon
© 2012 Geekeandome Suffusion theme by Sayontan Sinha