<?php

	/**

	 * MySQL Class - Manipulação e Controle

	 * 

	 * Classe para manipulação e controle

	 * do banco de dados MySQL.

	 * 

	 * @author Guilherme Quental

	 * @version 1.0

	 * @copyright GPL (C) @ 2010, QuentaLine

	 * @access public

 	 */

	class MySQL {

		/**

		 * Variáveis para uso interno

		 * @access private

		 */

		private $banco; // Endereço do banco de dados

		private $user; // Login do usuário admin do banco

		private $senha; // Senha do admin

		private $db; // Database

		private $sql; // Linha de código SQL

		private $conn; // Variável de Conexão

		private $querySql; // Retorno do query SQL;

		private $tamCampos; // Quantidade de campos

		private $nomeCampos; // Nome dos campos retornados

		private $dadosCampos = array(); // Valores dos campos retornados

		

		/**

		 * Construtor da classe

		 * @access public

		 * @param string $param1 Endereço do banco de dados

		 * @param string $param2 Login do usuário

		 * @param string $param3 Senha do usuário

		 */

		public function __construct($param1, $param2, $param3) {

			$this->banco = $param1; // Define banco

			$this->user = $param2; // Define usuário

			$this->senha = $param3; // Define senha

		}

		

		/**

		 * Método para alterar endereço do banco

		 * @param string $param Endereço do banco de dados

		 * @access public

		 */

		public function setBanco($param) {

			// Erro caso o parametro esteja vazio

			if (empty($param)) {

				throw new Exception('O seu parâmetro deve conter algum valor');

			}

			// Erro caso o parametro seja igual ao valor já inserido

			if ($this->banco == $param) {

				throw new Exception('Este endereço já está setado no banco atual');

			}

			// Teste do erro

			try {

				$this->banco = $param;

			} catch (Exception $e) {

				echo $e->getMessage();

			}

		}

		

		/**

		 * Método para alterar usuário do banco

		 * @param string $param Usuário do banco de dados

		 * @access public

		 */

		public function setUser($param) {

			// Erro caso o parametro esteja vazio

			if (empty($param)) {

				throw new Exception('O seu parâmetro deve conter algum valor');

			}

			// Erro caso o parametro seja igual ao valor já inserido

			if ($this->user == $param) {

				throw new Exception('Este já é o usuário em uso');

			}

			// Teste do erro

			try {

				$this->user = $param;

			} catch (Exception $e) {

				echo $e->getMessage();

			}

		}

		

	

		/**

		 * Método para alterar senha do banco

		 * @param string $param Senha do banco de dados

		 * @access public

		 */

		public function setSenha($param) {

			$this->senha = $param;

		}

		

		/**

		 * Método para alterar usuário do banco

		 * @param string $param Usuário do banco de dados

		 * @access public

		 */

		public function setDb($param) {

			// Erro caso o parametro esteja vazio

			if (empty($param)) {

				throw new Exception('O seu parâmetro deve conter algum valor');

			}

			// Erro caso o parametro seja igual ao valor já inserido

			if ($this->db == $param) {

				throw new Exception('Essa já é a Database que está sendo utilizada');

			}

			// Teste do erro

			try {

				$this->db = $param;

			} catch (Exception $e) {

				echo $e->getMessage();

			}

		}

		

		/**

		 * Método para setar o comando SQL

		 * @param string $param Comando SQL

		 */

		public function setSql($param) {

			// Verifica se parametro está vazio

			if (empty($param)) {

				throw new Exception('O seu parâmetro deve conter algum valor');

			}

			// Testa erro

			try {

				$this->sql = $param;

			} catch (Exception $e) {

				echo $e->getMessage();

			}

		}

		

		/**

		 * Método para conectar no banco

		 * @access public

		 */

		public function conectar() {

			// Verifica se há banco de dados

			if (empty($this->banco)) {

				throw new Exception('Insira um endereço de banco de dados');

			}

			// Verifica se o usuário foi setado

			if (empty($this->user)) {

				throw new Exception('Insira um usuário para conectar no banco');

			}

			// Testa erros

			try {

				$this->conn = @mysql_connect($this->banco, $this->user, $this->senha) or die('Não foi possível conectar');

			} catch (Exception $e) {

				echo $e->getMessage();

			} 

		}

		

		/**

		 * Método para acessar uma database

		 */

		public function selecionaDb() {

			// Verifica se foi selecionada uma DB

			if (empty($this->db)) {

				throw new Exception('Selecione uma database');

			}

			try {

				@mysql_select_db($this->db, $this->conn) or die('Não foi possível selecionar a database');

			} catch (Exception $e) {

				echo $e->getMessage();

			}

		}

		

		/**

		 * Método para executar uma query SQL

		 */

		public function query() {

			// Verifica se há comando SQL

			if (empty($this->sql)) {

				throw new Exception('Por favor, insira um comando SQL');

			}

			// Testa erro

			try {

				$this->querySql = @mysql_query($this->sql, $this->conn) or die('Não foi possível executar o comando');

			} catch (Exception $e) {

				echo $e->getMessage();

			}

		}

		

		/**

		 * Método para armazenar valores

		 */

		public function armazenarValores() {

				while ($property = mysql_fetch_field($this->querySql)) { // pega o nome dos campos

					$this->nomeCampos .= $property->name . ";"; // insere o nome dos campos

				}

				$vetorCampos = explode(";", $this->nomeCampos); // separa o nome dos campos em um vetor

				$tam = count($vetorCampos);

				while ($row = mysql_fetch_array($this->querySql)) {

					$string = "";

					for ($i = 0; $i < $tam; $i++) {

						$string .= $row[$vetorCampos[$i]] . ";"; 

					}

					$this->dadosCampos[] = $string;	

				}

			$this->tamCampos = count($this->dadosCampos) - 1; // armazena tamanho real de linhas

		}

	 

		

		

		/**

		 * Método para recuperar valor

		 * @param integer $param1 Indexação do vetor

		 * @param string $param2 Campo desejado

		 * @return string Campo escolhido

		 * @access public

		 */

		public function getCampo($param1, $param2) {

			// Verifica se parametros estão com dados

			if (empty($param2)) {

				throw new Exception('Todos os parâmetros devem conter valroes');

			}

			// Testa se parametro 1 é do tipo inteiro

			if (!(is_int($param1))) {

				throw new Exception('O parâmetro de index deve ser do tipo inteiro');

			}

			// Testa se existe a linha no vetor

			if ($param1 > $this->tamCampos) {

				throw new Exception('Não existe essa linha');

			}

			// Executa com o teste de erros

			try {

				$vetorNomes = explode(";", $this->nomeCampos);

				$vetorDados = explode(";", $this->dadosCampos[$param1]);

				$tam = count($vetorNomes);

				$verifica = false; // Boolean Verificador

				$campo;

				for ($i = 0; $i < $tam; $i++) {

					if ($param2 == $vetorNomes[$i]) {

						$verifica = true;

						$campo = $i; // Define lugar onde campo foi achado

					}

				}

				if (!$verifica) {

					throw new Exception('Não existe nenhum campo com esse nome');

				}

				try {

					$valor = $vetorDados[$campo]; // Pega campo

					return $valor;

				} catch (Exception $e) {

					echo $e->getMessage();

				}

			} catch (Exception $e) {

				echo $e->getMessage();

			}

		}

		

		/**

		 * Método para retornar quantidade de linhas

		 * @return integer $tam Quantidade de linhas

		 */

		public function quantLinhas() {

			$tam = count($this->dadosCampos);

			return $tam; 

		}

		

			/**

		 * Método para retornar quantidade de colunas

		 * @return integer $tam Quantidade de colunas

		 */

		public function quantColunas() {
			$vetorNomes = explode(";", $this->nomeCampos);

			$tam = count($vetorNomes) - 1;

			return $tam; 

		}

	}



?>