{"id":109,"date":"2009-11-12T17:16:48","date_gmt":"2009-11-12T20:16:48","guid":{"rendered":"http:\/\/www.softov.com.br\/blog\/?p=109"},"modified":"2009-11-12T17:16:48","modified_gmt":"2009-11-12T20:16:48","slug":"classe-abstrata-phpoo-mysql","status":"publish","type":"post","link":"https:\/\/softov.com.br\/blog\/2009\/11\/12\/classe-abstrata-phpoo-mysql\/","title":{"rendered":"Classe Abstrata, phpOO + Mysql"},"content":{"rendered":"<p>Neste tutorial vou mostrar como voc\u00ea pode criar uma classe phpOO abstrata para banco de dados MySQL.<br \/>\nAl\u00e9m das fun\u00e7\u00f5es b\u00e1sicas dessa classe, podemos resumir tempo total gasto com conex\u00e3o e execu\u00e7\u00e3o de consultas e contar quantas consultas foram executados durante o seu script PHP.<\/p>\n<h3>Etapa 1.<\/h3>\n<p>A primeira pergunta \u00e9 por isso que precisamos se n\u00f3s temos toda a fun\u00e7\u00e3o em PHP como nativa. H\u00e1 mais argumentos:<\/p>\n<p>* Voc\u00ea pode facilmente reutilizar o script em todo o seu desenvolvimento.<br \/>\n* Voc\u00ea pode alterar a base de dados sem alterar todo o seu script. Voc\u00ea precisar\u00e1 editar apenas a classe.<br \/>\n* Voc\u00ea pode fazer optimiza\u00e7\u00e3o e simplifica\u00e7\u00e3o mais f\u00e1cil.<br \/>\n* Voc\u00ea pode centralizar o acesso e manipula\u00e7\u00e3o de erro DB.<br \/>\n* Voc\u00ea pode fazer a depura\u00e7\u00e3o mais f\u00e1cil.<br \/>\n* Voc\u00ea pode f\u00e1cilmente implementar estat\u00edsticas em tempo de consulta e contadores de consulta.<\/p>\n<p>Agora vamos resumir o tipo de fun\u00e7\u00e3o que precisamos:<\/p>\n<p>* Criar uma conex\u00e3o com o banco<br \/>\n* Execu\u00e7\u00e3o de queries SQL<br \/>\n* Recebe o n\u00famero de linhas selecionadas se poss\u00edvel<br \/>\n* Recebe o n\u00famero de linhas modificadas, se poss\u00edvel<br \/>\n* Receber o id(auto increment) mais recente, se foi poss\u00edvel inserir<br \/>\n* Coloque um resultado da consulta em um array normal<br \/>\n* Mensagem de erro e \/ ou identifica\u00e7\u00e3o(code), se necess\u00e1rio<br \/>\n* Obter o tempo total gasto no banco de dados<br \/>\n* Recebe o n\u00famero de consultas realizadas<\/p>\n<h3>Etapa 2.<\/h3>\n<p>Antes que possamos iniciar a implementa\u00e7\u00e3o das fun\u00e7\u00f5es que precisamos de todas as vari\u00e1veis de classe comum usado que armazena informa\u00e7\u00f5es importantes.<br \/>\nEstes s\u00e3o:<\/p>\n<p>* Um identificador de conex\u00e3o para armazenar o link de conex\u00e3o real.<br \/>\n* Um conjunto de resultados para armazenar resultados da consulta.<br \/>\n* Uma mensagem de erro e erro id para armazenar informa\u00e7\u00f5es de erro.<br \/>\n* Um contador para contar as consultas executadas.<br \/>\n* Um contador de tempo para armazenar os tempos de consulta total.<\/p>\n<p>Assim, a classe base fica assim:<br \/>\nMysqlAbs.class.php<\/p>\n<p>[code language=&#8221;php&#8221;]<br \/>\n &lt;? php<\/p>\n<p>classe MysqlAbs (<\/p>\n<p> var $conectado\u00a0\u00a0 = &#8221;; \/\/ link de conexao<br \/>\n var $queryCounter = 0; \/\/ contador de query<br \/>\n var $tempoTotal\u00a0\u00a0\u00a0 = 0;\u00a0\u00a0\u00a0 \u00a0\/\/ contador de tempo<br \/>\n var $errorCode\u00a0\u00a0\u00a0 = 0; \/\/codigo de erro<br \/>\n var $errorMsg\u00a0\u00a0\u00a0\u00a0 = &#8221;; \/\/ mensagem de erro<br \/>\n var $resultSet\u00a0\u00a0\u00a0 = &#8221;;<\/p>\n<p> \/\/ conexao padrao quando nao for setada<br \/>\n var $servidor=&quot;localhost&quot;; \/\/ host<br \/>\n var $usuario=&quot;root&quot;; \/\/ user<br \/>\n var $senha=&quot;&quot;; \/\/senha<br \/>\n var $banco=&quot;test&quot;; \/\/banco)<br \/>\n?&gt;<br \/>\n[\/code]<\/p>\n<h3>Etapa 3.<\/h3>\n<p>Agora podemos implementar as fun\u00e7\u00f5es. Vamos come\u00e7ar com o mais importante. Conectando-se ao banco de dados. O construtor da classe ser\u00e1 respons\u00e1vel por construir a conex\u00e3o com a base de dados. Portanto, se voc\u00ea criar um objeto de banco de dados a partir desta classe imediatamente tera uma conex\u00e3o v\u00e1lida tamb\u00e9m.<\/p>\n<p>Assim, o construtor tem os seguintes par\u00e2metros:<br \/>\n* Hostname<br \/>\n* Usu\u00e1rio<br \/>\n* Senha<br \/>\n* Nome do banco de dados<\/p>\n<p>Na fun\u00e7\u00e3o tentamos conectar ao servidor de banco de dados e se conseguirmos,\u00a0 tentamos selecionar o banco de dados. Em caso de erro temos que definir a mensagem de erro e o codigo de erro e retornar como falso.<\/p>\n<p>O construtor da classe \u00e9 o seguinte:<\/p>\n<p>[code language=&#8221;php&#8221;]<\/p>\n<p>&lt;? php<br \/>\n function __construct() {<br \/>\n $this -&gt; conexao($this-&gt;servidor,$this-&gt;usuario,$this-&gt;senha,$this-&gt;banco);<br \/>\n}<br \/>\nfunction conexao($host, $user, $pass, $db){<br \/>\n $startTime = $this-&gt;getMicroTime();<\/p>\n<p> \/\/ faz a conexao com o servidor<br \/>\n if (!$this-&gt;conectado = @mysql_connect($host,$user,$pass,true)){<br \/>\n $this-&gt;errorCode = mysql_errno();<br \/>\n $this-&gt;errorMsg\u00a0 = mysql_error();<br \/>\n return false;<\/p>\n<p> }<\/p>\n<p> \/\/ faz a selecao do banco<br \/>\n if (!@mysql_select_db($db,$this-&gt;conectado)){<br \/>\n $this-&gt;errorCode = mysql_errno();<br \/>\n $this-&gt;errorMsg\u00a0 = mysql_error();<br \/>\n @mysql_close($this-&gt;conectado);<br \/>\n return false;<br \/>\n }<\/p>\n<p> $this-&gt;tempoTotal += $this-&gt;getMicroTime() &#8211; $startTime;<\/p>\n<p> return true;<br \/>\n }<\/p>\n<p>?&gt;<br \/>\n[\/code]<\/p>\n<p>Acima eu crio o construct que instanciar\u00e1 a conexao, assim como padrao fica a conex\u00e3o com os dados que estao dentro da classe, se for instanciado e passado os parametros ele criara a conexao. Caso contr\u00e1rio ele retornar\u00e1 falso com uma mensagem de erro.<\/p>\n<h3>Etapa 4.<\/h3>\n<p>Como pr\u00f3ximo passo vamos implementar a fun\u00e7\u00e3o de execu\u00e7\u00e3o da consulta. Nesta fun\u00e7\u00e3o podemos medir o tempo de execu\u00e7\u00e3o (veja os detalhes mais tarde), aumentando o contador de consulta e, claro, de executar a consulta em si. Se ocorrer um erro, definir a mensagem de erro e de codigo de erro\u00a0 e retorna como falso. Se tudo estiver\u00a0 funcionando voltamos bem com o conjunto de resultados.<\/p>\n<p>O c\u00f3digo \u00e9 o seguinte:<\/p>\n<p>[code language=&#8221;php&#8221;]<\/p>\n<p>&lt;? php<br \/>\n function executeQuery($sql){<\/p>\n<p> $startTime = $this-&gt;getMicroTime();<\/p>\n<p> ++$this-&gt;queryCounter;<\/p>\n<p> if(!$this-&gt;resultSet = @mysql_query($sql,$this-&gt;conectado)){<br \/>\n $this-&gt;errorCode = mysql_errno();<br \/>\n $this-&gt;errorMsg\u00a0 = mysql_error();<br \/>\n $this-&gt;totalTime = $this-&gt;getMicroTime() &#8211; $startTime;<br \/>\n return false;<br \/>\n }<br \/>\n $this-&gt;totalTime += $this-&gt;getMicroTime() &#8211; $startTime;<\/p>\n<p> return $this-&gt;resultSet;<br \/>\n }<br \/>\n?&gt;<br \/>\n[\/code]<\/p>\n<p>Se a consulta cont\u00e9m um Insert, Update ou o comando DELETE, pode ser importante para saber quantos registros foram afetados por esta consulta. Para obt\u00ea-lo vamos implementar uma fun\u00e7\u00e3o, como segue:<\/p>\n<p>[code language=&#8221;php&#8221;]<\/p>\n<p>&lt;? php<br \/>\n function getAffectedRows()<br \/>\n {<br \/>\n return @mysql_affected_rows($this-&gt;conectado);<br \/>\n }<br \/>\n?&gt;<br \/>\n[\/code]<\/p>\n<p>No caso de um select,\u00a0 o n\u00famero de registros poderia ser interessante. Para obt\u00ea-lo, temos uma fun\u00e7\u00e3o semelhante:<\/p>\n<p>[code language=&#8221;php&#8221;]<\/p>\n<p>&lt;? php<br \/>\n function getSelectedRows()<br \/>\n {<br \/>\n return @mysql_num_rows($this-&gt;resultSet);<br \/>\n }<br \/>\n?&gt;<br \/>\n[\/code]<\/p>\n<p>Neste t\u00f3pico, temos uma \u00faltima quest\u00e3o importante. Em caso de Inser\u00e7\u00e3o talvez n\u00f3s queremos saber o id que foi criado. Para obter essa informa\u00e7\u00e3o ap\u00f3s o registro ser inserido, podemos usar o seguinte c\u00f3digo:<\/p>\n<p>[code language=&#8221;php&#8221;]<\/p>\n<p>&lt;? php<br \/>\n function getInsertId()<br \/>\n{<br \/>\n return @mysql_insert_id($this-&gt;conectado);<br \/>\n }<br \/>\n?&gt;<br \/>\n[\/code]<\/p>\n<h3>Etapa 5.<\/h3>\n<p>Agora vamos criar alguma outra fun\u00e7\u00e3o \u00fatil para tornar a nossa classe melhor.<br \/>\nEm caso de select, por vezes, seria bom ter um array associativo em vez do MySQL result set. Ent\u00e3o, vamos implementar uma fun\u00e7\u00e3o que retorna a essa matriz gerada a partir de um conjunto de resultados reais.<br \/>\nO c\u00f3digo fica assim:<\/p>\n<p>[code language=&#8221;php&#8221;]<\/p>\n<p>&lt;? php<br \/>\nfunction loadResult()<br \/>\n {<br \/>\n $array = array();<br \/>\n while ($row = mysql_fetch_object( $this-&gt;resultSet )) {<br \/>\n $array[] = $row;<br \/>\n }<br \/>\n mysql_free_result( $this-&gt;resultSet );<\/p>\n<p> return $array;<br \/>\n }<\/p>\n<p>?&gt;<br \/>\n[\/code]<\/p>\n<p>Como a nossa fun\u00e7\u00e3o n\u00e3o enviar mensagens de erro de volta para o chamador apenas define as vari\u00e1veis de erro dentro da classe por isso precisamos de fun\u00e7\u00e3o para obter essa informa\u00e7\u00e3o. Estas s\u00e3o fun\u00e7\u00f5es getter simples como o seguinte:<\/p>\n<p>[code language=&#8221;php&#8221;]<\/p>\n<p>&lt;? php<br \/>\n function getErroCode(){<br \/>\n return $this-&gt;errorCode;<br \/>\n }<\/p>\n<p> function getErroMsg(){<br \/>\n return $this-&gt;errorMsg;<br \/>\n }<br \/>\n?&gt;<br \/>\n[\/code]<\/p>\n<h3>Etapa 6.<\/h3>\n<p>Como passo final \u00e9 preciso implementar uma fun\u00e7\u00e3o para obter tempos de consulta. Para faz\u00ea-lo, precisamos de uma fun\u00e7\u00e3o que retorna o tempo atual em milisegundos.<br \/>\nChamando essa fun\u00e7\u00e3o no in\u00edcio e no final das chamadas de fun\u00e7\u00f5es de conexao, query ou outras do tipo, poderemos calcular o tempo total gasto no db.<br \/>\nAl\u00e9m deste vamos implementar outras 2 fun\u00e7\u00f5es getter para obter o n\u00famero de consultas realizadas eo tempo total da consulta em um formato util.<\/p>\n<p>Assim, nossas fun\u00e7\u00f5es:<\/p>\n<p>[code language=&#8221;php&#8221;]<\/p>\n<p>&lt;? php<br \/>\n function getTempo(){<br \/>\n return round($this-&gt;tempoTotal,6);<br \/>\n }<\/p>\n<p> function getSqlCount(){<br \/>\n return $this-&gt;queryCounter;<br \/>\n }<\/p>\n<p> function getMicroTime() {<br \/>\n list($usec, $sec) = explode(&quot; &quot;,microtime());<br \/>\n return ((float)$usec + (float)$sec);<br \/>\n }<br \/>\n?&gt;<br \/>\n[\/code]<\/p>\n<p>Bom \u00e9 isso, no pr\u00f3ximo eu mostrarei como utilizar esta classe.. at\u00e9 breve.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste tutorial vou mostrar como voc\u00ea pode criar uma classe phpOO abstrata para banco de dados MySQL. Al\u00e9m das fun\u00e7\u00f5es b\u00e1sicas dessa classe, podemos resumir tempo total gasto com conex\u00e3o e execu\u00e7\u00e3o de consultas e contar quantas consultas foram executados durante o seu script PHP. Etapa 1. A primeira pergunta \u00e9 por isso que precisamos&hellip; <a class=\"more-link\" href=\"https:\/\/softov.com.br\/blog\/2009\/11\/12\/classe-abstrata-phpoo-mysql\/\">Continuar lendo <span class=\"screen-reader-text\">Classe Abstrata, phpOO + Mysql<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"_links":{"self":[{"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/posts\/109"}],"collection":[{"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/comments?post=109"}],"version-history":[{"count":0,"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/posts\/109\/revisions"}],"wp:attachment":[{"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/media?parent=109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/categories?post=109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/softov.com.br\/blog\/wp-json\/wp\/v2\/tags?post=109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}