Publicidad

PDO y PHP, clase de acceso a datos - PDOClass.php


Por Alex el 14/11/2020, Comentar el artículo

Comparte este artículo:      




Os dejo una clase para trabajar desde PHP y bases de datos con PDO. El funcionamiento es muy sencillo recibe un array con datos y devuelve un array con los resultas. A continuación explico el funcionamiento ...


Los archivos estan en el github y los podéis descargar desde esta url:

https://github.com/depruebas/PDOManager

  • PDOClass.php, clase de acceso a datos a través de PDO para cualquier base se datos que disponga de drivers
  • ExampPDO.php, script de ejemplo para probar la clase.

PDO es un driver genérico de acceso a bases de datos desde PHP, en esta URL tenéis el listado de drivers PDO que hay disponibles.

A continuación describo los métodos de la clase, y explico el ejemplo, seguidamente la clase en profundidad.

La clase PDOClass tiene cuatro métodos:
  • Connection, recibe un array con los datos de conexión y devuelve una conexión a la base de datos.
    Los datos de conexión se pasan como el Array de muestra.:
    
      $config = array(
        'dsn' => 'mysql:host=localhost;dbname=sakila;charset=utf8',
        'username' => 'devuser',
        'password' => 'mysql',
      );
    
  • Execute, ejecuta sentencias como insert, update o delete y devuelve el numero de registros actualizados. Recibe un array con la siguiente estructura:
    
    $data['connection'] = $conn['data'];
    $data['query'] = "delete From staff where staff_id = ?";
    $data['params'] = array( '10');
    
  • ExecuteQuery, ejecuta sentencias select y devuelve un array con el resultado de la consulta y el número de registros. Recibe un array con la siguiente estructura:
    
    $data['connection'] = $conn['data'];
    $data['query'] = "Select staff_id, first_name, last_name, email, username, password From staff";
    $data['params'] = array();
    
  • Insert, para insertar datos de forma rápida, recibe un array con la siguiente estructura:
    
    $data['connection'] = $conn['data'];
    $data['table'] = "staffi";
    $data['fields'] = array (
      'first_name' => 'Juan',
      'last_name' => 'Sin Miedo288',
      'address_id' => 1,
      'store_id' => 2,
      'username' => 'juan',
    );
    

PHP de ejemplo ExampPDO.php

El ejemplo es un script de linea de comando que se ejecuta de la siguiente forma:

php ExampPDO.php insert|select|update|delete
Para el ejemplo he utilizado la base de datos de ejemplo de MySql, concretamente la base de datos sakila y la tabla staff

El código esta en el github lo podéis ver, descargar y probar.

Con el ejemplo podemos lanzar una de las cuatro opciones que acepta insert|select|update|delete. Aunque con el método Execute de la clase se puede ejecutar cualquier sentencia SQL, desde un insert a un create table.

Clase PDOClass.php

A continuación pego el código de la clase PDOClass.php que esta comentado linea a linea. Os la podeis descargar del github.

class PDOClass
{

  # Ruta para dejar los logs cuando se generan errores, por defecto el directorio de trabajo
  static protected $pathLogs = './';

  function __construct() {}

  # Función para obtener la conexión a la bse de datos
  public static function Connection( $config = array())
  {

    # Si el array de configuración viene vacio devolvemos 
    # un error y lo guardamos en el LOG
    if ( empty( $config))
    {
      # Si el array de configuracion viene vacio devolvemos un 
      # error y lo grabamos en el fichero de errores.
      error_log( date("Y-m-d H:i:s") . " - Config file empty \n", 3, static::$pathLogs."db_error.log");
      $return = array(
        'success' => false,
        'data' => 'Config file empty',
      );
      return ( array( 'success' => false, 'data' => $return));
    }

    try 
    {
      # Realizamos la conexión a la base de datos con los datos del array
      $conn = new PDO( $config['dsn'], $config['username'], $config['password']);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      # Devolvemos success=true y la conexión a la base de datos
      return ( array( 'success' => true, 'data' => $conn));

    } 
    catch (PDOException $e)
    {
      # Si obtenemos un error lo escribimos en un log de errores 
      # y devolvemos success=false y el error
      $_error = print_r( $e->getTrace(), true) . "\n" . $e->getMessage();

      error_log( date("Y-m-d H:i:s") . " - " . $_error . "\n", 3, static::$pathLogs."db_error.log");
      $return = array(
        'success' => false,
        'data' => $_error,
      );
      return ( array( 'success' => false, 'data' => $return));
    }

  }

