Advertisement
  1. Code
  2. PHP

POO do Mundo Real Com PHP e MySQL

Scroll to top
Read Time: 12 min

() translation by (you can also view the original English article)

Inúmeros exemplos, de robôs a bicicletas, têm sido oferecidos como explicações "fáceis" sobre o que é Programação Orientada a Objetos (POO). Eu optei por mostrar como a POO trabalha com um exemplo da vida real, para programadores. Criando uma classe CRUD MySQL, você pode facilmente criar, ler, atualizar e excluir entradas em qualquer um dos seus projetos, independentemente de como o banco de dados é projetado.

Configurar o esqueleto de nossa classe é bastante simples quando entendemos exatamente do que precisamos. Primeiro, precisamos ter certeza de que podemos executar nossas funções MySQL básicas. Para fazer isso, precisamos das seguintes funções:

  • Select
  • Insert
  • Delete
  • Update
  • Connect
  • Disconnect

Elas parecem bastante básicas, mas tenho certeza de que, conforme avançamos, vamos perceber que muitas delas utilizam alguns aspectos semelhantes, por isso poderemos ter de criar mais classes. A definição da classe deve ficar conforme abaixo. Observe que os métodos foram criados com a palavra chave public.

1
class Database
2
{
3
  public function connect()	{	}
4
	public function disconnect()	{	}
5
	public function select()		{	}
6
	public function insert()		{	}
7
	public function delete()		{	}
8
	public function update()	{	}
9
}

public function connect()

Esta função será bastante básica, mas criá-la vai exigir que algumas variáveis sejam criadas primeiro. Como queremos ter certeza de que elas não podem ser acessadas ​​de fora da classe, vamos defini-las como privadas. Essas variáveis ​​serão usados ​​para armazenar o host, nome de usuário, senha e banco de dados para a conexão. Já que elas vão permanecer constantes, não precisamos nem mesmo criar métodos para acessá-las ou modificá-las. Depois disso, só precisaríamos criar um comando mysql simples para conectar ao banco de dados. É claro, já que, como programadores, sempre temos que assumir que o usuário (mesmo que seja nós mesmos) poderá fazer algo estúpido, vamos adicionar uma camada extra de precaução. Podemos verificar se o usuário já se conectou ao banco de dados anteriormente e, em caso afirmativo, não há realmente necessidade de reconectar. Se não, podemos usar suas credenciais para conectar.

1
private db_host = ‘’; 
2
private db_user = ‘’; 
3
private db_pass = ‘’; 
4
private db_name = ‘’; 
5
6
public function connect()
7
    {
8
        if(!$this->con)
9
        {
10
            $myconn = @mysql_connect($this->db_host,$this->db_user,$this->db_pass);
11
            if($myconn)
12
            {
13
                $seldb = @mysql_select_db($this->db_name,$myconn);
14
                if($seldb)
15
                {
16
                    $this->con = true; 
17
                    return true; 
18
                } else
19
                {
20
                    return false; 
21
                }
22
            } else
23
            {
24
                return false; 
25
            }
26
        } else
27
        {
28
            return true; 
29
        }
30
    }

Como você pode ver, ela faz uso de algumas funções mysql básicas e um pouco de verificação de erros para garantir que as coisas estão indo conforme planejado. Se conectar ao banco de dados com sucesso, a função retornará true. Caso contrário, retornará false. Como um bônus, também irá atribuir true à variável de conexão se a conexão tiver sido concluída com sucesso.

public function disconnect()

Esta função irá simplesmente verificar se nossa variável de conexão está definida como verdadeira. Se estiver, isso significa que há conexão com o banco de dados, e nosso script irá desconectar e retornar true. Se não, então não é necessário fazer nada.

1
public function disconnect()
2
{
3
	if($this->con)
4
	{
5
		if(@mysql_close())
6
		{
7
                       $this->con = false; 
8
			return true; 
9
		}
10
		else
11
		{
12
			return false; 
13
		}
14
	}
15
}

public function select()

