Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre todos los metodos necesarios para usar CRUD, preparense que tenemos para rato.

Anuncios

Para comenzar iremos al archivo Database.php que creamos en el post anterior y dentro de la clase iremos agregando los metodos que necesitaremos para utilizar a CRUD, comencemos con el metodo raw y para ello agregaremos el siguiente bloque:

        public function raw($sql)
        {
                return $this->query($sql);
        }
Anuncios

Este va a ser el metodo mas simple dado que en el atributo del metodo recibiremos el query como tal y devolveremos el resultado de este query, pasemos a agregar el siguiente metodo:

	public function select($sql,
				$array = array(),
				$fetchmode = PDO::FETCH_OBJ,
				$clase = '')
	{
		if (strtolower(substr($sql,0,7)) != 'select ')
			$sql = "SELECT " . $sql;

		$stmt = $this->prepare($sql);

		foreach($array as $clave => $valor)
		{
			if (is_int($valor))
			{
				$stmt->bindValue("$clave",
					$valor, PDO::PARAM_INT);
			} else {
				$stmt->bindValue("$clave", $valor);
			}
		}

		$stmt->execute();

		if ($fetchmode == PDO::FETCH_CLASS)
		{
			return $stmt->fetchAll($fetchmode, $clase);
		} else {
			return $stmt->fetchAll($fetchmode);
		}
	}
Anuncios
Anuncios

En este metodo tenemos varios parametros, el primero sera para el query que ejecutaremos, luego tenemos un array que sera usado para identificar con las columnas del resultado pero tiene un valor predeterminado con un array vacio y ya veremos porque, el siguiente parametro establece como sera el modo de recuperacion de los datos y al igual que el anterior tiene un valor predeterminado haciendolo opcionales, y el ultimo es para especificar una clase que podemos usar junto al modo de recuperacion del argumento anterior, tambien es opcional, lo siguiente es una condicional donde extraeremos la parte inicial de sql y lo convertiremos en minusculas para verificar que no posea a «select «, en caso de no tenerlo se lo agregamos de lo contrario seguimos con nuestro codigo.

Anuncios
Anuncios

Lo siguiente sera preparar al query y esto lo almacenaremos en la variable stmt, lo siguiente es un bucle donde pasaremos por los parametros que pasemos en array, por esta razon le asignamos un valor predeterminado de un array vacio, y a su vez el valor almacenado en clave lo pasamos a valor, luego tenemos un condicional donde verificamos si valor es un valor de tipo int, en caso de ser asi unimos el valor con una clave pero le informamos que el valor es tipo int, en caso contrario hacemos lo mismo pero el codigo lo interpreta como string, luego lo ejecutamos y si le unimos algunas claves del resultado del parametro array nos ayuda a segurizar el query evitando se ingresen inyecciones de comandos, para finalizar tenemos un condicional donde verifica si el modo de recuperacion es igual a FETCH_CLASS, donde devolvera una nueva instancia en base a la clase informada, haciendo corresponder las columnas del conjunto de resultados con los nombres de las propiedades de la clase, en caso contrario simplemente devolveremos el resultado como se ejecuto, agreguemos el siguiente metodo:

        public function insert($tabla, $datos)
        {
                ksort($datos);

                $nombreCampos = implode(',', array_keys($datos));
                $valoresCampos = ':' . implode(', :', array_keys($datos));

                $stmt = $this->prepare("INSERT INTO $tabla ($nombreCampos)"
                                        . " VALUES ($valoresCampos)");
                foreach($datos as $clave => $valor)
                        $stmt->bindValue(":$clave", $valor);

                $stmt->execute();
                return $this->lastInsertId();
        }
Anuncios
Anuncios

