lunes, 1 de marzo de 2010

Clase para acceso y manipulacion de datos de servidores MySql en php

El titulo es largo pero define perfectamente que hace la clase.

La clase (objeto), en cuestión es la siguiente:

 
El codigo actual es:

  
require_once 'Configuration.php';

#######################################################################################
# Class Name : MySql
# Author : Armando Ceballos
# Last Mofidy Date : 2010-02-28
# License : GPL
# Email : sarjo6 [at] gmail [dot] com
#######################################################################################

class MySql {

  /** Aggregations: */

  /** Compositions: */

   /*** Attributes: ***/

  /**
   *
   * @access private
   */
  private $mysql;

  /**
   *
   * @static
   * @access private
   */
  private static $debug = false;

  /**
   *
   * @access private
   */
  private $tablePrefix = '';


  /**
   *
   *
   * @param Configuration configuration

   * @param string db_host

   * @param string db_user

   * @param string db_pass

   * @param string db_name

   * @param int db_port

   * @return
   * @access public
   */
  public function __construct( $configuration = '',  $db_host = '',  $db_user = '',  $db_pass = '',  $db_name = '',  $db_port = 3306 ) {
      if ($configuration!=""){
            $db_host=$configuration->server;
            $db_user=$configuration->user;
            $db_pass=$configuration->password;
            $db_name=$configuration->database;
            $this->tablePrefix=$configuration->tablePrefix;
        }
        $this->mysql = @mysql_connect($db_host.":".$db_port,$db_user, $db_pass, true);
        @mysql_select_db($db_name,$this->mysql);
    if($this->debug){
            if (empty($this->mysql)){
        echo 'La información de configuracion esta incorrecta o el servidor no responde, favor de verificar los datos

'.mysql_error().'

';
            }else{
            echo "Conexion con el servidor de MySQL se a establecido
ServerHost=$db_host
";
            }
        }
  } // end of member function __construct

  /**
   *
   *
   * @param string _method

   * @param string _args

   * @return
   * @access public
   */
  public function __call( $_method,  $_args ) {
      if (isset($this->$method) === true) {
        $func = $this->$method;
        $func();
      }
  } // end of member function __call

  /**
   *
   *
   * @param string table

   * @param string columns

   * @param string values

   * @param string condition

   * @return bool
   * @access public
   */
  public function insert( $table,  $columns,  $values,  $condition = '' ) {
        if(empty($this->mysql)){
            return "Error al Insertar no se ha establecido una conexion";
        }

        // Cheka si las columnas esta vacio
        if(!$columns){
            $columns = "";
        }elseif($columns != ""){
            $columns = "('$columnas')";
        }

        // Checa si la condicion esta vacia o no
        if(!$condition){
            $condi = "";
        }elseif($condition != ""){
            $condi = " WHERE ".$condition;
        }

        $insert = $this->query("INSERT INTO ".$this->tablePrefix."$table $columns VALUES($values) $condi",$this->mysql);

        if($this->debug){
            echo "Inserccion con la cadena = Insert into $table $columns Values($values) $condi
";
            echo mysql_error();
        }
        return ($insert) ? true : false;
  } // end of member function insert

  /**
   *
   *
   * @param string table

   * @param string condition

   * @return bool
   * @access public
   */
  public function delete( $table,  $condition ) {
    if(empty($this->mysql)){
        return "Error al Borrar no se a establecido una conexion";
    }
    // Checa si la condicion esta vacia o no
    if(!$condition){
        $condi = "";
    }elseif($condition != ""){
        $condi = " WHERE ".$condition;
    }
    $delete = $this->query("DELETE FROM ".$this->tablePrefix."$table $condi",$this->mysql);

    if($this->debug){
        echo "Borrado con la cadena = Delete From $table $condi
";
    }
    return ($delete) ? true : false;
  } // end of member function delete

  /**
   *
   *
   * @param  queryid

   * @return int
   * @access public
   */
  public function howMany( $queryid ) {
    if($queryid != ""){
            $total = mysql_num_rows($queryid);
    }
    if($this->debug){
            echo "Numero = ".$total."
";
    }
    return $total;
  } // end of member function howMany

