<?php

// clase para conectarse a la base de datos y ejecutar consultas PDO
class Base {

	private $_host = DB_HOST;
	private $_user = DB_USER;
	private $_password = DB_PASSWORD;
	private $_database = DB_DATABASE;

	private $_dbh;
	private $_stmt;
	private $_error;

	public function __construct() {
		// Configurar conexi�n
		$dsn = 'mysql:host='.$this->_host.';dbname='.$this->_database;
		$options = array (
			PDO::ATTR_PERSISTENT => true,
			PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
		);
		// Crear instancia de PDO
		try {
		
			$this->_dbh = new PDO($dsn, $this->_user, $this->_password, $options);
			$this->_dbh->exec('set names utf8');
		} catch (PDOException $e) {
			$this->_error = $e->getMessage();
			echo $this->_error;
		}
	}

	// Preparar consulta
	public function query($sql, $params = []) {
		$this->_stmt = $this->_dbh->prepare($sql);
		if (!empty($params)) {
			foreach ($params as $key => $value) {
				$this->bind($key+1, $value);
			}
		}
		return $this->_stmt;
	}

	// Vincular consulta con bind
	public function bind($parameter, $value, $type = null) {
		if(is_null($type)) {
			switch(true) {
				case is_int($value):
					$type = PDO::PARAM_INT;
					break;
				case is_bool($value):
					$type = PDO::PARAM_BOOL;
					break;
				case is_null($value):
					$type = PDO::PARAM_NULL;
					break;
				default:
					$type = PDO::PARAM_STR;
					break;
			}
		}
		$this->_stmt->bindValue($parameter, $value, $type);
	}

	// Ejecuta la consulta
	public function execute() {
		return $this->_stmt->execute();
	}

	// Obtener los registros como array numerico
	public function rows() {
		$this->execute();
		return $this->_stmt->fetchAll(PDO::FETCH_OBJ);
	
	}
	// Obtener los registros como array asociativo 
	public function rows_assoc() {
		$this->execute();
		return $this->_stmt->fetchAll(PDO::FETCH_ASSOC);
	
	}
	
	// Obtener un solo registro
	public function row() {
		$this->execute();
		return $this->_stmt->fetch(PDO::FETCH_OBJ);
	}

	// Obtener cantidad de filas con el m�todo rowCount
	public function rowCount() {
		
		return $this->_stmt->rowCount();
	}

	// Obtener el ultimo registro ingresado
	public function LastInsertId(){
		return $this->_stmt = $this->_dbh->lastInsertId();
	}
	
	//Obtener cantidad de filas con el m�todo fetchColum
	public function fetchColumn() {
		return $this->_stmt->fetchColumn();
	}
	//Obtener un solo dato dentro de un arreglo

	public function fetchCount(){
		$this->execute();
		return $this->_stmt->fetchAll(PDO::FETCH_COLUMN,0);

	}
}

?>
