You are on page 1of 43
DEFINIGAO Linguagem de Programagao PHP. Linguagem PHP. Linguagem de script PHP. Linguagem de Programagao Web PHP. Integracdo de PHP com banco de dados. Integragao de PHP com MySQL. Integragao de PHP com PostgreSQL. PDO. Classe PDO. Métodos da Classe PDO. Integragao entre HTML, PHP e banco de dados PROPOSITO Apresentar as funcionalidades da linguagem de programacao PHP para integrago com banco de dados, fazendo uso da extensao PDO — PHP Data Objetcs. PREPARACGAO Para aplicagao dos exemplos, sero necessarios: um editor de texto com suporte a marcagao PHP; um servidor web com suporte a linguagem PHP e com um SGBD instalado e configurado para ser utilizado com PHP; um aplicativo Cliente para acesso ao SGDB. Em relagao ao editor, no Sistema Operacional Windows, ¢ indicado o Notepad++. No Linux, o Nano Editor. Quanto ao servidor, recomenda-se o Apache. Sobre o SGDB devera ser utilizado o MySQL ou 0 PostgreSQL. Por fim, quanto ao aplicativo Cliente para acesso ao BD, recomenda-se DBeaver. OBJETIVOS MODULO 1 Definir a Classe PDO e sua utilizagao com MySQL e PostgreSQL MODULO 2 Descrever os principais métodos da Classe PDO MODULO 3 Construir uma aplicagao contendo um formulario HTML, uma tabela HTML e scripts PHP para insergao e listagem de dados em/de um SGDB INTRODUGAO ‘Ao longo deste tema, veremos como integrar o PHP com banco de dados fazendo uso da Classe PDO (PHP Data Objects), uma interface de acesso a databases. Veremos desde a sua instalagao, conceitos basicos, formas de utilizago com MySQL e PostgreSQL, a utilizagao de dois dos seus principais métodos. Tudo isso apoiados em exemplos praticos. Ao final deste tema, desenvolveremos um formulario HTML para a inclusao de informagdes em um banco de dados. Vamos comegar nossa jornada acessando os cédigos-fontes originais propostos para o aprendizado de PHP com PDO. Baixe o arquivo, descompactando-o em seu dispositive. Assim, vocé podera utilizar os cédigos como material de apoio ao longo do tema! MODULO 1 © Definir a Classe PDO e sua utilizagaéo com MySQL e PostgreSQL. SISTEMAS GERENCIADORES DE BANCOS DE DADOS Os bancos de dados sao 0 ponto central de muitos sites, sistemas e aplicativos. Tais estruturas permitem o armazenamento e recuperagao de qualquer tipo de informacao, desde dados simples, como os posts de um blog pessoal, a dados altamente sensiveis, como os dados bancarios ou financeiros, por exemplo. Nesse sentido, a linguagem de programagao PHP oferece amplo suporte a integracéo com bancos de dados, sejam relacionais ou nao, sejam suportados por diversos Sistemas Gerenciadores de Bancos de Dados (SGBD), como SQL Server, Oracle, MySQL e PostgreSQL - sendo esses dois ultimos normalmente associados ao PHP. PHP E uma linguagem interpretada livre, capaz de gerar contetido dindmico na internet. Inicialmente, antes de tratarmos da classe PDO e de sua utilizagao com dois dos principais SGBDs existentes, vamos observar um pouco mais esses sistemas e sua integragao com PHP. MYSQL © MySQL é um sistema de gerenciamento de banco de dados criado em 1995. Inicialmente de cédigo aberto, foi adquirido posteriormente pela Oracle, que, atualmente, mantém tanto uma verso GPL quanto uma versao comercial. Trata-se de um dos SGBDs mais utlizados na web, sendo, normalmente, associado ao PHP, dada a facilidade de conexio entre ambos. MySQv: Em PHP, esto disponiveis varios métodos e fungées, através da extensao que leva o mesmo nome do SGBD, para conexao e execugdo de instrugdes SQL no MySQL. Para fins de compatagao, o cédigo abaixo demonstra a conexao com o MySQL e a execugao de uma instrugao de consulta SQL utilizando as fungdes PHP especificas para o SGBD em questao. >?php //Constantes para armazenamento das variaveis de conex4o. define(‘HOST', '127.0.0.1'); define(DBNAME’, ‘test’); define(USER,, user’); define‘PASSWORD, 'psswd’); /iConectando com o Servidor Sconn = mysqli_connect(HOST, USER, PASSWORD, DBNAME) or die( ' Nao foi possivel conectar:'); /Realizando uma consulta no BD SinstrucaoSQL = ‘Select nome, cpf, telefone From Cliente"; Sstmt = mysqli_prepare(Sconn, SinstrucaoSQL); mysqli_stmt_bind_result($stmt, Snome, Sopf, Stel); mysqli_stmt_execute($stmt); while (mysqli_stmt_fetch($stmt)) { echo $nome . "\t"; echo Sepf. "\" echo Stel . "in", } Wncerrando a conexao mysqli_close(Sconn); POSTGRESQL O PostgreSQL ¢ um SGBD de cédigo aberto, atualmente disponivel sob a licenga BSD, criado em 1996. Enquanto o MySQL é um SGBD puramente relacional, o PostgreSQL é considerado um SGBD objeto-relacional. Na pratica, essa diferenga pode ser vista nas funcionalidades que © PostgreSQL possui, como a heranga de tabelas e a sobreposigao de fungdes. Outra diferenga importante é que o PostgreSQL adere de forma mais préxima aos padrées SQL. A linguagem PHP também possui uma série de métodos e fungées, habilitados através da extensao pgsqi, para conexao com o Postgres. A exemplo do que fizemos com o MySQL, vejamos um eédigo que utiliza fungdes PHP para conectar com o PostgresSQL e realizar uma instrugo SQL de consulta de dados. >?php //Constantes para armazenamento das varidveis de conexao. define‘HOST’, '127.0.0.1"); define(‘DBNAME., 'test’); define(‘USER’, 'user’); define(‘PASSWORD., 'psswa’); l/Conectando com o Banco de dados SstringConn = “host="HOST." dbname=".DBNAME." user=".USER." password=".PASSWORD; Sconn = pg_connect($stringConn) or die( ' Ocorreu um erro e nao foi possivel conectar ao banco de dados.' ); !/Realizando uma consulta no BD SinstrucaoSQL = "Select nome, cpf, telefone From Cliente"; Sresult = pg_query( $conn, SinstrucaoSQL ) or die(' Ocorreu um erro na execugao da instrugao: * SinstrucaoSQL ); lipg_query($dbcon, "SELECT id, nome FROM clientes"); Iiimprimindo os dados da consulta while (Srow = pg_fetch_array( $result )){ echo Srow'nome'] "\t echo $rowf'epf] echo Srowftelefone'] . "\n"; } //Encerrando a conexao pg_close($conn); CONCEITOS BASICOS DA LINGUAGEM DE PROGRAMAGAO PHP A linguagem PHP é uma linguagem server side, ou seja, atua no lado servidor, sobre um servidor web como 0 Apache, Nginx ou IIS, Trata-se de uma linguagem de script e que 6 gratuita, o que faz dela uma linguagem amplamente utilizada no Ambiente Web. Em relaco a sua sintaxe, é possivel combinar cédigo PHP com tags HTML, ou utilizar apenas cédigo PHP em um script. Tal cédigo deverd estar entre a tag inicial “” sendo essa Ultima nao obrigatéria, quando houver apenas cédigo PHP em um script. Tomando como base os exemplos de cédigo acima, temos alguns recursos da linguagem sendo utilizados. A seguir, esses recursos serao revistos. CONSTANTES As constantes so identificadores ou nomes que contém um valor Unico e imutavel, ao contrério das variéveis que, conforme o nome indica, possuem valor variével ao longo de um programa, No exemplo, foram declaradas constantes para armazenarem as credenciais de acesso ao SGBD. A sintaxe de utilizagao de constantes é composta pela palavra reservada DEFINE, seguida de parénteses, onde sao incluidos o nome da constante e o seu valor. VARIAVEIS As variaveis sao objetos, ou espagos reservados na meméria do computador, destinados a armazenarem e a exibirem os dados utilizados, e alterados, durante a execugéo de um programa, Em PHP, as variaveis so representadas por um $ seguido pelo seu nome, que é case- sensitive - ou seja, uma letra maitiscula é diferente de uma letra minuscula (Svar é diferente de 8Var). Em relagdo a declaragao e atribuigdo de valores, ambos os processos podem ocorrer ao mesmo tempo. Veja no ultimo exemplo que a varidvel $stringConn foi declarada (inserida pela primeira vez no cédigo) ao mesmo tempo que recebeu um valor (processo de atribuigao). Por Ultimo, as variéveis em PHP nao possuem tipo. Logo, nao ¢ necessario indicar o tipo de dado a ser armazenado por uma variavel ESTRUTURAS DE DECISAO E REPETIGAO Nos exemplos, foi vista a estrutura de repetigao while. Além dela, ha outras estruturas de repeticao disponiveis em PHP: do-while, fore foreach. A respeito das estruturas de decisdo, esto disponiveis em PHP: if, else, elseif e switch. ARRAYS Os arrays, ou vetores, so variéveis que guardam uma lista de itens relacionados. Tais varidveis sao compostas pelo par indice/valor. A variavel Srow, nos exemplos, é um array associativo, ou seja, seus indices sAo compostos por strings - o nome de cada coluna selecionada do banco de dados. Ha ainda os arrays numéricos e os hibridos (arrays com indices associativos e numéricos). FUNCGOES As fungées sao pedagos de cédigo que podem ser chamados a partir de qualquer parte do programa e que executam tarefas especificas. Além das fungées definidas pelo usuario, em PHP esto disponiveis inimeras fungées nativas. Em nossos exemplos, temos as fungdes define e echo, além das relacionadas a conexao e ao manuseio de dados, como mysql_connect ou pg_connect, mysql_query ou pg_query, entre outras. EXTENSOES, BIBLIOTECAS E CLASSES As extensées, bibliotecas e classes s4o um importante recurso presente na maioria das linguagens de programagao. Através delas, ¢ possivel estender as fungdes basicas de uma linguagem, adicionando novos recursos para a execugao de determinadas tarefas. Em relagao a definiggo, em PHP temos as extensdes, que sao arquivos binarios (no S.O Windows, as .dil, em 8.0.s unix-like, os .S0) que contém bibliotecas. Ja as bibliotecas so um conjunto de fungdes e/ou classes. As classes, entéo, dentro do paradigma de orientagdo a objetos, so um conjunto de cédigos compostos por atributos e métodos. Sdo exemplos de extensdes os drivers para os SGBDs MySQL e PostgreSQL, que, quando habilitados, permitem a sua utilizagao com o PHP. @ DICA Consulte o Manual do PHP para uma lista completa de todas as suas extensdes. PDO PDO, acrénimo para PHP Data Objects, ou Objetos de Dados PHP, e conforme definicao vista anteriormente, é uma classe contida dentro de uma biblioteca e, por consequéncia, dentro de uma extensdo. Ao referi-la, vamos chamé-la apenas de classe ao longo deste tema Trata-se de uma interface leve para acesso a bancos de dados em PHP. Nesse sentido, cabe a cada banco de dados implementar a interface PDO a fim de expor os seus recursos ¢ fungées especificos que, entao, ficardo disponiveis para serem utilizados através do cédigo PHP. L A 7 Camada de Abstracao t+ —— BSS @ Figura 1: Funcionamento da Camada de Abstragao Para utilizarmos a classe PDO, ¢ necessario habilitar sua extensao no servidor web, ou seja, habilitar a extensdo que contém o driver especifico para cada banco de dados com os quais se deseja trabalhar. @ DICA Em relagao instalagao e configuragdo da extensdo PDO e drivers mencionados, ha diversos tutoriais disponiveis na internet. Lembre-se de que esse processo é diferente de acordo com 0 Sistema Operacional utilizado. A segéio Explore + contém algumas referéncias base para esse processo. Come mostrado na Figura 1, assim como nos cédigos de exemplo relacionados a conexao e execugao de instrugdes préprios do MySQL e do PostgreSQL, vistos anteriormente, a principal vantagem em se utilizar PDO no lugar das fungdes nativas do PHP para cada SGBD é 0 fato dessa extensdo fornecer uma camada de abstragao de acesso a dados. Em outras palavras, isso significa que: E possivel utilizar os métodos e fungdes PDO independente do SGBD. Na pratica, e voltando aos cédigos PHP para integracao com cada SGBD, perceba que, se féssemos trocar o banco de dados utilizado, precisariamos também mudar algumas linhas de cédigo: as de conexéo com o banco de dados; as de execugdio de query, entre outras no vistas nos exemplos. Entretanto, fazendo uso do PDO, sé precisariamos mudar, nessa situagao, o nome do driver a ser utilizado ~ conforme poderd ser visto adiante. No mais, todas as fungées de execugao de query, de tratamento de resultados, e demais, permaneceriam exatamente iguais. DRIVERS PDO Atualmente, estao disponiveis 12 drivers PDO, ou seja, é possivel utiliza-lo com doze diferentes SGBDs. A tabela 1 ilustra os drivers e os bancos de dados suportados. PDO_CUBRID PDO_DBLIB PDO_FIREBIRD PDO_IBM PDO_INFORMIX PDO_MYSQL PDO_ocI PDO_ODBC. PDO_PGSQL SGBD Suportados ‘Cubrid FreeTDS / Microsoft SQL Server / Sybase Firebird IBM DB2 IBM Informix Dynamic Server MySQL 3.x/4.x/5.x Oracle Call Interface ODBC v3 (IBM DB2, unixODBC e win32 ODBC) PostgreSQL PDO_SQLITE SQLite 3 e SQLite 2 PDO_SQLSRV Microsoft SQL Server / SQL Azure PDO_4D 4D Atengdol Para visualizagaocompleta da tabela utilize a rolagem horizontal CONEXAO COM O SGBD UTILIZANDO PDO A primeira acdo necessaria ao trabalharmos com banco de dados é realizar a conexao com 0 proprio, Para isso, utilizamos o construtor da classe PDO, que ¢ responsvel por criar uma instancia de conexao. O fragmento abaixo demonstra a conexéio com MySQL e com 0 PostgreSQL. $dsn = new PDO("mysql:host=localhost;dbname=test”, $user, $pass); $dsn = new PDO("pgsql:host=localhost;dbname=test"; $user, $pass); Como pode ser visto, o que muda entre as duas instrugdes ¢ o nome do drive/SGBD. Na primeira, temos “mysql” e na segunda “pgsql’. Além disso, outras opgées/parémetros podem ser passadas no construtor, como a porta, por exemplo. PORTA Uma porta, em redes de computadores, tem a fungo de identificar aplicagées e processos a fim de permitir que eles compartilhem uma Unica conexéo com um determinado enderego IP. Nesse sentido, a porta padrao do Mysql é a 3306 e a do PostgreSQL a 5432 Reforgando 0 que foi dito, caso precisassemos alterar o SGBD usado em nosso projeto, so precisariamos modificar essas informagées acima e todo o restante do cédigo, relacionado ao database, permaneceria inalterado. TRATAMENTO DE EXCEGOES Uma boa pratica, em qualquer linguagem de programagao, é tratar as possiveis excegdes que possam ocorrer no cédigo. Cada linguagem possui uma sintaxe prépria, sendo muito comum na maioria a utilizagao da instrugao “try/catch” A maioria das linguagens de programagao conta com instrugdes especificas para o tratamento de excegées, Em linhas gerais, temos uma excegao que pode ser lancada e capturada, estando o respectivo cédigo envolvido por um bloco try, cuja sintaxe deve contar com, a0, menos, um bloco catch ou finally, Por fim, temos que o objeto langado, ou seja, a excecao, precisa ser uma instdncia ou subclasse da classe Exception Em relagao ao bloco catch, podemos ter varios relacionados a um bloco try, sendo cada um responsavel pelo tratamento de um tipo de exceco. Ja 0 contetido do bloco finally sera sempre executado apés o bloco try ou catch. © SAIBA MAIS Consulte por Excegées no Manual do PHP. O tratamento de excegées ¢ uma pratica recomendadissima em qualquer cédigo produzido. Além de informar ao usudrio ou mesmo ao desenvolvedor que um erro ocorreu € que, com isso, 0 programa nao funcionara de acordo com o esperado, 0 tratamento de excegdes possibilita também que outras partes do programa permanegam funcionais ou que o programa nao seja encerrado de forma inesperada, mesmo que um erro tenha ocorrido, A partir de um dos exemplos acima, poderiamos utilizar 0 seguinte cédigo, com tratamento de possiveis excecées, para realizar a conexao com o MySQL, por exemplo: getMessage(); } ENCERRAMENTO DE CONEXOES E CONEXOES PERSISTENTES Para encerrar uma conexdo aberta através de PDO, basta atribuir NULL a variavel que contém a instancia da classe, O mesmo deve ser feito com as varidveis que armazenam o resultado da execugao dos métodos que executam instrugdes SQL, como Exec e Query — que serao vistos mais adiante. A linha a seguir demonstra 0 encerramento da conexo aberta no cédigo anterior: W. $dsn = null; PDO oferece suporte a conexées persistentes — que, em linhas gerais, consiste em nao encerrar uma conexéo aberta com 0 SGBD ao final de execucao de um script. Com isso, & possivel fazer cache da conexo e reutiliza-la quando outros scripts requisitarem uma conexao semelhante (com as mesmas credenciais) a essa que ficou aberta. Para usar conexées persistentes em PDO, é necessério incluir um pardmetro a mais no momento de criagao da instancia. Veja como ficaria 0 nosso exemplo de conexéo com o PostgreSQL: true)); } catch (PDOException $e) { echo 'A conexao falhou e retornou a seguinte mensagem de erro: } Se->getMessage(); No video a seguir, o especialista fard um resumo do médulo, descrevendo brevemente a classe PDO com ilustragéo da Figura 1 e demonstrando a conexdéo do PHP com MySQL e PostgreSQL, usando recursos de captura de telas. PDO E SUA CONEXAO COM MYSQL E POSTGRESQL Um resumo sobre PDO e sua conexao com MySQL e PostgreSQL VERIFICANDO O APRENDIZADO MODULO 2 © Descrever os principais métodos da Classe PDO ORIENTAGAO A OBJETOS EM PHP Como mencionado, uma classe, em linguagens de programacao, é um conceito vinculado ao paradigma de orientagao a objetos. Logo, antes de descrever a classe PDO e seus métodos e, para um melhor entendimento, serdo descritos os conceitos basicos de OO em PHP. paradigma de orientagao a objetos, na engenharia de software, representa uma mudanga na forma de se construir programas: no lugar de um conjunto de procedimentos e variaveis agrupados por determinado contexto ou objetivo, muitas vezes, ndo organizados adequadamente, na 0.0. temos uma visdo mais préxima ao mundo real representada por objetos e estruturas (classes) com as quais temos maior familiaridade. CLASSES E OBJETOS Esses dois elementos sao a base da programagao orientada a objetos. As classes podem ser definidas como estruturas que definem um tipo de dados e podem ser compostas por atributos (vatiaveis) e por fungdes (métodos). Em alusdo ao mundo real, so exemplos de classes: pessoas, produtos, veiculos, iméveis etc. Assim como no mundo real, essas classes so compostas por caracteristicas — os seus atributos. Por exemplo: uma pessoa possui nome, data de nascimento, CPF etc. Para acessar essas caracteristicas, utilizamos métodos. Veja a representagao dessa classe na figura abaixo: Pessoa Nome Data de nascimento CPF calculaldade() imprimeDadosPessoa() Figura 2: Diagrama de Classes — Classe Pessoa. A partir dessa Classe, poderiamos construir novas classes que compartilhassem os mesmos atributos ¢ funcionalidades que a Classe Pessoa, além de poderem possuir propriedades e fungdes proprias. Veja esse novo exemplo: Pessoa Nome CEP Endereco calculaldade() imprimeDadosPessoa() + T Cliente Funciondrio Data de cadastro Data de Admissao Data Primeira Compra cargo Figura 3: Diagrama de Classes — Exemplo de Heranga entre Classes. Esse compartilhamento de atributos e comportamentos, na orientagao a objetos, recebe o nome de heranga. Logo, dentro desse conceito, é possivel criar classes, como as classes Cliente e Funcionario, que além de herdarem caracteristicas de uma classe “pai", possuem ainda suas préprias caracteristicas distintas — data de cadastro e data da primeira compra, em Cliente e data de admissao e cargo, em Funcionario. HA muito mais a ser visto sobre orientagao a objetos. As consideragées acima foram apresentadas de maneira resumida, a fim de iniciar esse assunto, ou mesmo revisa-lo, uma vez que utilizaremos alguns desses conceitos a seguir, quando abordarmos a Classe PDO, seus atributos e propriedades. Por fim, abaixo so demonstrados exemplos praticos, em PHP, da criagdo de classes e instanciagao de objetos de uma classe. Entre cada exemplo, esto presentes explicagées adicionais. Note ainda os comentérios inseridos no cédigo, pois eles contém algumas informagées extras. nome = $nome; } public function getNome() { return Sthis->nome; } public function setTipo(Stipo) { Sthis->tipo = Stipo; } public function getTipo() { return Sthis->tipo; } } A partir dessa estrutura, a Classe “Fruta’, podemos declarar varios objetos “filhos” / provenientes dela mesma, Esses objetos também séo chamados de instdncias e contém valores distintos, uma vez que a estrutura é dinmica, O préximo fragmento de exemplo demonstra a criagao de alguns objetos oriundos da Classe “Fruta”, setNome("morango"); Sfruta1->setTipo("vermelha"); Sfruta2 = new Fruta(); Sfruta2->setNome("laranja"); Sfruta2->setTipo("citrica"); Como visto no cédigo acima, a criagdo de novas “frutas”, ou de objetos da classe “Frutas”, 6 feita com a criagdo de uma variével que recebe 0 operador “new” seguido do nome da Classe. A partir desse ponto, essa varidvel em questo torna-se uma instancia da classe. Na pratica, essa instancia possui os mesmos atributos e propriedades da classe da qual se originou A CLASSE PDO E SEUS METODOS A classe PDO é dividida em duas classes: a propria PDO e a PDOStatement. Enquanto a primeira contém métodos para conexao com os SGBDs, para o controle de transagdes e execugao de queries; a segunda, PDOStatement, contém outros métodes relacionados as instrugdes executadas e ao seu retorno. Os cédigos a seguir mostram as estruturas dessas classes. PDO{ public __construct ( string $dsn [, string Susername [, string Spasswd [, array Soptions ]]] ) public beginTransaction ( void ) : bool public commit ( void ) : bool public errorCode ( void ) : string public errorinfo ( void ) : array public exec ( string Sstatement ) : int public getAttribute ( int Sattribute ) : mixed public static getAvailableDrivers ( void ) : array public inTransaction ( void ) : bool public lastinsertid ({ string $name = NULL }) : string public prepare ( string $statement [, array Sdriver_options = array() ] ): PDOStatement public query ( string $statement ) : PDOStatement public quote ( string $string [, int $parameter_type = PDO::PARAM_STR ]) : string public rollBack ( void ) : bool public setAttribute ( int Sattribute , mixed Svalue ) : bool } PDOStatement implements Traversable { * Propriedades */ readonly string SqueryString; [* Métodos */ public bindColumn ( mixed Scolumn , mixed &$param [, int $type [, int Smaxlen [, mixed Sdriverdata ]]} ): bool public bindParam ( mixed Sparameter , mixed &$variable [, int Sdata_type = PDO::PARAM_STR [. int Slength [, mixed $driver_options ]]] ) : bool public bindValue ( mixed Sparameter , mixed $value [, int $data_type = PDO::PARAM_STR }): bool public closeCursor ( void ) : bool public columnCount ( void ): int public debugDumpParams ( void ) : void public errorCode ( void ) : string public errorinfo ( void ) : array public execute ([ array Sinput_parameters = NULL ] ): bool public fetch ([int Sfetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int Scursor_offset = 0 JJ] ): mixed public fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array Sctor_args = array() Jl] ) array public fetchColumn ({ int Scolumn_number = 0] ) : mixed public fetchObject ([ string $class_namé public getAttribute ( int attribute ) : mixed public getColumnMeta ( int $column ) : array "stdClass" [, array $ctor_args J] ): mixed public nextRowset ( void ) : bool public rowCount ( void ) : int public setAttribute ( int Sattribute , mixed Svalue ) : bool public setFetchMode ( int Smode ) : bool } METODO EXEC Esse método pertencente 4 classe PDO, executa uma instrugao SQL e retorna o numero de linhas afetadas pela instruao. Sua sintaxe pode ser vista a seguir: exec("Delete From Cliente Where codigo_cliente = 1"); echo "Quantidade de linhas afetadas: " . SqtdeLinhasAfetadas cédigo acima é funcional e complementar ao cédigo anterior, uma vez que o método Exec deve ser invocado a partir da instancia para a classe PDO (correspondente a variavel Sdsn em nosso cédigo). Em relago as linhas afetadas, tal informagao ¢ util para confirmarmos se a operagao foi executada com sucesso. Logo, podemos utilizar uma estrutura de decisdo, como “if, para verificar 0 contetido da variavel SqtdeLinhasAfetadas. Caso nenhuma linha tenha sido afetada, sera retornado 0 (zero). Além disso, Exec pode retornar ainda 0 booleano FALSE ou entéo (vazio).. Por fim, cabe destacar que esse método nao retorna a quantidade de linhas afetadas quando for executada uma instrugao SELECT ~ 0 que pode ser feito através do proximo método que veremos, 0 Query. METODO QUERY O método Query, também pertencente a classe PDO, tem fungdo parecida com o método Exec. Entretanto, ele, além de executar uma instrugao SQL, retorna - quando houver - um conjunto de resultados (result set) como um objeto PDOStatement. Em caso de falhas, é retornado 0 booleano FALSE. Vejamos um exemplo de sua utilizagao: query($sql); while (Srow = SresultSet->fetch()) { echo Srow['nome'] . "it"; echo $rowf'epf] . "\ echo $rowftelefone') . "\ } Perceba que, como o método retorna um objeto, é possivel acessar seus indices na forma de indices de array. Para isso, foi utilizado 0 método fetch, um lago while que percorreu o result set retornado, imprimindo os dados selecionados. A respeito do método fetch, que retorna um result set no formato de array numérico e associativo, ha ainda outros disponiveis: 0 fetchAll, fetchColumn e fetchObject. Além disso, esse método pode receber como parametro o tipo de retorno, ou seja, se devera retornar um array associativo, numérico, associativo e numérico (que ¢ 0 seu padrao por omissao), entre outros, Veja o exemplo de sua utilizagdo retornando um array associativo: fetch(PDO::FETCH_ASSOC)) { Mase } OUTROS METODOS IMPORTANTES Além desses dois métodos apresentados, as Classes PDO e PDOStatment possuem outros importantes métodos, como o Prepare e o Execute, por exemplo. Considerando a sintaxe desses dois métodos, em comparagao com o que vimos dos métodos Exec e Query, é boa pratica fazer uso de ambos no lugar dos dois primeiros. Para embasar tal afirmagao, veremos alguns conceitos extras, a comegar pelo SQL Injection. SQL INJECTION © SQL Injection, ou Injegdo de SQL, é um tipo de ataque baseado na manipulagdo e alteragéo de instrugdes SQL. Tal ataque é possivel devido a vulnerabilidades encontradas em aplicagdes @ sistemas que aceitam dados de entrada sem fazer o devido tratamento, além de executarem a conexo e instrugdes SQL utilizando usuarios com privilégios altos, Vejamos um exemplo pratico, normalmente utilizado em formularios de login, onde poderia ser aplicada uma injegdo de SQL. getMessage(); } !/Realizando uma consulta no BD através do login e senha recebidos por POST Slogin = $_POSTTlogin}}; Spswd = $_POST[pswd']; Sstmt = $dsn->prepare("Select * From Usuario Where login = :login And password = :password"); Sstmt->execute(('slogin' => $login, password’ => $pswd]); /*Aqui entraria 0 cédigo para tratar o resultado da instrugao SQL acima*/ //Destruindo 0 objecto statement e fechando a conexdo $stmt = null; $dsn = null; @ DICA Repare no cédigo que o método prepare recebe como parmetro a instrugao SQL a ser executada e que, nos lugares onde seriam utilizadas as variaveis PHP com os valores. provenientes do formulario HTML, sao usadas outras variaveis, chamadas parametros nomeados (named parameters). A seguir, o método execute faz 0 vinculo (bind) entre os named parameters e as varidveis PHP. O mesmo cédigo acima poderia ser executado tendo o sinal de interrogagao "?” no lugar dos pardmetros nomeados. Veja como ficaria esse fragmento de cédigo prepare("Select * From Usuario Where login = ? And password = 7 $stmt->execute([Slogin, Spswa]); W. UM POUCO DE PRATICA fim de melhor assimilar 0 contetido apresentado até aqui, chegou a hora de praticar. Todos 08 cédigos anteriores, usados como exemplos, sao funcionais. Logo, a comegar pelo cédigo responsavel pela conexao com 0 SGBD (e tomando 0 cuidado de alterar as credenciais, nas constantes PHP, para refletirem os dados de seu ambiente), copie e execute cada um deles relacionados a classe PDO. Veja, por exemplo, as diferengas, na pratica, entre os métodos Exec e Query; entre esses dois métodos e os métodos Prepare e Execute. Tente realizar uma mesma consulta ou instrugdo SQL usando os dois e analise 0 resultado. & RESUMINDO - Inclua, ao menos, uma instrugo para cada tipo possivel: insert, update delete e select; - Faga o tratamento de erros e excegées; - Veja onde é possivel melhorar os cédigos utilizados. Vocé pode, por exemplo, incluir algumas verificagdes extras etc A seguir 0 especialista demonstrara a execugao de cédigos apresentados no médulo, com consultas SELECT e manipulagao de dados INSERT, UPDATE e DELETE. Assista ao video. UM POUCO DE PRATICA VERIFICANDO O APRENDIZADO MODULO 3 © Construir uma aplicagao contendo um formulario HTML, uma tabela HTML e scripts PHP para insergao e listagem de dados em/de um SGDB PREPARACGAO Este médulo tera carater pratico. Logo, todos os conceitos vistos nos médulos anteriores serao utilizados na confecgdo de um Formulério HTML, que enviar dados para um script PHP que 0s inserira em um SGBD ~ nesse caso, no PostgreSQL, e de uma pagina para listagem desses mesmos dados. Cada etapa desse proceso sera apresentada em detalhes, desde a criagao das tabelas no SGBD, passando pela criagao do formulario HTML e chegando nos scripts PHP que farao a conexao e insergdo dos dados através das classes PDO e PDOStatement. MOTIVAGAO Deverd ser criado um formutario para armazenar os dados de clientes, contendo o seu nome completo (obrigatério), 0 seu CPF (obrigatério; apenas os ntimeros), um enderego de e-mail Valido (obrigatério) e sua data de nascimento (obrigatério; dia, més e ano). Além disso, deverd ser criada uma listagem para exibi¢do dos clientes cadastrados. ESQUEMATIZANDO O BANCO DE DADOS Os dados dos clientes deverdo ser armazenados em uma tabela. Tal tabela deverd possuir um campo identificador, autoincremental e unico. A instrugao SQL abaixo contém um exemplo de como a tabela cliente pode ser criada CREATE TABLE cliente ( id_cliente serial NOT NULL, nome_cliente varchar(255), cpf_cliente varchar(11), email_cliente varchar(255), data_nascimento_cliente timestamp, PRIMARY KEY (id_cliente) y @ DICA A sintaxe completa da instrugao “Create Table", para o PostgreSQL, pode ser vista em seu préprio manual CONFECCIONANDO O FORMULARIO HTML O formulario HTML devera ser escrito utilizando a HTMLS. Além disso, os campos deverdo ser validados de acordo com seu tipo (quando possivel), tamanho e obrigatoriedade de preenchimento. Poderd ser utilizado um framework CSS, como o Bootstrap, para uma melhor apresentagao do cadastro. cédigo do formulario poder ser visto ao final deste médulo, junto aos demais exemplos de cédigo. Tal cédigo podera ser usado como template para desenvolvimentos similares. CONSIDERAGOES SOBRE O FORMULARIO HTML O formulario HTML possui elementos de ligagao com o script PHP para o qual sera submetido. Atabela 1 apresenta esses elementos, seus atributos e uma breve descrigao. Oe Curd Contém a URL ou nome do script, quando na mesma pasta que o form action sim arquivo HTML, que processara 0 documento. Nao. O Define 0 método HTTP a ser utilizado form method padrao & para transmissao dos dados - GET ou POST POST. Contém o nome do campo que sera ; recebido no PHP como indice input name sim associativo no array $_GET, $_ POST ou $_REQUEST. button ou type sim valor ‘submit’, atribuido ao atributo input type em um desses campos, cria o evento de envio do formulario. Atengao! Para visualiza¢aocompleta da tabela utilize a rolagem horizontal Em termos de boas praticas, é recomendado validar os dados a serem submetidos tanto no lado cliente, ou seja, no cédigo HTML diretamente, com a utilizagéo dos recursos introduzidos pela HTMLS, ou através de Javascript, assim como no lado servidor. Com isso, caso a validagao falhe, por algum motivo, do lado cliente, teremos a garantia de validagao do lado servidor. Veremos a seguir como realizar a validagao de nosso formulario nos dois ambientes — cliente e servidor. VALIDAGAO NO LADO CLIENTE — HTML5 A partir da HTMLS, 6 possivel marcar um elemento como de preenchimento obrigatério fazendo uso do atributo required. No cédigo do formulatio, visto ao final deste médulo, os campos “Nome”, “CPF”, “Enderego de E-mail’ e “Data de Nascimento” receberam esse atributo. Além disso, foram incluidas outras regras de validago: o campo CPF precisa ter exatos 11 caracteres (definidos com 0 uso dos atributos minlength e maxlength) e o enderego de e-mail precisa ser valido — tal validagao ¢ feita diretamente pela HTML, ao definirmos a tag sendo do tipo (type) “email” VALIDAGAO NO LADO CLIENTE — JAVASCRIPT Para validar formulérios, antes da HTMLS, era necessétio utilizar fungdes em cédigos escritos na linguagem Javascript. Com isso, 0 formulario verificado e, caso passe pelas validagées, submetido ao servidor. Do contratio, a respectiva mensagem de falha é exibida, para as devidas corregdes. A validagao do nosso formulario, utilizando Javascript, pode ser vista no cédigo abaixo. function validarFormulario(formulario){ if(formulario.nome_cliente. value === "|| formulario.nome_cliente.valui null) { alert("O campo Nome nao pode ficar vazio."); formulario.nome_cliente.focus(); return false; } if(formulario.cpf_cliente.value.length != 11) { alert("O campo CPF precisa ter 11 caracteres.”") formulario.cpf_cliente.focus(); return false; } H/o campo e-mail precisa ser valido, ou seja, deve : "@en" if(formulario.email_cliente. value.indexOf("@") == ~1 || formulario.email_cliente.value.indexOf(".") 1) alert("O campo E-mail nao ¢ valido."); formulario.email_cliente.focus(); return false; } if(formulario.data_nascimento_cliente.value = null) { " || formulario.data_nascimento_cliente.value alert("O campo Data de Nascimento nao pode ficar vazio."); formulario.data_nascimento_cliente.focus(); return false; } } Para utilizar a fungao Javascript acima, é necessario mudar um pouco o cédigo do arquivo HTML que contém o formulario, removendo os atributos da HTMLS, modificando 0 DocType para uma versdo anterior da HTML, entre outros ajustes. Para facilitar, 0 cédigo completo desse arquivo HTML foi adicionado ao final, junto aos demais cédigos. CODIFICANDO O SCRIPT PHP QUE PROCESSARA O FORMULARIO O script PHP definido no atributo “action” da tag ‘form’, no arquivo HTML, é o responsavel por receber os dados do formulério, validar os dados recebidos, conectar com o banco de dados & inserir as informagdes. O atributo method, do formulario HTML, define o método HTTP utilizado para a transmissao dos dados — POST ou GET, sendo POST 0 valor padrao, caso esse atributo seja omitido no formulério. Para tratar os dados transmitidos por cada um desses métodos, ha uma variavel global pré-definida em PHP: $_POST e $_GET. Além disso, ha também a variavel $_REQUEST, que recebe os dados transmitidos por ambos os métodos. Essas variveis pré-definidas so, na verdade, um array associativo, cujos indices equivalem ao valor definido para o atributo name, em cada campo do formulario. Logo, se um input no formulério HTML for definido com “name=nome_cliente”, em PHP ele podera ser lido dessa forma: $_REQUEST[nome_cliente’] - ou através de $_POST['nome_cliente’] ou $_GET[nome_cliente’], dependendo do método utilizado. @ DICA Normalmente, em cendrios reais, sao utilizados padrées de projeto, como 0 MVC (Model-View- Controller), e paradigmas como a Orientagao a Objetos, para realizar a integracao entre a HTML, o PHP e o Banco de Dados. Tais questées foram deixadas de lado em nosso cenario, por estarem fora do escopo deste tema. Entretanto, 6 recomendado estudar sobre esses padrées e paradigmas a fim de aplica-los, garantindo assim maior qualidade ao cédigo gerado, além de outros beneficios. O soript PHP que processa o formuldrio pode ser visto ao final deste médulo. Tal script realiza a conexao com 0 SGBD PostgreSQL, prepara a instrugao SQL com o método Prepare e os insere no banco de dados através do método Execute. Mais adiante, é realizada uma Verificagao e, em caso de sucesso ou erro, exibida uma mensagem correspondente. Por fim, tanto a instancia de conexéo PDO quanto 0 objeto PDOStatement sao encerrados. LISTANDO OS DADOS CADASTRADOS Embora o objetivo principal fosse o formulario de insergao de dados no SGBD, é interessante vermos também a recuperagao de informagées e exibigdo em uma pagina HTML. Como dito, embora funcional, 0 cédigo utilizado para listagem das informagdes tem carater apenas de estudo. Em situagdes reais, uma série de cuidados, tanto estéticos como de padrées de codificagao, devem ser utilizados Nosso cédigo de exemplo, que pode ser visto ao final do médulo, é composto por uma tinica pagina PHP contendo, tanto oddigos de programagao, quanto elementos HTML. Veja 0 cédigo base no exemplo, CODIGOS DE EXEMPLO CODIGO DO FORMULARIO HTML PARA INSERCAO DE CLIENTES title>Formulario HTML - Cadastro de Clientes iewport" content="width=device-width, initial-scale=1.0">

Cadastro de Clientes

Cadastro de Clientes