{"id":980,"date":"2012-06-30T20:12:55","date_gmt":"2012-06-30T20:12:55","guid":{"rendered":"http:\/\/leonardocotta.com.br\/blog\/?p=980"},"modified":"2012-06-30T20:12:55","modified_gmt":"2012-06-30T20:12:55","slug":"pdo-em-php-orientado-a-objetos","status":"publish","type":"post","link":"https:\/\/leonardocotta.com.br\/?p=980","title":{"rendered":"PDO em PHP Orientado a Objetos"},"content":{"rendered":"<p>Nesse artigo vou mostrar como usar o PDO para conectar em um banco de dados em PHP orientado a objetos.<\/p>\n<div style=\"width:658px;word-wrap:break-word;\">\n<div class=\"article\">\n<p>Nesse exemplo estou usando o banco de dados MySQL.<\/p>\n<p>Vamos primeiramente criar um banco de dados chamado \u201cteste\u201d. Ver Listagem 1<\/p>\n<p>Listagem 1: C\u00f3digo para criar um banco de dados no MySQL query<\/p>\n<pre class=\"brush:js;toolbar:false;\">CREATE DATABASE IF NOT EXISTS teste<\/pre>\n<div class=\"spacesyntax\"><\/div>\n<p>Agora vamos criar a estrutura da classe de conex\u00e3o. Para isso vamos criar um arquivo chamado conexao.php e criar a nossa classe database que ser\u00e1 uma abstrata. Ver Listagem 2.<\/p>\n<p>Listagem 2: Estrutura da classe database<\/p>\n<pre class=\"brush:js;toolbar:false;\">&lt;?php\nabstract class database{\n}\n?&gt;<\/pre>\n<div class=\"spacesyntax\"><\/div>\n<p>Vamos ent\u00e3o adicionar os m\u00e9todos padr\u00f5es para as classes abstratas que s\u00e3o o __construct, __clone e __destruct. Ver Listagem 3.<\/p>\n<p>Os m\u00e9todos __construct e __destruct.s\u00e3o padr\u00f5es do php e s\u00e3o respons\u00e1veis por construir e destruir a instancia da nossa classe.<\/p>\n<p>O m\u00e9todo __clone evita que nossa classe seja clonada.<\/p>\n<p>Listagem 3: Classe usuarios com os m\u00e9todos __construct, __clone e __destruct<\/p>\n<pre class=\"brush:js;toolbar:false;\">&lt;?php\nabstract class database{\n\t\/*M\u00e9todo construtor do banco de dados*\/\n\tprivate function __construct(){}\n\n\t\/*Evita que a classe seja clonada*\/\n\tprivate function __clone(){}\n\n\t\/*M\u00e9todo que destroi a conex\u00e3o com banco de dados e remove da mem\u00f3ria todas as vari\u00e1veis setadas*\/\n\tpublic function __destruct() {\n\t\tforeach ($this as $key =&gt; $value) {\n\t\t\tunset($this-&gt;$key);\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\t}\n}\n?&gt;<\/pre>\n<div class=\"spacesyntax\"><\/div>\n<p>Na listagem 3 o m\u00e9todo __destruct remove da mem\u00f3ria todas as vari\u00e1veis que foram setadas pela nossa classe.<\/p>\n<p>Agora vamos criar os m\u00e9todos de conex\u00e3o e fechar a conex\u00e3o com o BD. Ver Listagem 4.<\/p>\n<p>Listagem 4: M\u00e9todos connect e disconnect<\/p>\n<pre class=\"brush:js;toolbar:false;\">&lt;?php\nabstract class database{\n\t\/*M\u00e9todo construtor do banco de dados*\/\n\tprivate function __construct(){}\n\n\t\/*Evita que a classe seja clonada*\/\n\tprivate function __clone(){}\n\n\t\/*M\u00e9todo que destroi a conex\u00e3o com banco de dados e remove da mem\u00f3ria todas as vari\u00e1veis setadas*\/\n\tpublic function __destruct() {\n\t\t$this-&gt;disconnect();\n\t\tforeach ($this as $key =&gt; $value) {\n\t\t\tunset($this-&gt;$key);\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\t}\n\n\tprivate static $dbtype \u00a0 = \"mysql\";\n\tprivate static $host \u00a0 \u00a0 = \"localhost\";\n\tprivate static $port \u00a0 \u00a0 = \"3306\";\n\tprivate static $user \u00a0 \u00a0 = \"root\";\n\tprivate static $password = \"123\";\n\tprivate static $db \u00a0 \u00a0 \u00a0 = \"teste\";\n\n\t\/*Metodos que trazem o conteudo da variavel desejada\n\t@return \u00a0 $xxx = conteudo da variavel solicitada*\/\n\tprivate function getDBType() \u00a0{return self::$dbtype;}\n\tprivate function getHost() \u00a0 \u00a0{return self::$host;}\n\tprivate function getPort() \u00a0 \u00a0{return self::$port;}\n\tprivate function getUser() \u00a0 \u00a0{return self::$user;}\n\tprivate function getPassword(){return self::$password;}\n\tprivate function getDB() \u00a0 \u00a0 \u00a0{return self::$db;}\n\n\tprivate function connect(){\n\t\ttry\n\t\t{\n\t\t\t$this-&gt;conexao = new PDO($this-&gt;getDBType().\":host=\".$this-&gt;getHost().\";port=\".$this-&gt;getPort().\";dbname=\".$this-&gt;getDB(), $this-&gt;getUser(), $this-&gt;getPassword());\n\t\t}\n\t\tcatch (PDOException $i)\n\t\t{\n\t\t\t\/\/se houver exce\u00e7\u00e3o, exibe\n\t\t\tdie(\"Erro: &lt;code&gt;\" . $i-&gt;getMessage() . \"&lt;\/code&gt;\");\n\t\t}\n\n\t\treturn ($this-&gt;conexao);\n\t}\n\n\tprivate function disconnect(){\n\t\t$this-&gt;conexao = null;\n\t}\n}\n?&gt;<\/pre>\n<div class=\"spacesyntax\"><\/div>\n<p>Veja a defini\u00e7\u00e3o das vari\u00e1veis privadas usadas para conex\u00e3o na Listagem 4:<\/p>\n<p>dbtype &#8211; define uma string que informa qual a plataforma de banco de dados que estamos usando. Para o MySQL usamos a string \u201cmysql\u201d e para o SQL Server usamos a string \u201cmssql\u201d. Veja nesse link <a href=\"http:\/\/br.php.net\/manual\/en\/pdo.drivers.php\" rel=\"nofollow noopener\" target=\"_blank\">http:\/\/br.php.net\/manual\/en\/pdo.drivers.php<\/a> os drives de banco de dados suportados pelo PDO<br \/>\nhost &#8211; define o nome do host<br \/>\nport &#8211; define a porta do host<br \/>\nuser &#8211; define o usu\u00e1rio de acesso ao banco de dados<br \/>\npassword &#8211; define a senha de acesso ao banco de dados<br \/>\ndb &#8211; define o nome do banco de dados<\/p>\n<p>O m\u00e9todo connect tenta se conectar com o banco de dados usando as informa\u00e7\u00f5es passadas pelas vari\u00e1veis privadas, caso n\u00e3o consiga retorna um erro.<\/p>\n<p>O m\u00e9todo disconnect finaliza a conex\u00e3o com o banco de dados. Perceba que esse m\u00e9todo est\u00e1 sendo chamado pelo m\u00e9todo __destruct, ou seja, ele sempre ser\u00e1 executado ao t\u00e9rmino da utiliza\u00e7\u00e3o da classe database.<\/p>\n<p>Por fim vamos criar os m\u00e9todos insert, select, update e delete para fazer o nosso CRUD. Ver Listagem 5.<\/p>\n<p>Listagem 5: M\u00e9todos insert, select, update e delete<\/p>\n<pre class=\"brush:js;toolbar:false;\">&lt;?php\nabstract class database{\n\t\/*M\u00e9todo construtor do banco de dados*\/\n\tprivate function __construct(){}\n\n\t\/*Evita que a classe seja clonada*\/\n\tprivate function __clone(){}\n\n\t\/*M\u00e9todo que destroi a conex\u00e3o com banco de dados e remove da mem\u00f3ria todas as vari\u00e1veis setadas*\/\n\tpublic function __destruct() {\n\t\t$this-&gt;disconnect();\n\t\tforeach ($this as $key =&gt; $value) {\n\t\t\tunset($this-&gt;$key);\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\t}\n\n\tprivate static $dbtype \u00a0 = \"mysql\";\n\tprivate static $host \u00a0 \u00a0 = \"localhost\";\n\tprivate static $port \u00a0 \u00a0 = \"3306\";\n\tprivate static $user \u00a0 \u00a0 = \"root\";\n\tprivate static $password = \"123\";\n\tprivate static $db \u00a0 \u00a0 \u00a0 = \"teste\";\n\n\t\/*Metodos que trazem o conteudo da variavel desejada\n\t@return \u00a0 $xxx = conteudo da variavel solicitada*\/\n\tprivate function getDBType() \u00a0{return self::$dbtype;}\n\tprivate function getHost() \u00a0 \u00a0{return self::$host;}\n\tprivate function getPort() \u00a0 \u00a0{return self::$port;}\n\tprivate function getUser() \u00a0 \u00a0{return self::$user;}\n\tprivate function getPassword(){return self::$password;}\n\tprivate function getDB() \u00a0 \u00a0 \u00a0{return self::$db;}\n\n\tprivate function connect(){\n\t\ttry\n\t\t{\n\t\t\t$this-&gt;conexao = new PDO($this-&gt;getDBType().\":host=\".$this-&gt;getHost().\";port=\".$this-&gt;getPort().\";dbname=\".$this-&gt;getDB(), $this-&gt;getUser(), $this-&gt;getPassword());\n\t\t}\n\t\tcatch (PDOException $i)\n\t\t{\n\t\t\t\/\/se houver exce\u00e7\u00e3o, exibe\n\t\t\tdie(\"Erro: &lt;code&gt;\" . $i-&gt;getMessage() . \"&lt;\/code&gt;\");\n\t\t}\n\n\t\treturn ($this-&gt;conexao);\n\t}\n\n\tprivate function disconnect(){\n\t\t$this-&gt;conexao = null;\n\t}\n\n\t\/*M\u00e9todo select que retorna um VO ou um array de objetos*\/\n\tpublic function selectDB($sql,$params=null,$class=null){\n\t\t$query=$this-&gt;connect()-&gt;prepare($sql);\n\t\t$query-&gt;execute($params);\n\n\t\tif(isset($class)){\n\t\t\t$rs = $query-&gt;fetchAll(PDO::FETCH_CLASS,$class) or die(print_r($query-&gt;errorInfo(), true));\n\t\t}else{\n\t\t\t$rs = $query-&gt;fetchAll(PDO::FETCH_OBJ) or die(print_r($query-&gt;errorInfo(), true));\n\t\t}\n\t\tself::__destruct();\n\t\treturn $rs;\n\u00a0 \u00a0 }\n\n\t\/*M\u00e9todo insert que insere valores no banco de dados e retorna o \u00faltimo id inserido*\/\n\tpublic function insertDB($sql,$params=null){\n\t\t$conexao=$this-&gt;connect();\n\t\t$query=$conexao-&gt;prepare($sql);\n\t\t$query-&gt;execute($params);\n\t\t$rs = $conexao-&gt;lastInsertId() or die(print_r($query-&gt;errorInfo(), true));\n\t\tself::__destruct();\n\t\treturn $rs;\n\u00a0 \u00a0 }\n\n\t\/*M\u00e9todo update que altera valores do banco de dados e retorna o n\u00famero de linhas afetadas*\/\n\tpublic function updateDB($sql,$params=null){\n\t\t$query=$this-&gt;connect()-&gt;prepare($sql);\n\t\t$query-&gt;execute($params);\n\t\t$rs = $query-&gt;rowCount() or die(print_r($query-&gt;errorInfo(), true));\n\t\tself::__destruct();\n\t\treturn $rs;\n\u00a0 \u00a0 }\n\n\t\/*M\u00e9todo delete que exclu\u00ed valores do banco de dados retorna o n\u00famero de linhas afetadas*\/\n\tpublic function deleteDB($sql,$params=null){\n\t\t$query=$this-&gt;connect()-&gt;prepare($sql);\n\t\t$query-&gt;execute($params);\n\t\t$rs = $query-&gt;rowCount() or die(print_r($query-&gt;errorInfo(), true));\n\t\tself::__destruct();\n\t\treturn $rs;\n\u00a0 \u00a0 }\n}\n?&gt;<\/pre>\n<div class=\"spacesyntax\"><\/div>\n<p>Os m\u00e9todos insert, update e delete tem quase a mesma codifica\u00e7\u00e3o, eles recebem o comando SQL e e os par\u00e2metros ent\u00e3o o executa retornando o n\u00famero de linhas afetadas. A diferen\u00e7a \u00e9 que o m\u00e9todo insert retorna o \u00faltimo id inserido na tabela.<\/p>\n<p>Caso aconte\u00e7a algum erro ao tentar executar o comando esses m\u00e9todos retornam o erro.<\/p>\n<p>O m\u00e9todo select recebe o SQL, os par\u00e2metros e o nome de uma classe para o qual o m\u00e9todo transformar\u00e1 os dados da tabela em objetos. Para isso \u00e9 necess\u00e1rio criar uma classe de mapeamento VO (Value Objects) que receber\u00e1 esses dados.<\/p>\n<p>Caso n\u00e3o seja passado o nome de uma classe ele retorna um array de objetos.<\/p>\n<p>Assim como nos m\u00e9todos insert, update e delete, se acontecer algum erro o m\u00e9todo select retorna esse erro.<\/p>\n<p>Ficamos por aqui, at\u00e9 o pr\u00f3ximo artigo.<\/p>\n<\/div>\n<p>Fonte: Linha de C\u00f3digo &#8211; Artigos<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Nesse artigo vou mostrar como usar o PDO para conectar em um banco de dados em PHP orientado a objetos. Nesse exemplo estou usando o banco de dados MySQL. Vamos primeiramente criar um banco de dados chamado \u201cteste\u201d. Ver Listagem 1 Listagem 1: C\u00f3digo para criar um banco de dados no MySQL query CREATE DATABASE &hellip; <a href=\"https:\/\/leonardocotta.com.br\/?p=980\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">PDO em PHP Orientado a Objetos<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[50,20],"tags":[190,203,216],"class_list":["post-980","post","type-post","status-publish","format-standard","hentry","category-php","category-programacao","tag-objetos","tag-pdo","tag-poo"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts\/980","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=980"}],"version-history":[{"count":0,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=\/wp\/v2\/posts\/980\/revisions"}],"wp:attachment":[{"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/leonardocotta.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}