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