db.class.php 2.19 KB
<?php
/**********************************************************************************
 Sistema e-SIC Livre: sistema de acesso a informação baseado na lei de acesso.
 
 Copyright (C) 2014 Prefeitura Municipal do Natal
 
 Este programa é software livre; você pode redistribuí-lo e/ou
 modificá-lo sob os termos da Licença GPL2.
***********************************************************************************/

class DB {
	private static $mysqli;
	private static $rs; // Último resultado
	private static $query; // Última query
	private function __construct() {}
	
	static function conn() {
		if (!self::$mysqli) {
			self::$mysqli = new mysqli('p:'.DBHOST, DBUSER, DBPASS, DBNAME);
		}

		if (mysqli_connect_errno()) {
			printf("Conexão ao banco de dados falhou.");
			error_log(mysqli_connect_error());
			exit();
		}

		return self::$mysqli;
	}
	
	// Escapa os caracteres especiais, evitando injeção de SQL e HTML:
	static function esc($param) {
		return mysqli_real_escape_string(self::conn(), htmlentities($param));
	}
	
	static function execQuery($query, $style = MYSQLI_USE_RESULT) {
		$rs = self::conn()->query($query, $style);
		if ($rs === false) {
			error_log(self::conn()->error);
			error_log(self::conn()->stat());
			error_log("Comando em execucao? Tentando liberar.");
			error_log("Query anterior: ".self::$query);
			error_log("Nova chamada:");
			error_log(debug_backtrace()[0]['file']);
			error_log(debug_backtrace()[0]['line']);
			error_log($query);

			try {
				self::conn()->store_result();
				self::$rs->free();
			} catch(Exception $e) {
				error_log("Falha ao liberar conexão ao banco de dados: ".$e);
			};
			$rs = self::conn()->query($query, $style);
			if ($rs === false) {
				error_log(self::conn()->error);
				error_log(self::conn()->stat());
			}
		} else {
			self::$rs = $rs;
			self::$query = $query." (".debug_backtrace()[0]['file'].": ".debug_backtrace()[0]['line'].")";
		}
		return self::$rs;
	}
	
	static function rs_to_array($result, $numass=MYSQL_BOTH) {
		$got = array();
	
		if(mysqli_num_rows($result) == 0)
		return $got;
	
		mysqli_data_seek($result, 0);
	
		while ($row = mysqli_fetch_array($result, $numass)) {
			array_push($got, $row);
		}
	
		return $got;
	}
}
?>