Esta é a primeira função em que as coisas começam a ficar um pouco complicadas. Agora estaremos lidando com receber argumentos do usuário e retornar os resultados corretamente. Já que não necessariamente usaremos os resultados imediatamente, introduziremos também uma nova variável chamada result, que irá armazenar os resultados de maneira adequada. Além disso, também vamos criar uma nova função que verifica se uma determinada tabela existe no banco de dados. Já que todas as nossas operações CRUD vão exigir essa funcionalidade, faz mais sentido criá-la separadamente em vez de integrá-la na função. Desta forma, vamos economizar espaço em nosso código e, assim, seremos capazes de otimizar melhor as coisas mais tarde. Antes de ir para a função select, aqui está a função tableExists e a variável privada result.

1
private $result = array(); 
2
3
private function tableExists($table)
4
    {
5
        $tablesInDb = @mysql_query('SHOW TABLES FROM '.$this->db_name.' LIKE "'.$table.'"');
6
        if($tablesInDb)
7
        {
8
            if(mysql_num_rows($tablesInDb)==1)
9
            {
10
                return true; 
11
            }
12
            else
13
            { 
14
                return false; 
15
            }
16
        }
17
    }

Esta função simplesmente verifica o banco de dados para ver se a tabela já existe. Se a tebela existir, a função retornará verdadeiro e, se não, retornará falso.

1
public function select($table, $rows = '*', $where = null, $order = null)
2
    {
3
        $q = 'SELECT '.$rows.' FROM '.$table;
4
        if($where != null)
5
            $q .= ' WHERE '.$where;
6
        if($order != null)
7
            $q .= ' ORDER BY '.$order;
8
        if($this->tableExists($table))
9
       {
10
        $query = @mysql_query($q);
11
        if($query)
12
        {
13
            $this->numResults = mysql_num_rows($query);
14
            for($i = 0; $i < $this->numResults; $i++)
15
            {
16
                $r = mysql_fetch_array($query);
17
                $key = array_keys($r); 
18
                for($x = 0; $x < count($key); $x++)
19
                {
20
                    // Verifica as chaves para permitir somente valores alfanuméricos

21
                    if(!is_int($key[$x]))
22
                    {
23
                        if(mysql_num_rows($query) > 1)
24
                            $this->result[$i][$key[$x]] = $r[$key[$x]];
25
                        else if(mysql_num_rows($query) < 1)
26
                            $this->result = null; 
27
                        else
28
                            $this->result[$key[$x]] = $r[$key[$x]]; 
29
                    }
30
                }
31
            }            
32
            return true; 
33
        }
34
        else
35
        {
36
            return false; 
37
        }
38
        }
39
else
40
      return false; 
41
    }

Embora pareça um pouco assustadora à primeira vista, esta função faz diversas coisas. Primeiro, ela aceita quatro argumentos, um dos quais é obrigatório. O nome da tabela é a única coisa que você precisa passar para a função a fim de obter resultados. No entanto, se você quiser personalizá-la um pouco mais, pode fazê-lo adicionando as linhas que serão consultadas no banco de dados, e até mesmo adicionar cláusulas where e order. Passando apenas o primeiro parâmetro, o resultado será retornado de acordo com os valores pré-definidos para os demais argumentos, de modo que você não precisa se preocupar em passar todos eles. O trecho de código logo após os argumentos apenas serve para compilar todos os nossos argumentos em uma instrução select. Uma vez feito isto, a verificação é feita para ver se a tabela existe, usando a nossa função tableExists. Se existir, a função continua e a consulta é executada. Se não existir, ela irá falhar.

A próxima seção é a verdadeira magia do código. O que ela faz é reunir as colunas e os dados que foram solicitados ao banco de dados, atribuindo-os a nossa variável result. No entanto, para tornar mais fácil para o usuário final, em vez de chaves numéricas, os nomes das colunas são usados. No caso de haver mais de um resultado, as linhas retornadas são armazenadas em uma matriz bidimensional, sendo o primeiro índice numérico e o segundo, o nome da coluna. Se apenas um resultado é retornado, um array é criado tendo os nomes das colunas como índice. Se nenhum resultado for retornado, a variável de resultado é definida como nula. Como eu disse anteriormente, parece um pouco confuso, mas quando quebramos as coisas em suas seções individuais, pode-se ver que elas são bastante simples.

public function insert()

Esta função é muito mais simples que a anterior. Ela simplesmente nos permite inserir informações no banco de dados. Nesse contexto, vamos precisar de um argumento adicional além do nome da tabela. Vamos requerir uma variável que corresponda aos valores que desejamos inserir. Podemos simplesmente separar cada valor com uma vírgula. Assim, tudo o que precisamos fazer é verificar rapidamente se a tabela existe e, em seguida, utilizar nossos argumentos para formar uma instrução de inserção. Basta, então, executar a consulta.