  # Función para ejecutar consultas (select)
  # Recibe un array de parametros:
  # 
  #    $data['connection'] = Conexion;
  #    $data['query'] = Consulta;
  #    $data['params'] = Array de parametros;
  #
  public static function ExecuteQuery( $params = array())
  {
    # Recibimos la conexión por parametro y la ponemos en una variable
    $db_conn = $params['connection'];

    try
    {
      # Preparamos la sentencia que queremos ejecutar que se 
      # pasa en el array params
      $stmt = $db_conn->prepare( $params['query']);

      # Asignamos los parametros a la sentecia. Si no tiene parametros 
      # tendriamos que pasar un array vacio ( array() )
      $stmt->execute( $params['params'] );

      # Ejecutamos la sentencia y devuelve el resultado en la variable $data
      $data = $stmt->fetchAll( PDO::FETCH_ASSOC);

      # Devuelve en la variable $count el numero de filas afectadas
      $count = $stmt->rowCount();

      # Cerramos el cursor
      $stmt->closeCursor();

      # Asignamos a una variable los datos que vamos a devolver a la llamada
      $return = array( 'success' => true, 'data' => $data, 'count' => $count);
    }
    catch (PDOException $e)
    {
      # Si hay error lo guardamos en un fichero y devolvemos success = false 
      # y los datos del error
      # 
      $_error = print_r( $e->getTrace(), true) . "\n" . $e->getMessage();

      error_log( date("Y-m-d H:i:s") . " - " . $_error . "\n", 3, static::$pathLogs."db_error.log");
      $return = array(
        'success' => false,
        'data' => $_error,
      );
    }

    # Limpiamos variables utilizadas
    unset ( $stmt);
    unset( $db_conn);

    # Devolvemos el resultado.
    return ( $return);
  }


  # Función para ejecutar sentencias (insert/update/delete) o 
  # cualquiera que no sea una select
  #
  # Recibe un array de parametros
  #   $data['connection'] = Conexion;
  #   $data['query'] = Sentencia a ejecutar;
  #   $data['params'] = Array de parametros;
  #
  public static function Execute( $params = array())
  {
    # Recibimos la conexión por parametro y la ponemos en una variable
    $db_conn = $params['connection'];

    try
    {
      # Preparamos la sentencia que queremos ejecutar que se 
      # pasa en el array params
      $stmt = $db_conn->prepare( $params['query']);

      # Asignamos los parametros a la sentecia. Si no tiene parametros 
      # tendriamos que pasar un array vacio ( array() )
      $stmt->execute( $params['params'] );

      # Devuelve en la variable $count el numero de filas afectadas
      $count = $stmt->rowCount();


      # Asignamos a una variable los datos que vamos a devolver a la llamada
      $return = array( 'success' => true, 'count' => $count);
    }
    catch (PDOException $e)
    {
      # Si hay error lo guardamos en un fichero y devolvemos 
      # success = false y los datos del error
      # 
      $_error = print_r( $e->getTrace(), true) . "\n" . $e->getMessage();

      error_log( date("Y-m-d H:i:s") . " - " . $_error . "\n", 3, static::$pathLogs."db_error.log");
      $return = array(
        'success' => false,
        'data' => $_error,
      );
    }

    # Limpiamos variables utilizadas
    unset ( $stmt);
    unset( $db_conn);

    # Devolvemos el resultado.
    return ( $return);

  }

  # Funcion para grabar datos (insert) 
  # Recibe un array de parametros
  #     $data['connection'] = $conn['data'];
  #     $data['table'] = "staff";
  #     $data['fields'] = array (
  #           'first_name' => 'Juan',
  #           'last_name' => 'Sin Miedo288',
  #           'address_id' => 1,
  #           'store_id' => 2,
  #           'username' => 'juan',
  #         ); 
  #
  #  En el campo fields hay un array de parametros a insertar
  #
  #      'first_name' => 'Juan',
  #
  #  El valor de la izquierda first_name es un nombre del 
  #  campo de la base de datos y el valor
  #  de la derecha en el valor de ese campo

  public static function Insert( $params = array())
  {
    # Inicializamos las variables que vamos a utilizar
    $fields = $fields_values = $a_values = "";

    # Recorremos la variable que tienen los campos de la tabla 
    # y asignamos el par field = valor
    foreach ( $params['fields'] as $key => $value) 
    {
      $fields .= $key . ",";
      $fields_values .= " ?,";
      $a_values .= $value . ".:.";
    }

    # Eliminamos los valores finales que no necesitamos en la consulta insert
    $fields  = substr( $fields, 0, strlen( $fields) - 1);
    $fields_values  = substr( $fields_values, 0, strlen( $fields_values) - 1);
    $a_values  = substr( $a_values, 0, strlen( $a_values) - 3);


    # Recibimos la conexión por parametro y la ponemos en una variable
    $db_conn = $params['connection'];

    try
    {
      # Creamos la sentencia Insert con los datos variables de la tabla, campos y valores
      $sql = "insert into " . $params['table'] . "( {$fields} ) values( ".$fields_values." )";

      # Preparamos la consulta que ejecutaremos
      $stmt = $db_conn->prepare( $sql);

      # Ejecutamos la consulta con los valores en un array
      $r = $stmt->execute( explode( ".:.", $a_values));

      # Guardamos los valores de las filas afectadas
      $count = $stmt->rowCount();

      # Creamos la variable que vamos a devolver.
      $return = array( 'success' => true, 'count' => $count);

    } 
    catch (PDOException $e)
    {

      # Si hay error lo guardamos en un fichero y devolvemos 
      # success = false y los datos del error
      #
      $_error = print_r( $e->getTrace(), true) . "\n" . $e->getMessage();

      error_log( date("Y-m-d H:i:s") . " - " . $_error . "\n", 3, static::$pathLogs."db_error.log");
      $return = array(
        'success' => false,
        'data' => $_error,
      );

    }

    # Limpiamos variables utilizadas
    unset( $stmt);
    unset( $db_conn);

    # Devolvemos el resultado.
    return ( $return );

  }

}
Y esto es todo, y feliz programming
Saludos
Alex.



Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.