hunternh 2 Denunciar post Postado Janeiro 9, 2008 Para começar crie a seguinte estrutura de pastas: pasta_raiz_do_site/trace pasta_raiz_do_site/layers pasta_raiz_do_site/config A primeira classe é a de conexão: pasta_raiz_do_site/config/Conexao.php essa classe trabalha com os bancos MySQL, PostgreSQL e MSSQL e já implementa trasações (vide exemplos posteriores) <?php require_once("Config.php"); require_once("Trace.php"); require_once(dirname(dirname(realpath(__FILE__))) . "/layers/ExceptionsLayer.php"); /** * Classe de conexão com o banco de dados * @version 1.3 * @author Wagner Brandão Soares */ class Conexao { /** * Constante para configurar o banco de dados PostgreSQL */ const POSTGRESQL = 1001; /** * Constante para configurar o banco de dados MySQL */ const MYSQL = 1002; /** * Constante para configurar o banco de dados MS SQL Server */ const MSSQL = 1003; /** * Variável para configurar o tipo de banco de dados */ private $tipoBanco; /** * Variável para guardar a conexão */ private $conexao; /** * Instância para escrever no trace */ private $trace; /** * Variável para guardar o resultado das instruções SQL */ private $resultado; /** * Variável para retornar a quantidade de linhas afetadas pela instrução SQL. */ private $affectedRows; /** * Variável para retornar o status da transação. */ private $errorTransaction; /** * Construtor da classe Conexao */ public function __construct() { //inicia a variável que retorna as linhas afetadas na consulta $this->affectedRows = 0; // inicia a variável de status da transação $this->errorTransaction = false; //cria uma nova instância do trace $this->trace = new Trace(get_class($this)); $this->trace->escreveTrace("Inicio do construtor-Conexao"); //seleciona o tipo de banco de dados que será utilizado $this->tipoBanco = Config::TIPO_BANCO; //switch para executar a conexão com o tipo de banco de dados selecionado no arquivo de configuração switch($this->tipoBanco) { case self::POSTGRESQL: { $this->trace->escreveTrace("Conectando-se com servidor - PostgreSQL."); $this->conexao = @pg_connect("host=" . (Config::HOST) . " port=" . (Config::PORTA) . " dbname=" . (Config::BASE) . " user=" . (Config::USUARIO) . " password=" . (Config::SENHA)); if(is_bool($this->conexao) && !$this->conexao) { //se houver algum erro na conexão o mesmo será escrito no trace $this->trace->escreveTrace("Erro ao tentar conectar-se com o servidor ou com a base - PostgreSQL."); $this->blnErro = true; //essa mensagem será retornada ao usuário throw new ExceptionsLayer("Não foi possível conectar-se com a base de dados.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Conexão efetuada com sucesso - PostgreSQL."); } } break; case self::MYSQL: { $this->trace->escreveTrace("Conectando-se com servidor - MySQL."); $this->conexao = @mysql_connect(Config::HOST.((Config::PORTA != "")?":".Config::PORTA:""),Config::USUARIO,Config::SENHA); if((mysql_errno() == 2003) || (mysql_errno() == 2005)) { //se houver algum erro na conexão o mesmo será escrito no trace $this->trace->escreveTrace("Erro ao tentar conectar-se com o servidor - MySQL. (" . mysql_error() . ")"); $this->blnErro = true; //essa mensagem será retornada ao usuário throw new ExceptionsLayer("Não foi possível conectar-se com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } else if((mysql_errno() == 1044) || (mysql_errno() == 1045)) { //se houver algum erro na conexão o mesmo será escrito no trace $this->trace->escreveTrace("Erro de autenticação com o servidor - MySQL. (" . mysql_error() . ")"); $this->blnErro = true; //essa mensagem será retornada ao usuário throw new ExceptionsLayer("Não foi possível conectar-se com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Conexão efetuada com sucesso - MySQL."); $acessaBase = @mysql_select_db(Config::BASE,$this->conexao); if(is_bool($acessaBase) && !$acessaBase) { //se houver algum erro na conexão com a base de dados o mesmo será escrito no trace $this->trace->escreveTrace("Erro ao tentar conectar-se com a base de dados - MySQL. (" . mysql_error($this->conexao) . ")"); $this->blnErro = true; //no mysql a conexão com a base é feita separadamente da conexão, //mas se houver algum erro será retornado o mesmo da conexão para o usuário throw new ExceptionsLayer("Não foi possível conectar-se com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } } } break; case self::MSSQL: { $this->trace->escreveTrace("Conectando-se com servidor - MSSQL."); $this->conexao = @mssql_connect(Config::HOST.((Config::PORTA != "")?",".Config::PORTA:""),Config::USUARIO,Config::SENHA); if(is_bool($this->conexao) && !$this->conexao) { //se houver algum erro na conexão o mesmo será escrito no trace $this->trace->escreveTrace("Erro ao tentar conectar-se com o servidor - MSSQL. (" . mssql_get_last_message() . ")"); $this->blnErro = true; //essa mensagem será retornada ao usuário throw new ExceptionsLayer("Não foi possível conectar-se com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Conexão efetuada com sucesso - MSSQL."); $acessaBase = @mssql_select_db(Config::BASE,$this->conexao); if(is_bool($acessaBase) && !$acessaBase) { //se houver algum erro na conexão com a base de dados o mesmo será escrito no trace $this->trace->escreveTrace("Erro ao tentar conectar-se com a base de dados - MSSQL. (" . mssql_get_last_message() . ")"); $this->blnErro = true; //no mssql a conexão com a base é feita separadamente da conexão, //mas se houver algum erro será retornado o mesmo da conexão para o usuário throw new ExceptionsLayer("Não foi possível conectar-se com o servidor.",ExceptionsLayer::CONNECTION_ERROR); return; } } } break; default: break; } //inicia resultado $this->resultado = null; $this->trace->escreveTrace("Fim do construtor-Conexao"); } /** * executeQuery() * Método para executar uma consulta na base de dados */ public function executeQuery($_stringSQL) { $this->trace->escreveTrace("Inicio da função executeQuery-Conexao"); //switch para executar uma instrução SELECT com o tipo de //banco de dados selecionado no arquivo de configuração switch($this->tipoBanco) { case self::POSTGRESQL: { if(is_array($_stringSQL)) { @pg_query($this->conexao, "START TRANSACTION"); for($i = 0; $i < count($_stringSQL); $i++) { //executa a consulta $this->resultado = @pg_query($this->conexao, $_stringSQL[$i]); $this->affectedRows += @pg_affected_rows($this->resultado); //se houver algum erro cai aqui if(is_bool($this->resultado) && !$this->resultado) { //a mensagem de erro é escrita no trace $this->trace->escreveTrace("Erro ao tentar executar a instrução SQL:" . $_stringSQL[$i] . " - (" . pg_last_error($this->conexao) . ")"); $this->errorTransaction = true; break; } } if($this->errorTransaction) { @pg_query($this->conexao, "ROLLBACK"); $this->affectedRows = 0; $this->errorTransaction = false; throw new ExceptionsLayer("Erro ao tentar executar a instrução SQL.",ExceptionsLayer::SQL_ERROR); return; } else { @pg_query($this->conexao, "COMMIT"); return array(); } } else { //executa a consulta $this->resultado = @pg_query($this->conexao, $_stringSQL); $this->affectedRows = @pg_affected_rows($this->resultado); //se houver algum erro cai aqui if(is_bool($this->resultado) && !$this->resultado) { //a mensagem de erro é escrita no trace $this->trace->escreveTrace("Erro ao tentar executar a instrução SQL:\n" . $_stringSQL . " - Postgre error:".pg_last_error($this->conexao)); throw new ExceptionsLayer("Erro ao tentar executar a instrução SQL.",ExceptionsLayer::SQL_ERROR); return; } else { $this->trace->escreveTrace("Fim da função executeQuery-Conexao"); $this->resultado = @pg_fetch_all($this->resultado); //retorna o resultado da pesquisa return (is_bool($this->resultado) && !$this->resultado)?array():$this->resultado; } } } break; case self::MYSQL: { if(is_array($_stringSQL)) { @mysql_query("START TRANSACTION"); for($i = 0; $i < count($_stringSQL); $i++) { //executa a consulta $this->resultado = @mysql_query($_stringSQL[$i]); $this->affectedRows += @mysql_affected_rows(); //se houver algum erro cai aqui if(is_bool($this->resultado) && !$this->resultado) { //a mensagem de erro é escrita no trace $this->trace->escreveTrace("Erro ao tentar executar a instrução SQL:" . $_stringSQL[$i] . " - (" . mysql_error($this->conexao) . ")"); $this->errorTransaction = true; break; } } if($this->errorTransaction) { @mysql_query("ROLLBACK"); $this->affectedRows = 0; $this->errorTransaction = false; throw new ExceptionsLayer("Erro ao tentar executar a instrução SQL.",ExceptionsLayer::SQL_ERROR); return; } else { @mysql_query("COMMIT"); return array(); } } else { //executa a consulta $this->resultado = @mysql_query($_stringSQL); $this->affectedRows = @mysql_affected_rows(); //se houver algum erro cai aqui if(is_bool($this->resultado) && !$this->resultado) { //a mensagem de erro é escrita no trace $this->trace->escreveTrace("Erro ao tentar executar a instrução SQL:" . $_stringSQL . " - (" . mysql_error($this->conexao) . ")"); throw new ExceptionsLayer("Erro ao tentar executar a instrução SQL.",ExceptionsLayer::SQL_ERROR); return; } else { $this->trace->escreveTrace("Fim da função executeQuery-Conexao"); //retorna o resultado da pesquisa if((strpos($_stringSQL,"UPDATE") === false) && (strpos($_stringSQL,"INSERT") === false) && (strpos($_stringSQL,"DELETE") === false)) { $this->resultado = $this->mysql_fetch_all($this->resultado); return (is_bool($this->resultado) && !$this->resultado)?array():$this->resultado; } else return (is_bool($this->resultado) && !$this->resultado)?array():$this->resultado; } } } break; case self::MSSQL: { if(is_array($_stringSQL)) { @mssql_query("START TRANSACTION"); for($i = 0; $i < count($_stringSQL); $i++) { //executa a consulta $this->resultado = @mssql_query($_stringSQL[$i]); $this->affectedRows += @mssql_rows_affected($this->conexao);; //se houver algum erro cai aqui if(is_bool($this->resultado) && !$this->resultado) { //a mensagem de erro é escrita no trace $this->trace->escreveTrace("Erro ao tentar executar a instrução SQL:" . $_stringSQL[$i] . " - (" . mssql_get_last_message() . ")"); $this->errorTransaction = true; break; } } if($this->errorTransaction) { @mssql_query("ROLLBACK"); $this->affectedRows = 0; $this->errorTransaction = false; throw new ExceptionsLayer("Erro ao tentar executar a instrução SQL.",ExceptionsLayer::SQL_ERROR); return; } else { @mssql_query("COMMIT"); return array(); } } else { //executa a consulta $this->resultado = @mssql_query($_stringSQL); $this->affectedRows = @mssql_rows_affected($this->conexao); //se houver algum erro cai aqui if(is_bool($this->resultado) && !$this->resultado) { //a mensagem de erro é escrita no trace $this->trace->escreveTrace("Erro ao tentar executar a instrução SQL:" . $_stringSQL . " - (" . mssql_get_last_message() . ")"); throw new ExceptionsLayer("Erro ao tentar executar a instrução SQL.",ExceptionsLayer::SQL_ERROR); return; } else { $this->trace->escreveTrace("Fim da função executeQuery-Conexao"); //retorna o resultado da pesquisa if((strpos($_stringSQL,"UPDATE") === false) && (strpos($_stringSQL,"INSERT") === false) && (strpos($_stringSQL,"DELETE") === false)) { $this->resultado = $this->mssql_fetch_all($this->resultado); return (is_bool($this->resultado) && !$this->resultado)?array():$this->resultado; } else return (is_bool($this->resultado) && !$this->resultado)?array():$this->resultado; } } } break; default: { } break; } $this->trace->escreveTrace("Fim da função executeQuery-Conexao"); } /** * fechaConexao() * Método para executar o fechamento da conexão */ public function fechaConexao() { $this->trace->escreveTrace("Inicio da função fechaConexao-Conexao"); //switch para executar o fechamento da conexão switch($this->tipoBanco) { case self::POSTGRESQL: { //fecha a conexão $this->resultado = @pg_close($this->conexao); //se houver algum erro durante o fechamento cai aqui if(is_bool($this->resultado) && !$this->resultado) { $this->trace->escreveTrace("Erro ao tentar fechar a conexão"); throw new ExceptionsLayer("Erro ao tentar fechar a conexão com o banco de dados.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Fim da função fechaConexao-Conexao"); //retorna verdadeiro se o fechamento foi efetuado return true; } } break; case self::MYSQL: { //fecha a conexão $this->resultado = @mysql_close($this->conexao); //se houver algum erro cai aqui if(is_bool($this->resultado) && !$this->resultado) { $this->trace->escreveTrace("Erro ao tentar fechar a conexão"); throw new ExceptionsLayer("Erro ao tentar fechar a conexão com o banco de dados.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Fim da função fechaConexao-Conexao"); //retorna verdadeiro se o fechamento foi efetuado return true; } } break; case self::MSSQL: { //fecha a conexão $this->resultado = @mssql_close($this->conexao); //se houver algum erro cai aqui if(is_bool($this->resultado) && !$this->resultado) { $this->trace->escreveTrace("Erro ao tentar fechar a conexão"); throw new ExceptionsLayer("Erro ao tentar fechar a conexão com o banco de dados.",ExceptionsLayer::CONNECTION_ERROR); return; } else { $this->trace->escreveTrace("Fim da função fechaConexao-Conexao"); //retorna verdadeiro se o fechamento foi efetuado return true; } } break; default: { } break; } $this->trace->escreveTrace("Fim da função fechaConexao-Conexao"); } private function mysql_fetch_all($query) { $result = array(); while($row = mysql_fetch_assoc($query)) { array_push($result, $row); } return $result; } private function mssql_fetch_all($query) { $result = array(); while($row = mssql_fetch_assoc($query)) { array_push($result, $row); } return $result; } /** * getAffectedRows() * Método para retornar o número de linhas afetadas pela instrução sql */ public function getAffectedRows() { $linhas = $this->affectedRows; $this->affectedRows = 0; return $linhas; } } ?> a próxima classe é a de configuração do banco pasta_raiz_do_site/config/Config.php <?php /** * Classe de configuração da base * @version 1.0 * @author Wagner Brandão Soares */ class Config { const HOST = "servidor"; const PORTA = "3306"; const BASE = "dtm"; const USUARIO = "root"; const SENHA = "plan"; const TIPO_BANCO = 1002; public function __construct() { } } ?> a próxima classe é a de trace pasta_raiz_do_site/config/Trace.php <?php /** * Classe para a geração do trace * @version 1.0 * @author Wagner Brandão Soares */ class Trace { private $stream; private $nomeArquivo; private $debug; public function __construct($_nome_modulo) { $this->nomeArquivo = "./trace/" . $_nome_modulo. date("d-m-y") . ".txt"; $this->debug = true; } public function escreveTrace($_stringMensagem) { if($this->debug) { $this->stream = fopen($this->nomeArquivo, "ab"); fwrite($this->stream,date("d-m-y H:i:s") . " : " . $_stringMensagem . "\r\n"); fclose($this->stream); } } } ?> a próxima classe é a de declaração dos SQLs pasta_raiz_do_site/layers/SqlLayer.php <?php /** * Classe para a declaração dos SQLs. * @version 1.0 * @author Wagner Brandão Soares */ class SqlLayer { private $prefixo; public function __construct() { $this->prefixo = "dtm_"; } /** * Retorna o SQL para o cadastro dos logs do sistema. */ public function insereLog($arrayInfoLog) { return "INSERT INTO ".$this->prefixo."logs ( usuario , data , hora , log , idioma) VALUES ( '".$arrayInfoLog['usuario']."' , '".$arrayInfoLog['data']."' , '".$arrayInfoLog['hora']."' , '".$arrayInfoLog['log']."' , '".$arrayInfoLog['lingua']."');"; } } ?> a próxima classe é a base da camada de acesso pasta_raiz_do_site/layers/AccessBase.php <?php /** * Classe base para a classe de acesso a base de dados. * @version 1.0 * @author Wagner Brandão Soares */ class AccessBase { /** * Variável booleana de erro do sistema */ protected $blnErro; /** * Variável com a mensagem de erro do sistema */ protected $strMensagemErro; /** * Instância para uma nova conexão */ protected $conexao; /** * Variável para guardar os resultados das instruções SQL */ protected $resultado; /** * Instância do trace */ protected $trace; /** * Variável para guardar a quantidade de linhas afetadas pela instrução SQL */ protected $affectedRows; public function __construct() { $this->conexao = null; $this->resultado = array(); $this->affectedRows = 0; $this->blnErro = false; } /** * Método para retornar a variável booleana de erro do sistema */ public function getBlnErro() { $erro = $this->blnErro; $this->blnErro = false; return $erro; } /** * Método para retornar a variável com a mensagem de erro do sistema */ public function getStrMensagemErro() { $mensagem = $this->strMensagemErro; $this->strMensagemErro = null; return $mensagem; } /** * Método para retornar o número de linhas afetadas pela instrução sql */ public function getAffectedRows() { $linhas = $this->affectedRows; $this->affectedRows = 0; return $linhas; } } ?> a próxima classe é a camada de acesso pasta_raiz_do_site/layers/AccessLayer.php <?php require_once("SqlLayer.php"); require_once(dirname(dirname(realpath(__FILE__))) . "/config/Trace.php"); require_once(dirname(dirname(realpath(__FILE__))) . "/config/Conexao.php"); require_once("ExceptionsLayer.php"); require_once("AccessBase.php"); /** * Classe de acesso a base de dados. * @version 1.0 * @author Wagner Brandão Soares */ class AccessLayer extends AccessBase { /** * Instância de SqlLayer */ private $sqlLayer; public function __construct() { parent::__construct(); //cria uma instância do trace $this->trace = new Trace(get_class($this)); $this->trace->escreveTrace("Inicio do construtor-AccessLayer"); //cria uma instância da camada de SQL $this->sqlLayer = new SqlLayer(); $this->trace->escreveTrace("Fim do construtor-AccessLayer"); } /** * Insere o cadastro de acesso no sistema. */ public function insereLog($arrayInfoLog) { $this->trace->escreveTrace("Inicio do insereAcesso-AccessLayer"); try { //cria uma nova conexão $this->conexao = new Conexao(); $sql = $this->sqlLayer->insereLog($arrayInfoLog); //escreve o sql no trace para posterior consulta de erro if(is_array($sql)) for($i = 0; $i < count($sql); $i++) $this->trace->escreveTrace($sql[$i]); else $this->trace->escreveTrace($sql); //recebe o resultado da execução da query $this->resultado = $this->conexao->executeQuery($sql); $this->affectedRows = $this->conexao->getAffectedRows(); } catch(Exception $ex) { if($ex->getCode() == ExceptionsLayer::CONNECTION_ERROR) { $this->strMensagemErro = $ex->getMessage(); } else if ($ex->getCode() == ExceptionsLayer::SQL_ERROR) { $this->strMensagemErro = "Não foi possível inserir o log de acesso."; } $this->blnErro = true; return array(); } if($this->affectedRows == 0) { $this->strMensagemErro = "Ocorreu um erro ao tentar inserir o log de acesso."; $this->blnErro = true; } //fecha a conexão $this->conexao->fechaConexao(); $this->trace->escreveTrace("Fim do insereAcesso-AccessLayer"); //retorna o resultado da instrução sql return $this->resultado; } /** * Verifica o login do usuário no sistema. */ public function verificaLogin($infoLogin) { $this->trace->escreveTrace("Inicio do verificaLogin-AccessLayer"); try { //cria uma nova conexão $this->conexao = new Conexao(); $sql = $this->sqlLayer->verificaLogin($infoLogin); //escreve o sql no trace para posterior consulta de erro if(is_array($sql)) for($i = 0; $i < count($sql); $i++) $this->trace->escreveTrace($sql[$i]); else $this->trace->escreveTrace($sql); //recebe o resultado da execução da query $this->resultado = $this->conexao->executeQuery($sql); $this->affectedRows = $this->conexao->getAffectedRows(); } catch(Exception $ex) { if($ex->getCode() == ExceptionsLayer::CONNECTION_ERROR) { $this->strMensagemErro = $ex->getMessage(); } else if ($ex->getCode() == ExceptionsLayer::SQL_ERROR) { $this->strMensagemErro = "Não foi possível verifica o login do usuário."; } $this->blnErro = true; return array(); } if(count($this->resultado) == 0) { $this->strMensagemErro = "Login ou senha incorreto(a)."; $this->blnErro = true; } //fecha a conexão $this->conexao->fechaConexao(); $this->trace->escreveTrace("Fim do verificaLogin-AccessLayer"); //retorna o resultado da instrução sql return $this->resultado; } } ?> a próxima classe é a exceções (básica) pasta_raiz_do_site/layers/ExceptionsLayer.php <?php /** * Classe de exceções do sistema. * @version 1.0 * @author Wagner Brandão Soares */ class ExceptionsLayer extends Exception { const NOT_NULL = 1001; const INCORRECT_FORMAT = 1002; const CONNECTION_ERROR = 1003; const SQL_ERROR = 1004; public function __construct($_mensagem, $_codigo) { parent::__construct($_mensagem, $_codigo); } } ?> Bom primeiramente cria-se uma camada que acessará a camada de acesso ao banco (AccessLayer): pasta_raiz_do_site/produtos_class.php <?php require_once("layers/AccessLayer.php"); class produtos_class { /** * Instância de AccessLayer */ private $accessLayer; /** * Construtor da classe */ public function __construct() { if(!isset($_SESSION['AccessLayer'])) { $_SESSION['AccessLayer'] = new AccessLayer(); } $this->accessLayer = $_SESSION['AccessLayer']; } /** * Retorna um valor booleano se houve erro */ public function getBlnErro() { return $this->accessLayer->getBlnErro(); } /** * Retorna a mensagem de erro do sistema */ public function getStrMensagemErro() { return $this->accessLayer->getStrMensagemErro(); } /** * Retorna o número de linhas afetadas por uma instrução SQL. */ public function getAffectedRows() { return $this->accessLayer->getAffectedRows(); } /** * Insere um contador de acesso do sistema. */ public function insereLog($arrayInfoLog) { return $this->accessLayer->insereLog($arrayInfoLog); } /** * Consulta os produtos do sistema. */ public function consultaProdutos($infoPaginacao) { return $this->accessLayer->consultaProdutos($infoPaginacao); } /** * Exclui um produto do sistema. */ public function excluirProduto($id) { return $this->accessLayer->excluirProduto($id); } /** * Consulta os tipos de produtos do sistema. */ public function consultaTipoProdutos($infoPaginacao) { return $this->accessLayer->consultaProdutos($infoPaginacao); } } ?> agora um exemplo de como utilizar: pasta_raiz_do_site/produtos.php <?php require_once("produtos_class.php"); $infoPaginacao = array(); $infoPaginacao['id'] = 0; $infoPaginacao['ini'] = 0; $infoPaginacao['fim'] = 0; $produtos = array(); $produtos = $produtos_class->consultaProdutos($infoPaginacao); $erro = $produtos_class->getBlnErro(); $mensagem = $produtos_class->getStrMensagemErro(); // exemplo de como trabalhar com os dados retornados do banco if(!$erro) { for($i = 0; $i < count($produtos); $i++) { echo "Id do produto: ".$produtos[$i]['id']."<br />"; echo "Nome do produto: ".$produtos[$i]['nome']."<br /><br />"; } } else echo $mensagem; ?> No próximo post, mostrarei como trabalhar com transações. Qualquer dúvida é só perguntar. Compartilhar este post Link para o post Compartilhar em outros sites
hunternh 2 Denunciar post Postado Janeiro 10, 2008 Para criar um transação, crie uma nova função na classe SqlLayer. No exemplo abaixo, estão sendo executados updates em duas tabelas e insert em outra: /** * Retorna o SQL para a alteração das informaçãoes do template. */ public function alteraTemplate($infoTemplate) { $query = array(); array_push($query, "UPDATE tamplate SET titulo_pt = '".$infoTemplate['titulo']."' , texto_pt = '".$infoTemplate['texto']."' WHERE id = ".$infoTemplate['id'].";"); for($i = 0; $i < count($infoTemplate['ids']); $i++) { if(strlen($infoTemplate['imagens'][$i]) > 0) array_push($query, "UPDATE img_tamplates SET imagem = '".$infoTemplate['imagens'][$i]."' , desc_pt = '".$infoTemplate['desc'][$i]."' WHERE id = ".$infoTemplate['ids'][$i].";"); } for(; $i < count($infoTemplate['imagens']); $i++) { if(strlen($infoTemplate['imagens'][$i]) > 0) array_push($query, "INSERT INTO img_tamplates (imagem , desc_pt , id_tamplate) VALUES ('".$infoTemplate['imagens'][$i]."' , '".$infoTemplate['desc'][$i]."' , ".$infoTemplate['id'].");"); } return $query; } Compartilhar este post Link para o post Compartilhar em outros sites
André Baltieri 0 Denunciar post Postado Janeiro 10, 2008 Fala hunternh, parabéns pela iniciativa.. Agora estou meio ocupado, mas quero ler seu artigo assim que der. Muito interessante. Abraços Compartilhar este post Link para o post Compartilhar em outros sites
hunternh 2 Denunciar post Postado Janeiro 10, 2008 Muito obrigado. Abaixo segue um exemplo do trace que é gerado: 10-01-08 11:11:07 : Inicio do insereAcesso-AccessLayer 10-01-08 11:11:07 : INSERT INTO dtm_logs ( usuario , data , hora , log , idioma) VALUES ( 'Administrador' , '2008-01-10' , '11:11:07' , 'Visualizou a lista de produtos.' , 'pt'); 10-01-08 11:11:07 : Fim do insereAcesso-AccessLayer assim pode-se visualizar todos os SQLs que foram executados pela classe AccessLayer e agora um exemplo de quando ocorrer algum erro de SQL ou com o próprio banco: 10-01-08 13:17:57 : Erro ao tentar executar a instrução SQL:INSERT INTO dtm_logs ( usuario , data , hora , log , idiomas) VALUES ( 'Administrador' , '2008-01-10' , '13:17:57' , 'Logou no sistema e redirecionado para o painel.' , 'pt'); - (Unknown column 'idiomas' in 'field list') com esse sistema de classes os erros, não retornam para o usuário, assim sendo você pode criar erros personalizados, como eu mostrei nesse exemplo: <?php require_once("produtos_class.php"); $infoPaginacao = array(); $infoPaginacao['id'] = 0; $infoPaginacao['ini'] = 0; $infoPaginacao['fim'] = 0; $produtos = array(); $produtos = $produtos_class->consultaProdutos($infoPaginacao); $erro = $produtos_class->getBlnErro(); $mensagem = $produtos_class->getStrMensagemErro(); // exemplo de como trabalhar com os dados retornados do banco if(!$erro) { for($i = 0; $i < count($produtos); $i++) { echo "Id do produto: ".$produtos[$i]['id']."<br />"; echo "Nome do produto: ".$produtos[$i]['nome']."<br /><br />"; } } else echo $mensagem; ?> Compartilhar este post Link para o post Compartilhar em outros sites
hunternh 2 Denunciar post Postado Janeiro 15, 2008 Agora, vou mostrar como passar valores de uma página para outra sem utilizar o método GET. Primeiro crie as variáveis necessárias para armazenar os valores desejados na classe AccessLayer e crie os seus respectivos métodos get e set. Como uma cópia da classe AccessLayer fica salva na sessão os valores de uma página podem ser salvos nela e e acessados em outra página sem a nessecidade de passar esses valores por get, não ficando visíveis ao usuário. Compartilhar este post Link para o post Compartilhar em outros sites