En este metodo recibiremos dos argumentos, el primero representa a la tabla y el siguiente a un array de datos que ingresaremos a la tabla, lo primero que haremos sera ordenar los datos en el array informado por medio de ksort, se encarga de ordenar el array por la clave, las siguientes dos lineas las usaremos para primero extraer todas las claves en el argumento datos en conjunto con la coma y todo almacenado en una variable llamada nombreCampos, la siguiente hace exactamente lo mismo pero con los valores relacionados a las claves, tiene un caracter mas pero es similar al anterior, con estas dos variables preparamos el query de ingreso y usaremos las variables anteriores, lo siguiente sera pasar todos los valores de datos y luego unirlos a la variable donde preparamos el query, por ultimo lo ejecutamos y devolvemos el ultimo id que se ingreso, lo cual es util cuando necesitamos la clave primaria inmediatamente despues de que se haya terminado la insercion, pasemos a agregar el siguiente metodo:

	public function update($tabla, $datos, $where)
	{
		ksort($datos);

		$detallesCampo=null;
		foreach($datos as $clave => $valor)
			$detallesCampo .= "$clave = :$clave,";
		$detallesCampo=rtrim($detallesCampo, ',');

		$detallesWhere=null;
		$i = 0;
		foreach($where as $clave => $valor)
		{
			if ($i==0)
			{
				$detallesWhere .= "$clave = :$clave";
			} else {
				$detallesWhere .= " AND $clave = :$clave";
			}
			$i++;
		}
		$detallesWhere = ltrim($detallesWhere, ' AND ');

		$stmt = $this->prepare("UPDATE $tabla SET $detallesCampo"
					. " WHERE $detallesWhere");

		foreach($datos as $clave => $valor)
			$stmt->bindValue(":$clave", $valor);

		foreach($where as $clave => $valor)
			$stmt->bindValue(":$clave", $valor);

		$stmt->execute();
		return $stmt->rowCount();
	}
Anuncios
Anuncios

En este caso recibiremos tres argumentos, la tabla que modificaremos, un array para los datos nuevos y el ultimo sera un array que usaremos para la o las condiciones, al igual que el metodo anterior ordenaremos los datos por medio de ksort, primero crearemos una variable para almacenar los datos, despues por medio de un bucle pasaremos por el array datos y lo agregaremos a la variable antes creada, por ultimo limpiaremos todos los espacios blancos ubicados a la derecha de este, lo siguiente sera crear un variable pero que usaremos para el where, en este caso iniciamos una variable que usaremos como contador, luego pasaremos por toda la variable where donde primero chequearemos si la variable i es igual a 0, si se cumple agregaremos la clave o campo y el valor, en caso contrario haremos lo mismo pero agregaremos un AND, esto es debido a que la primera condicion es para el primer valor a verificar, y los siguientes seran complemento al primero, observen como incrementamos el valor de i.

Anuncios
Nota: 
Si se preguntan por el operador .= equivale a hacer var = var . nuevo
Anuncios

Por ultimo al valor final le limpiamos todos los espacios en blanco a la izquierda en lugar de la derecha, lo siguiente es la preparacion del query para actualizar, por ultimo tenemos dos bucles donde primero uniremos los valores para los campos y luego para la condicion WHERE, finalmente lo ejecutamos y por ultimo devolvemos la cantidad de filas que afectaron, agreguemos el siguiente metodo:

	public function delete($tabla, $where, $limite = 1)
	{
		ksort($where);

		$detallesWhere=null;
		$i = 0;
		foreach($where as $clave => $valor)
		{
			if ($i==0)
			{
				$detallesWhere .= "$clave = :$clave";
			} else {
				$detallesWhere .=" AND $clave = :$clave";
			}
			$i++;
		}
		$detallesWhere = ltrim($detallesWhere, ' AND ');

		if (is_numeric($limite))
			$limitauso = "LIMIT $limite";

		$query = "DELETE FROM $tabla WHERE $detallesWhere $limitauso";

		$stmt = $this->prepare("DELETE FROM $tabla " . 
					"WHERE $detallesWhere $limitauso");

		foreach($where as $clave => $valor)
		{
			$stmt->bindValue(":$clave", $valor);
		}

		$stmt->execute();
		return $stmt->rowCount();
	}
Anuncios

Este metodo nos permite borrar los elementos de la tabla, para este recibiremos tres argumenos:

  • tabla, para informar la tabla
  • where, array para las condiciones
  • limite, establece el limite de registros a borrar si queres anularlo pasa un null
Anuncios
Anuncios

La primera parte es muy similar a lo visto en el metodo anterior, primero ordenamos los elementos de where, luego tenemos una variable para almacenarlos, lo siguiente es un bucle que trabaja exactamente de la misma forma al metodo update inclusive eliminamos los espacios en blanco a la izquierda, despues tenemos un condicional donde verifica que limite sea un numero en caso de ser cierto establece un valor para la variable limitauso, que no sera otra que un LIMIT para el query, despues preparamos nuestro query para eliminar los elementos con todas las variables que definimos anteriormente, para luego unir los valores de la condicion en where, por ultimo lo ejecutamos y al igual que en el caso anterior devolvemos la cantidad de filas afectadas, pasemos a agregar el ultimo metodo:

        public function truncate($tabla)
        {
                return $this->exec("TRUNCATE TABLE $tabla");
        }
Anuncios