  /**
   *
   *
   * @return int
   * @access public
   */
  public function insertId( ) {
    $insert_id = mysql_insert_id($this->mysql);
    if($this->debug){
        echo "Insercion con ID = ".$insert_id."
";
    }
    return $insert_id;
  } // end of member function insertId

  /**
   *
   *
   * @param string data

   * @return string
   * @access public
   */
  public function clean( $data ) {
    $data = htmlspecialchars(stripslashes($data));
    $data = str_ireplace("script", "blocked", $data);
    $data = mysql_escape_string($data);
    return $data;
  } // end of member function clean

  /**
   *
   *
   * @param  queryid

   * @return
   * @access public
   */
  public function handle( $queryid ) {
    if($queryid != ""){
        $object = mysql_fetch_object($queryid);
        if($this->debug){
            echo "qid = $queryid
";
            echo 'obj = '.serialize($object).'

';
        }
    }
    return $object;
  } // end of member function handle

  /**
   *
   *
   * @param string string

   * @return
   * @access public
   */
  public function query( $string ) {
    if(empty($this->mysql)){
            return false;
    }
   
    $ejecucion= @mysql_query($string,$this->mysql);

    if($this->debug){
            echo "Query cadena = $string
";
    }
    return ($ejecucion) ? $ejecucion : false;
  } // end of member function query

  /**
   *
   *
   * @return
   * @access public
   */
  public function setDebug( ) {
      $this->debug=true;
  } // end of member function setDebug

  /**
   *
   *
   * @param string prefix

   * @return
   * @access public
   */
  public function setTablePrefix( $prefix ) {
      $this->tablePrefix=$prefix;
  } // end of member function setTablePrefix

    /**
   *
   *
   * @param string table

   * @param string string

   * @param string condition

   * @return bool
   * @access public
   */
  public function update( $table,  $string,  $condition ) {
      if(empty($this->mysql)){
            return "Error al Actualizar no se a establecido una conexion";
        }
                // Checa si la condicion esta vacia o no
        if(!$condition){
            $condi = "";
        }elseif($condition != ""){
            $condi = " WHERE ".$condition;
        }
        $update = $this->query("UPDATE ".$this->tablaPrefix."$table SET $string $condi",$this->mysql);
        if($this->debug){
            echo "Actualizacion con la cadena  = Update $table Set $string $condi
";
        }
        return ($update) ? true : false;
  } // end of member function update

  /**
   *
   *
   * @return
   * @access public
   */
  public function __destruct( ) {
      if(!empty($this->mysql)){
        mysql_close($this->mysql);
      }
  } // end of member function __destruct

  /**
   *
   *
   * @param  queryid

   * @return bool
   * @access public
   */
  public function move($queryid,$position){
    return (mysql_field_seek($queryid,$position));
  }// end of member function next

} // end of MySql

Como muchos proyectos usan los mismos datos de conexion repetidas veces e creado esta clase auxiliar que guarda los datos de la configuracion.

/**
 * class Configuration
 *
 */

class Configuration{

  /** Aggregations: */

  /** Compositions: */

   /*** Attributes: ***/

  /**
   *
   * @access private
   */
  private $typedb = 'mysql';

  /**
   *
   * @access private
   */
  private $server = 'localhost';

  /**
   *
   * @access private
   */
  private $user = 'root';

  /**
   *
   * @access private
   */
  private $password = '';

  /**
   *
   * @access private
   */
  private $database = '';

  /**
   *
   * @access private
   */
  private $port = 3306;

  /**
   *
   * @access private
   */
  private $tabePrefix = '';

} // end of Configuration 
 
Algunos ejemplos de como usar la clase:
/* 
 * Una tabla empleados en servidor local y base dedatos empresa
 * ejemplo
 * id | nombre
 * 0  | sarjo
 * 1  | dante
 * 2  | demia
 * 3  | esmeralda
 */

require_once 'MySQL.php';

$configuracion = new Configuracion();
$mysql = new MySql($configuracion);
//or $mysql = new MySql("",'root','contrasena','empresa');
// $puerto=3307; //aqui podria ser otro puerto del servidor que no sea el default 3306
//or $mysql = new MySql("",'root','contrasena','empresa',$puerto);

