AULA 8 – CRIANDO UMA CLASSE EM PHP INTERAGINDO COM BANCO DE DADOS - COM RELACIONAMENTO ENTRE TABELAS Na grande maioria dos sistemas, faz-se necessário utilizar informações que estão armazenadas em uma determinada tabela, para serem gravadas em outras. Por exemplo: Se cadastrarmos um aluno na tabela alunos, precisamos das informações dos cursos cadastrados e associar este aluno a um dos cursos. Os alunos estão cadastradis em uma tabela e os cursos em outra. O que ligaria estes alunos a cada curso ? Seria através do código do curso. Ou seja, o código do curso da tabela cursos, irá relacionar-se com o código do curso da tabela alunos. É exatamente este modelo que veremos nas próximas aulas. Além da tabela cursos, vamos relacionar a tabela alunos com as seguintes tabelas: tipostatus e turno. Desta forma, teremos um modelo de cadastro um pouco mais complexa, e adaptável para outras realidades. O modelo da tela do cadastro de alunos está abaixo. Verifique se: o banco de dados academico está criado. Se no banco de dados estão as tabelas cursos, tipostatus, turno e alunos. 1 MODELAGEM DE RELACIONAMENTO ENTRE AS TABELAS Script das tabelas no banco de dados academico create table cursos ( codcurso serial primary key, nomecurso varchar(40) NOT NULL, CONSTRAINT un_curso UNIQUE (nomecurso) ) create table turnos ( codturno serial primary key, desturno varchar(20) NOT NULL, CONSTRAINT un_turnos UNIQUE (desturno) ) create table tipostatus ( codstatus serial primary key, descricao varchar(40) NOT NULL, CONSTRAINT un_status UNIQUE (descricao) ) Utilizando as telas já prontas, inclua alguns dados nas tabelas acima -------------------------------Tabela alunos: a tabela alunos deverá estar relacionada com as tabelas cursos, turnos e tipostatus create table alunos ( matricula integer primary key, nome varchar(60) NOT NULL, endereco varchar(60) NOT NULL, bairro varchar(20) NOT NULL, telefone integer, datanasc date, codcurso integer REFERENCES cursos (codcurso), codturno integer REFERENCES turnos (codturno), codstatus integer REFERENCES tipostatus (codstatus) ) 2 A classe Alunos terá praticamente os mesmos métodos da classe Cursos, sendo que todos os atributos mudam: CLASSE ALUNO - matricula: string + nomealuno: string + codcurso: integer + codturno: integer + codstatus: integer + endereco: string + bairro: string + cep: integer + telefone: integer + datanasc: date +Incluir() +Alterar() +Excluir() +Pesquisar() +Listar() Os métodos que farão parte da classe Alunos serão Incluir(), Alterar(), Excluir(), Pesquisar() e Listar(). Como disse, quase tudo será muito parecido com o que já fizemos no cadastro de cursos. Deverão ser criados : classe Alunos (class.alunos.php), o programa com a tela (cadalunos.php) e as regras (cadalunos_regras.php). De diferente do modelo inicial, temos o método Pesquisar(), que irá selecionar os campos de apenas um (1) aluno. A utilização do método Pesquisar() veremos em breve. IMPLEMENTAR A CLASSE ALUNO Vamos iniciar a construção da classe alunos. Como disse anteriormente, teremos praticamente os mesmos métodos da classe cursos, sendo que temos mais campos, e desta forma, mais atributos a serem declarados na classe. Passos a serem executados: 1) Declarar os atributos de acordo com o diagrama do início da página 2) Criar o método construtor, sabendo-se que a matricula é um atributo com visibilidade privada. 3) Criar o método para incluir os dados na tabela MÉTODO INCLUIR <?php include "conecta.inc"; class Aluno { // Declaraçao dos atrbutos private $matricula; public $nome; public $endereco; public $bairro; public $telefone; public $datanasc; public $codcurso; public $codturno; public $codstatus; // Método Construtor function __construct($matricula=NULL) { if ($matricula <> NULL) { 3 $this->matricula = $matricula; } } // Método para incluir dados // O comando SET DATESTYLE TO 'SQL, DMY'; formata os campos tipo date public function Incluir() { $sql = "SET DATESTYLE TO 'SQL, DMY'; INSERT INTO alunos (matricula, nome, endereco, bairro, telefone, datanasc, codcurso, codturno, codstatus) VALUES ($this->matricula, '$this->nome', '$this->endereco', '$this->bairro', $this->telefone, '$this->datanasc', $this->codcurso, $this->codturno, $this->codstatus )"; $res = @pg_query($sql); if (@pg_affected_rows($res) > 0) { // conta número de linhas afetadas return "Aluno incluido com sucesso !!!"; } else { return "Falha na inclusão !!!"; } } } IMPORTANTE Uma novidade, é na nossa modelagem termos acrescentado um campo do tipo DATE. Como existem problemas com formatação de data, um dos recursos que podemos utilizar é o comando SQL “SET DATESTYLE TO 'SQL, DMY';”. O comando SET DATESTYLE, que é um comando SQL, formata o estilo de data de acordo com o que desejarmos. No nosso caso, o nosso formato é dia/mes/ano (DMY). Existem outras formas de retornar uma data formatada, mas o importante é que seja feito, pois senão a data poderá retorna em formato americado (YMD). MÉTODOS ALTERAR E EXCLUIR Os métodos alterar e excluir deverão ter como condição executar o comando a partir de uma determinada matrícula. // Método para alterar dados da tabela public function Alterar() { $sql = "SET DATESTYLE TO 'SQL, DMY'; UPDATE alunos SET nome = '$this->nome', endereco = '$this->endereco', bairro = '$this->bairro', telefone = $this->telefone, datanasc = '$this->datanasc', codcurso = $this->codcurso, codturno = $this->codturno, codstatus = $this->codstatus WHERE matricula = $this->matricula"; $res = @pg_query($sql); if (@pg_affected_rows($res) > 0) { return "Aluno Alterado com sucesso !!!"; } else { return "Falha na Alteração !!!"; } } 4 // Método para excluir dados public function Excluir() { $sql = "DELETE FROM alunos WHERE matricula = $this->matricula"; $res = @pg_query($sql); if (@pg_affected_rows($res) > 0) { return "Matricula excluida com sucesso !!!"; } else { return "Falha na Exclusão !!!"; } } MÉTODO PESQUISAR Este método será construído para implementação na tela de cadastro de alunos. Será consultado todos os dados de 1 (um) aluno, a partir da matricula informada no formulário. // Método para selecionar os campos de apenas 1 aluno, de acordo com o valor do atributo matricula, retornando uma array com estes dados public function Pesquisar() { $sql = "SET DATESTYLE TO 'SQL, DMY'; SELECT matricula, nome, endereco, bairro, telefone, datanasc, codcurso, codturno, codstatus FROM alunos WHERE matricula = $this->matricula"; $res = @pg_query($sql); $dados = @pg_fetch_all($res); return $dados; } MÉTODO LISTAR Este método seleciona todos os dados da tabela, e retorna em formato array. Pode ser utilizado em uma consulta na tela ou em um relatório. Como vamos precisar das descrições das demais tabelas (cursos, tipostatus, turnos), teremos que selecionar os dados utilizando o INNER JOIN. // Selecionar todos os dados de uma tabela public function Listar() { $sql = "SET DATESTYLE TO 'SQL, DMY'; SELECT matricula, nome, endereco, bairro, telefone, datanasc, cur.codcurso, nomecurso, tur.codturno, desturno, stat.codstatus, descricao FROM alunos alu INNER JOIN cursos cur ON cur.codcurso=alu.codcurso INNER JOIN turnos tur ON tur.codturno=alu.codturno INNER JOIN tipostatus stat ON stat.codstatus=alu.codstatus ORDER BY nome"; $res = pg_query($sql); $dados = pg_fetch_all($res); return $dados; } Obs: No caso da tabela alunos, como existe relacionamento entre outras tabelas, estamos utilizando a junção INNER JOIN, para relacionar os dados entre as tabelas. 5 PROGRAMA PARA TESTAR A CLASSE ALUNOS Vamos criar um programa chamado testaraluno.php, onde iremos instanciar a classe, declarar os atributos e testar alguns métodos. <?php include "class.aluno.php"; $objeto = new Aluno(1); $objeto->nome = 'Aline'; $objeto->endereco = 'Rua talssss'; $objeto->bairro = 'Coisa e tal'; $objeto->telefone ='111'; $objeto->datanasc = '24/04/1994'; $objeto->codcurso = 1; $objeto->codturno = 1; $objeto->codstatus = 1; var_dump($objeto); $objeto->Incluir(); ?> EXERCÍCIO Para exercitar, criem uma classe chamada Professor, com praticamente os mesmos atributos e com os mesmos métodos. Faça também o programa para instanciar e testar a classe e seus méodos. CLASSE ALUNO - matricula: string + nomealuno: string + codcurso: integer + endereco: string + bairro: string + cep: integer + telefone: integer + datanasc: date +Incluir() +Alterar() +Excluir() +Pesquisar() +Listar() 6