Este metodo recibe el nombre de la tabla y simplemente usa un exec para ejecutar el query que le pasamos para eliminar a la tabla, con esto tenemos la nueva clase terminada y con todas las opciones de CRUD habilitadas, veamos el codigo final hasta este momento:

Database.php

<?php 

namespace App\Helpers;
use PDO;

class Database extends PDO
{
	protected static $instancias = array();

	public static function get($config)
	{
		$tipo=$config['db_tipo'];
		$host=$config['db_host'];
		$nombre=$config['db_nombre'];
		$usuario=$config['db_usuario'];
		$clave=$config['db_clave'];

		$id="$tipo.$host.$nombre.$usuario.$clave";

		if (isset(self::$instancias[$id]))
			return self::$instancias[$id];

		$instancia = new Database("$tipo:host=$host;dbname=$nombre;"
				. "charset=utf8",
				$usuario,
				$clave);
		$instancia->setAttribute(PDO::ATTR_ERRMODE,
						PDO::ERRMODE_EXCEPTION);
		self::$instancias[$id] = $instancia;
		return $instancia;
	}

        public function raw($sql)
        {
                return $this->query($sql);
        }

	public function select($sql,
				$array = array(),
				$fetchmode = PDO::FETCH_OBJ,
				$clase = '')
	{
		if (strtolower(substr($sql,0,7)) != 'select ')
			$sql = "SELECT " . $sql;

		$stmt = $this->prepare($sql);

		foreach($array as $clave => $valor)
		{
			if (is_int($valor))
			{
				$stmt->bindValue("$clave",
					$valor, PDO::PARAM_INT);
			} else {
				$stmt->bindValue("$clave", $valor);
			}
		}

		$stmt->execute();

		if ($fetchmode == PDO::FETCH_CLASS)
		{
			return $stmt->fetchAll($fetchmode, $clase);
		} else {
			return $stmt->fetchAll($fetchmode);
		}
	}

        public function insert($tabla, $datos)
        {
                ksort($datos);

                $nombreCampos = implode(',', array_keys($datos));
                $valoresCampos = ':' . implode(', :', array_keys($datos));

                $stmt = $this->prepare("INSERT INTO $tabla ($nombreCampos)"
                                        . " VALUES ($valoresCampos)");
                foreach($datos as $clave => $valor)
                        $stmt->bindValue(":$clave", $valor);

                $stmt->execute();
                return $this->lastInsertId();
        }

	public function update($tabla, $datos, $where)
	{
		ksort($datos);

		$detallesCampo=null;
		foreach($datos as $clave => $valor)
			$detallesCampo .= "$clave = :$clave,";
		$detallesCampo=rtrim($detallesCampo, ',');

		$detallesWhere=null;
		$i = 0;
		foreach($where as $clave => $valor)
		{
			if ($i==0)
			{
				$detallesWhere .= "$clave = :$clave";
			} else {
				$detallesWhere .= " AND $clave = :$clave";
			}
			$i++;
		}
		$detallesWhere = ltrim($detallesWhere, ' AND ');

		$stmt = $this->prepare("UPDATE $tabla SET $detallesCampo"
					. " WHERE $detallesWhere");

		foreach($datos as $clave => $valor)
			$stmt->bindValue(":$clave", $valor);

		foreach($where as $clave => $valor)
			$stmt->bindValue(":$clave", $valor);

		$stmt->execute();
		return $stmt->rowCount();
	}

	public function delete($tabla, $where, $limite = 1)
	{
		ksort($where);

		$detallesWhere=null;
		$i = 0;
		foreach($where as $clave => $valor)
		{
			if ($i==0)
			{
				$detallesWhere .= "$clave = :$clave";
			} else {
				$detallesWhere .=" AND $clave = :$clave";
			}
			$i++;
		}
		$detallesWhere = ltrim($detallesWhere, ' AND ');

		if (is_numeric($limite))
			$limitauso = "LIMIT $limite";

		$query = "DELETE FROM $tabla WHERE $detallesWhere $limitauso";

		$stmt = $this->prepare("DELETE FROM $tabla " . 
					"WHERE $detallesWhere $limitauso");

		foreach($where as $clave => $valor)
		{
			$stmt->bindValue(":$clave", $valor);
		}

		$stmt->execute();
		return $stmt->rowCount();
	}

        public function truncate($tabla)
        {
                return $this->exec("TRUNCATE TABLE $tabla");
        }
}
Anuncios

En resumen, hoy hemos completado todos los metodos que necesitamos para utilizar a CRUD, hemos visto metodo por metodo como trabaja y que tarea hace cada uno, muy pronto lo veremos en accion, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50