//supongamos que insertamos un dato y que el id es autonumerico y permite null
$mysql->insert('empleados', 'nombre', 'pureba');
// or incluyendolo y que las entradas sean variables
$id=666;
$name="lucifer's body";
//limpiamos la entrada
$name=$mysql->clean($name);
$mysql->insert('empleados', 'id, nombre', "'$id','$name'");
echo 'Se a gregado el id '.$mysql->insertId();

$table_name='empleados';

$mysql->update($table_name, "nombre=prueba", "id=4");

$_POST['borrar']=666;
$borrar=$_POST['borrar'];
//hasta este punto insert update y delete returnan boleano para que puedan ser usados en deciciones ejemplo
//uso de operador ternario
echo ($mysql->delete($table_name, "id=$borrar")) ? 'se Borro' : 'No se Borro';
//sin operador
if ($mysql->delete($table_name, "id=$borrar")) {
    echo 'se Borro';
}else{
    echo 'No se Borro';
}

$queryid=$mysql->query("select * from empleados");

echo 'Hay '.$mysql->howMany($queryid).' empleados son: 
';
//convertire la query en objetos y la recorrere
while ($empleado=$mysql->handle($queryid)){
    echo $empleados->id.' | '.$empleado->nombre.'


'; } $empleado=$mysql->handle($queryid); //me muevo a la ultima posicion $mysql->move($queryid, $mysql->howMany($queryid)-1); echo 'el ultimo empleado se llama: '.$empleado->nombre; /************************************ * si se quiere ver las querys como se van procesando * $mysql->setDebug(); * * si por ejemplo solo tubieras una unica base de datos te seria util identificar tablas * usando prefijos para saber a que sistema pertenecen se puede declarar un prefijo con el metodo * * $mysql->setTablePrefix('prefijo'); * * entonces las tablas a las que se insertarian en este ejemplo serian * * prefijo_empleados * * dudas comentarios y sugerencias a * sarjo6 [at] gmail [dot] com * */ ?> DESCARGA TODOS LOS ARCHIVOS
 
Cualquier duda o comentario favor de hacerlo esta clase esata bajo GPL.
Cualquier mejora o comentario estare gustoso de leerla 

sábado, 27 de febrero de 2010

La educación actual

Roger Schank es un experto en Inteligencia Artificial que investigaba cómo educar a los ordenadores y acabó descubriendo que a los humanos nos educan mal. Schank fue profesor de Ciencias de la Computación yu Psicología en la universidad de Yale y, posteriormente, director del Proyecto de Inteligencia Artificial de la misma institutión. En 1989 fue contratado por la universidad de Northwestern para crear el Instituto de Ciencias de la Educación. Ha sido también profesor en Standford y Carnegie Mellon, pero ha tenido que esperar hasta los 64 años para que una institución académica le permitiese poner en práctica sus teorías: la Escuela de Negocios de La Salle presenta en marzo una serie de másters en Internet basados en la revolucionaria visión educativa de Schank.

"Todo lo que puedas aprender se basa en la práctica. Para saber conducir un coche no tienes que estudiar cómo va el motor o por qué se mueven las ruedas"

"Las escuelas cogen las tecnologías y las arruinan. Cuando salió la televisión todas pusieron una en cada aula, pero la usaban para hacer lo mismo que antes"

Pregunta. ¿Qué piensa del actual sistema de enseñanza virtual, el e-learning?

Respuesta. Es la misma basura, pero en un sitio diferente. Las escuelas cogen las nuevas tecnologías y las arruinan. Por ejemplo, cuando salió la televisión todas pusieron una en cada aula, pero la usaban para hacer exactamente lo mismo que antes. Igual ahora con los ordenadores: ¡Oh, sí, tenemos e-learning! ¿Y qué significa? Pues que dan el mismo curso terrible, pero en línea, usando los ordenadores de forma estúpida.

P. En su página web leo: "Sólo hay dos cosas que están mal en el sistema educativo: qué enseñamos y cómo lo enseñamos". ¿Qué deberíamos enseñar?

R. A vivir, que tiene muchos aspectos, como aprender a ser un abuelo o una madre. Pero la escuela no nos lo enseña. Tampoco a tomar decisiones sobre nuestra vida, aprender valores humanos o decidir qué trabajo nos gustaría.

P. ¿Y cómo deberíamos enseñar?

R. La fórmula del profesor que da la clase magistral y los alumnos hacen exámenes no funciona. Deberíamos aprender como cuando éramos pequeños: nuestros padres no nos sentaron en una mesa y nos dijeron que nos iban a enseñar a hablar, que eso era la gramática y lo otro, el vocabulario. No. El niño habla y, cuando se equivoca, sus padres le van corrigiendo. Aprendemos conversando con los niños, usando el lenguaje.

P. Es lo que usted llama "aprender haciendo".

R. Sí: todo lo que puedas aprender está basado en la práctica. Para saber conducir un coche no tienes que estudiar cómo funciona el motor o por qué se mueven las ruedas. Toda la educación debería ser así, práctica.

P. En sus libros explica que es así como aprende la mente humana.

R. Los seres humanos tienen diferentes procesos mentales que funcionan desde que nacemos, como hacer predicciones, decidir objetivos o establecer la causa de las cosas. Si lo haces bien, triunfas en la vida. Pero en la escuela no lo enseñan. Como mucho te enseñarán la relación causa-efecto en física, pero no adaptada a la vida real. Lo que necesitamos es conocimiento práctico de por qué suceden las cosas con las que nos enfrentamos cada día de nuestras vidas.

P. ¿Pero cómo enseñar de forma práctica algo tan importante como filosofía, literatura o historia?

R. Es que no son tan importantes. Lo son para los académicos, que deciden qué debemos aprender. Si una parte de la población quiere, de acuerdo, pero no deberían obligar a todos los estudiantes del mundo a aprenderlo. Y sí, es posible estudiar historia de forma práctica, por ejemplo con una simulación que te lleve a la Revolución Francesa.

P. ¿Cómo pueden los ordenadores ayudar al "aprender haciendo"?

R. Con simulaciones más o menos elaboradas que presenten situaciones reales: tenemos este problema, cómo podría resolverse. Ni tan sólo necesitas un ordenador para esto, aunque lo facilita, ya que te permite trabajar con personas que no están en tu misma habitación. El auténtico cambio es cómo se enseña, no los instrumentos.

P. Los mejores hackers que conozco son autodidactas, ninguno ha aprendido en las universidades sino con sus ordenadores.

R. Exacto, han aprendido haciendo, como ir en bicicleta.

P. ¿Entonces, no necesitamos escuelas?

R. Por supuesto que no y deberían ser eliminadas. Las escuelas están controladas por los gobiernos, que no se preocupan de que salga de ellas gente inteligente. Todo lo contrario: quieren gente simple que no se haga muchas preguntas ni complique las cosas.

P. ¿Cómo llegó a estas conclusiones?

R. Mi campo de estudio es la inteligencia artificial, hacer a los ordenadores inteligentes. En los setenta trabajábamos muy seriamente sobre cómo los ordenadores deberían aprender. En los 80, cuando ya era un experto en educación, mis hijos entraron en la escuela. Y cuando ví lo que hacían allí me llevé las manos a la cabeza. ¡Qué forma más estúpida de aprender!

P. ¿Por qué?

R. Un ejemplo con mi hijo: a los 6 años me llegó una nota de la profesora que decía que no era bueno en matemáticas, cuando yo sabía que a los 4 ya hacía multiplicaciones. Fuí a verla y me explicó que aprendían a hacer cuentas con líneas hechas con rotuladores ¡y que mi hijo no dibujaba bien las líneas!

P. Ahora experimenta con sus nietos. Ha creado videojuegos que les enseñan matemáticas o a leer. ¿Funciona su sistema?

R. Sí. Mi decisión más importante se refiere al mayor, que tiene 8 años. Mi hija dudaba a qué escuela llevarlo. Le propuse montar una con otros padres y hoy son doce chicos en una habitación, con una profesora, que lo único que hacen es lo que les gusta a esa edad: construir trenes, coches, camiones, robots.

P. Es la misma línea que ha seguido para crear los másters de La Salle de Barcelona, haciendo que los alumnos se enfrenten no a teorías sino a situaciones simuladas de la vida real...

R. Va a cambiar el mundo. Es divertido, emocionante, algo muy nuevo. Cuando me lo propusieron pensaba que bromeaban porque hablamos de una universidad, que es parte del sistema, que me contrata para cambiar este sistema.

Visto en ELPAIS:COM