1
public function insert($table,$values,$rows = null)
2
    {
3
        if($this->tableExists($table))
4
        {
5
            $insert = 'INSERT INTO '.$table;
6
            if($rows != null)
7
            {
8
                $insert .= ' ('.$rows.')'; 
9
            }
10
11
            for($i = 0; $i < count($values); $i++)
12
            {
13
                if(is_string($values[$i]))
14
                    $values[$i] = '"'.$values[$i].'"';
15
            }
16
            $values = implode(',',$values);
17
            $insert .= ' VALUES ('.$values.')';
18
            $ins = @mysql_query($insert);            
19
            if($ins)
20
            {
21
                return true; 
22
            }
23
            else
24
            {
25
                return false; 
26
            }
27
        }
28
    }

Como você pode ver, esta função é muito mais simples do que a nossa bastante complexa função select. Nossa função delete será ainda mais simples.

public function delete()

Esta função simplesmente apaga uma tabela ou uma linha do nosso banco de dados. Assim, devemos passar o nome da tabela e uma opcional cláusula where. A cláusula where nos permitirá saber se devemos excluir uma linha ou a tabela inteira. Se a cláusula where é passada, significa que as entradas correspondentes no banco devem ser eliminadas. Depois de cuidarmos disso tudo, é apenas uma questão de compilar e executar nosso comando delete.

1
public function delete($table,$where = null)
2
    {
3
        if($this->tableExists($table))
4
        {
5
            if($where == null)
6
            {
7
                $delete = 'DELETE '.$table; 
8
            }
9
            else
10
            {
11
                $delete = 'DELETE FROM '.$table.' WHERE '.$where; 
12
            }
13
            $del = @mysql_query($delete);
14
15
            if($del)
16
            {
17
                return true; 
18
            }
19
            else
20
            {
21
               return false; 
22
            }
23
        }
24
        else
25
        {
26
            return false; 
27
        }
28
    }

E finalmente chegamos à nossa última grande função. Esta função serve apenas para atualizar uma linha no banco de dados com novas informações. No entanto, devido a sua natureza um pouco mais complexa, ela será um pouco maior e infinitamente mais confusa. Não tenha medo: ela segue, em grande parte, o mesmo padrão das funções anteriores. Primeiro, ela usará nossos argumentos para criar uma instrução de update. Vai, então, prosseguir verificando o banco de dados para se certificar de que a tabela existe. Se ela existir, a função irá simplesmente atualizar a linha apropriada. A parte difícil, é claro, vem quando tentamos criar a instrução de atualização. Uma vez que a instrução de update tem regras para atualizar múltiplas entradas (isto é, colunas diferentes na mesma linha, através do uso de vírgulas), teremos de criar uma maneira de lidar com isso. Optei por passar a cláusula where como um único array. O primeiro elemento do array será o nome da coluna que está sendo atualizada, e o próximo será o valor da coluna. Deste modo, cada posição par do array (incluindo 0) será o nome da coluna, e cada posição ímpar será o novo valor. O código para executar isto é muito simples, e é apresentado a seguir (isolado da função):

1
for($i = 0; $i < count($where); $i++)
2
            {
3
                if($i%2 != 0)
4
                {
5
                    if(is_string($where[$i]))
6
                    {
7
                        if(($i+1) != null)
8
                            $where[$i] = '"'.$where[$i].'" AND ';
9
                        else
10
                            $where[$i] = '"'.$where[$i].'"';
11
                    }
12
                   else 
13
                   { 
14
                        if(($i+1) != null)
15
                            $where[$i] = $where[$i]. ' AND ';
16
                        else
17
                            $where[$i] = $where[$i];
18
                  }
19
                }
20
            }

A próxima seção irá criar a parte da instrução de update que trata da definição de variáveis. Já que você pode alterar qualquer número de valores, optei por utilizar um array em que a chave é a coluna e o valor é o novo valor da coluna. Dessa forma, podemos até mesmo fazer uma verificação para ver quantos valores diferentes foram passados ​​para ser atualizados, e podemos adicionar vírgulas de forma adequada.

1
$keys = array_keys($rows); 
2
            for($i = 0; $i < count($rows); $i++)
3
            {
4
                if(is_string($rows[$keys[$i]]))
5
                {
6
                    $update .= $keys[$i].'="'.$rows[$keys[$i]].'"';
7
                }
8
                else
9
                {
10
                    $update .= $keys[$i].'='.$rows[$keys[$i]];
11
                }
12
                // Parsear para adicionar virgulas

13
                if($i != count($rows)-1)
14
                {
15
                    $update .= ','; 
16
                }
17
            }

Agora que nós tiramos esses dois pedaços de lógica do caminho, o resto da instrução de update é fácil. Ela é apresentada a seguir:

1
public function update($table,$rows,$where)
2
    {
3
        if($this->tableExists($table))
4
        {
5
            // Parsear os valores where

6
            // valores pares (incluindo o 0) contêm as linhas where

7
            // valores ímpares contêm as cláusulas para as linhas

8
            for($i = 0; $i < count($where); $i++)
9
            {
10
                if($i%2 != 0)
11
                {
12
                    if(is_string($where[$i]))
13
                    {
14
                        if(($i+1) != null)
15
                            $where[$i] = '"'.$where[$i].'" AND ';
16
                        else
17
                            $where[$i] = '"'.$where[$i].'"';
18
                    }
19
                }
20
            }
21
            $where = implode('=',$where);
22
            
23
            
24
            $update = 'UPDATE '.$table.' SET ';
25
            $keys = array_keys($rows); 
26
            for($i = 0; $i < count($rows); $i++)
27
           {
28
                if(is_string($rows[$keys[$i]]))
29
                {
30
                    $update .= $keys[$i].'="'.$rows[$keys[$i]].'"';
31
                }
32
                else
33
                {
34
                    $update .= $keys[$i].'='.$rows[$keys[$i]];
35
                }
36
                
37
                // Parsear para adicionar virgulas

38
                if($i != count($rows)-1)
39
                {
40
                    $update .= ','; 
41
                }
42
            }
43
            $update .= ' WHERE '.$where;
44
            $query = @mysql_query($update);
45
            if($query)
46
            {
47
                return true; 
48
            }
49
            else
50
            {
51
                return false; 
52
            }
53
        }
54
        else
55
        {
56
            return false; 
57
        }
58
    }

Agora que nós terminamos a última função, nossa interface CRUD simples para MySQL está completa. Agora você pode criar novas entradas, ler entradas específicas do banco de dados, atualizar entradas e apagá-las. Além disso, ao criar e reutilizar essa classe, você vai ver que está economizando muito tempo e programação. Ah, a beleza da programação orientada a objetos.

O uso

Bem, temos nossa classe pronta, mas como vamos usá-la? Essa parte é simples. Vamos começar com a criação de um banco de dados muito simples para usar em nossos testes. Eu criei um banco de dados chamado de teste e, em seguida, rodei o comando MySQL. Você pode utilizá-la em qualquer banco de dados que quiser. Apenas lembre-se de ajustar as variáveis ​​de conexão no topo do script para que correspondam ao banco utilizado:

A primeira linha está comentada simplesmente porque nem todo mundo vai precisar dela. Se você precisar executar as instruções acima mais que uma vez, vai precisar descomentá-la na segunda vez para garantir que a tabela seja recriada.

Agora que nossa tabela está criada e preenchida, é hora de executar algumas consultas simples sobre ela.

1
<?php;
2
include('crud.php');
3
$db = new Database();
4
$db->connect();
5
$db->select('mysqlcrud');
6
$res = $db->getResult();
7
print_r($res);
8
?>

Se tudo correr bem, você deve ver o seguinte:

Da mesma forma, podemos dar um passo adiante e executar uma instrução de update, mostrando os resultados em seguida:

1
<?php;
2
$db->update('mysqlcrud',array('name'=>'Changed!'),array('id',1));
3
$db->update('mysqlcrud',array('name'=>'Changed2!'),array('id',2));
4
$res = $db->getResult();
5
print_r($res);
6
?>

Deveríamos ver isso

Agora, uma instrução de insert simples:

1
;<?php;
2
$db->insert('mysqlcrud',array(3,"Name 4","this@wasinsert.ed"));
3
$res = $db->getResult();
4
print_r($res);
5
?>

Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.