JAMES WEB

Aprenda como se faz.


Sumário

Banco de dados MySql Xampp

Imagine sua loja virtual como um grande armazém, onde cada produto tem seu lugar específico e todas as informações sobre vendas, clientes e estoque são cuidadosamente organizadas. Para gerenciar esse “armazém digital” de forma eficiente, precisamos de um sistema robusto e confiável: o banco de dados.

Neste capítulo, vamos explorar o coração da sua loja virtual: o banco de dados MySQL, utilizando o ambiente de desenvolvimento XAMPP. Você aprenderá a criar o banco de dados db-ecommerce, a estruturá-lo para armazenar todas as informações relevantes do seu negócio e a interagir com ele através de uma classe PHP personalizada.

Mas o que é um banco de dados e para que serve?

SQL significa Structured Query Language ou, em português, Linguagem de Consulta Estruturada. É uma linguagem padrão para gerenciar e manipular dados em bancos de dados relacionais.

Um banco de dados SQL é uma coleção organizada de dados, estruturada em tabelas, que se relacionam entre si. Imagine uma planilha do Excel, mas muito mais poderosa e complexa, capaz de armazenar grandes volumes de informações e permitir buscas e análises sofisticadas.

Para que serve um banco de dados SQL?

  • Armazenar dados:A principal função é guardar informações de forma organizada e estruturada, facilitando a recuperação quando necessário;
  • Gerenciar dados: Permite adicionar, modificar, excluir e buscar dados de forma eficiente;
  • Relacionar dados: Permite estabelecer conexões entre diferentes conjuntos de dados, como por exemplo, relacionar um cliente com seus pedidos;
  • Analisar dados: Através de consultas SQL, é possível realizar análises complexas sobre os dados, gerando relatórios e insights valiosos.
banco-de-dados

Configurando os arquivos

Para iniciar nosso Projeto E-commerce vamos importar o banco de dados, a estrutura principal do projeto.

Para criar o banco de dados db-ecommerce faça o seguinte:

  • Realize o download do arquivo db-ecommerce;
  • Abra o painel Xampp, ative o Apache e o Sql;
  • Clique em “Admin” no painel Xampp;
  • Clique em importar;
  • Clique em “Procurar no seu computador” para selecionar o arquivo importado;
  • Localize o arquivo de db-ecommerce e clique em executar.

Se tudo ocorrer bem o banco de dados db-ecommerce será criado. Observe que alguns dados já estão inseridos para testes.

O phpMyAdmin oferece uma interface visual intuitiva para explorar os relacionamentos entre as tabelas de um banco de dados. Essa visualização é fundamental para entender a estrutura do banco e como os dados estão conectados. Para acessar esta visualização clique no banco de dados e no menu procure por Desenhador.

banco-db-ecommerce

Configurando a Classe Sql

Neste módulo iremos criar nossas próprias classes e inserí-las na pasta vendor da estrutura de autoloader do composer.

Primeiro vamos criar a pasta hcoderbr dentro da pasta vendor. Na pasta hcoderbr crie outras pastas php-class > src > DB e dentro desta última no arquivo “sql.php”.

A Classe Sql que encapsula a lógica de conexão e interação com um banco de dados MySQL. Essa classe é utilizada para realizar consultas SQL e retornar os resultados em formato de array associativo.

Veja o código a seguir do arquivo “sql.php”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
namespace Hcode\DB;
use Hcode\Model;
 
class Sql {
    const HOSTNAME = "127.0.0.1";
    const USERNAME = "root";
    const PASSWORD = "";
    const DBNAME = "db_ecommerce";
 
    private $conn;
 
    public function __construct()
    {
        $this->conn = new \PDO(
            "mysql:dbname=".Sql::DBNAME.";host=".Sql::HOSTNAME, 
            Sql::USERNAME,
            Sql::PASSWORD
        );
    }
 
    private function setParams($statement$parameters array())
    {
        foreach ($parameters as $key => $value) {         
            $this->bindParam($statement$key$value);
        }
    }
 
    private function bindParam($statement$key$value)
    {
        $statement->bindParam($key$value);
    }
 
    public function query($rawQuery$params array())
    {
        $stmt $this->conn->prepare($rawQuery);
        $this->setParams($stmt$params);
        $stmt->execute();
    }
 
    public function select($rawQuery$params array()):array
    {
 
        $stmt $this->conn->prepare($rawQuery);
        $this->setParams($stmt$params);
        $stmt->execute();
        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
    }
}
 
 ?>

Análise Linha a Linha da Classe Sql.

  • L01 – <?php
    Inicia o bloco de código PHP.
  • L02 – namespace Hcode\DB;
    Define o namesapace chamado Hcode\DB para organizar a Classe Sql e evitar conflitos com outras classes que possam ter o mesmo nome.
  • L03 – use Hcode\Model;
    Importa o namespace Hcode\Model para permitir o uso de classes ou elementos desse sem precisar de digitar o arquivo completo.
  • L05 – class Sql {
    Define uma classe Sql que irá conter os métodos para interação com o banco de dados.
  • L06 – const HOSTNAME = “127.0.0.1”;
    Define uma constante chamada HOSTNAME com o valor “127.0.0.1”, que representa o endereço local do servidor do banco de dados.
  • L07 – const USERNAME = “root”;
    Define uma constante chamada USERNAME com o valor “root”, que representa o nome de usuário do banco de dados.
  • L08 – const PASSWORD = “”;
    Define uma constante chamada PASSWORD com o valor vazio, que representa a senha do banco de dados.
  • L09 – const DBNAME = “db_ecommerce”;
    Define uma constante chamada DBNAME com o valor “db_ecommerce”, que representa o nome do banco de dados.
  • L11 – private $conn;
    Declara uma propriedade privada chamada $conn que será utilizada para armazenar a conexão com o banco de dados.
  • L13 – public function __construct()
    Este trecho de código PHP (método construtor), está relacionado à conexão com um banco de dados. Mais especificamente, ele está configurando a conexão com um banco de dados MySQL utilizando a biblioteca PDO (PHP Data Objects).
    • L15 – $this->conn = new \PDO( … );
      Cria uma nova conexão com o banco de dados utilizando a classe PDO. Os argumentos passados para o construtor são:
    • L16 – mysql:dbname=”.Sql::DBNAME.”;host=”.Sql::HOSTNAME;
      A string de conexão, especificando o tipo de banco de dados (MySQL), o nome do banco de dados (obtido da constante DBNAME) e o host (obtido da constante HOSTNAME)
    • L17 – Sql::USERNAME:;
      O nome de usuário do banco de dados (obtido da constante USERNAME);
    • L18 – Sql::PASSWORD:
      A senha do banco de dados (obtida da constante PASSWORD);
  • L22 – private function setParams($statement, $parameters = array())
    O método setParams é uma função privada com o objetivo de vincular (bind) parâmetros a uma declaração preparada (prepared statement).
    Uma declaração preparada é como um modelo de consulta SQL pré-compilado e otimizado pelo banco de dados. Em vez de enviar a consulta completa com os valores diretamente para o banco de dados a cada execução, você envia o modelo da consulta e depois preenche os valores dos parâmetros quando precisar executar a consulta.
    A Função setParams que recebe dois parâmetros:
    • $statement: Um objeto PDOStatement que representa a instrução SQL preparada.
    • $parameters: Um array associativo contendo os valores dos parâmetros a serem vinculados. Se não for fornecido, um array vazio é usado por padrão.
  • L24 – foreach ($parameters as $key => $value) {:
    Inicia um loop foreach para iterar sobre cada elemento do array $parameters, onde:
    $key: Representa a chave do elemento no array (o nome do parâmetro). Geralmente representa o nome do campo (ou coluna) da tabela. Por exemplo, em uma tabela de usuários, $key poderia assumir valores como “idusers”, “desnome”, “deslogin” e “despassword”.
    $value: Representa o valor associado à chave. Representa o valor contido naquele campo específico para a linha atual. Ou seja, se $key for “desnome” e estivermos na segunda linha da tabela, $value poderia ser “Maria”.
    • L25 – $this->bindParam($statement, $key, $value);
      Esta linha é responsável por vincular um parâmetro a um marcador de posição em uma declaração SQL preparada. Chama o método bindParam;
  • L29 – private function bindParam($statement, $key, $value)
    O método bindParam é fundamental para prevenir injeção SQL. Ao invés de concatenar diretamente valores em uma string SQL, você utiliza marcadores de posição e vincula os valores a esses marcadores posteriormente. Isso garante que os valores sejam tratados como dados e não como parte da própria instrução SQL, evitando que códigos maliciosos sejam executados.
    • $statement:
      É um objeto do tipo PDOStatement, que representa uma instrução SQL preparada. Ele é passado como argumento para este método;
    • $key:
      É uma string que representa o nome do marcador de posição (placeholder) na sua instrução SQL preparada. Geralmente, usamos : seguido de um nome, como :nome, :email, etc.
    • $value:
      É o valor que será vinculado ao marcador de posição. Este valor será inserido na consulta SQL quando a instrução for executada.
    • $statement->bindParam($key, $value);
      Ao executar essa linha, você está dizendo ao banco de dados: “Pegue o valor de $value e coloque-o no lugar onde está o marcador de posição $key na minha declaração SQL preparada.
  • L34 – public function query($rawQuery, $params = array())
    A função query é uma ferramenta conveniente para executar consultas SQL preparadas de forma segura e eficiente. Ela simplifica o processo de vinculação de parâmetros e execução da consulta, tornando o código mais legível e reutilizável.
    • L36 – $stmt = $this->conn->prepare($rawQuery);
      • $stmt
        O método prepare do objeto $this->conn (a conexão com o banco de dados) cria um objeto PDOStatement e o armazena em $stmt. Esse objeto contém a consulta SQL compilada.
      • $this->conn->prepare():
        Essa parte pega a conexão com o banco de dados (armazenada em $this->conn) e prepara a consulta. O banco de dados compila a consulta internamente, otimizando sua execução.
      • $rawQuery:
        É a consulta SQL que você deseja executar, mas com marcadores de posição no lugar dos valores reais. Por exemplo: SELECT * FROM usuarios WHERE desnome = :nome.
    • L37 – $this->setParams($stmt, $params);
      • $this->setParams():
        Essa função que itera sobre o array $params e usa o método bindParam do PDO para associar cada valor ao seu respectivo marcador de posição na consulta preparada.
      • $stmt
        Vincula os valores dos parâmetros aos marcadores de posição da consulta.
      • $params:
        É um array associativo onde as chaves são os marcadores de posição da consulta e os valores são os dados que você quer inserir. Por exemplo: [‘nome’ => ‘João’].
    • L38 – $stmt->execute();
      Executa a consulta preparada. O banco de dados substitui os marcadores de posição pelos valores vinculados e processa a consulta.
  • L41 – public function select($rawQuery, $params = array()):array
    Define um método público chamado select que recebe uma consulta SQL (rawQuery) e um array de parâmetros opcional (params) e retorna um array.
    • $stmt = $this->conn->prepare($rawQuery);
      Prepara a consulta SQL utilizando o método prepare do objeto de conexão.
    • $this->setParams($stmt, $params);
      Chama o método setParams para associar os parâmetros à consulta.
    • $stmt->execute();
      Executa a consulta utilizando o método execute do objeto statement.
    • return $stmt->fetchAll(\PDO::FETCH_ASSOC);
      Retorna os resultados da consulta em formato de array associativo utilizando o método fetchAll com o tipo de fetch PDO::FETCH_ASSOC.

Para testar o Método Sql, acesse seu arquivo index.php e insira no final do código a rota “teste-dados”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
  // Inicio do código index.php
 
  $app->get('/teste-dados'function() {
    try {
        $sql new Hcode\DB\Sql();
        $results $sql->select("SELECT * FROM tb_users");
        echo json_encode($results);
    catch (PDOException $e) {
        echo "Erro ao conectar ao banco de dados: "
       $e->getMessage();
    
  });
 
  $app->run();
  ?>

Observando apenas a parte nova (dentro do bloco try) temos:

  • L06 – try:
    Inicia um bloco try, que é utilizado para tratar possíveis exceções (erros) que possam ocorrer durante a execução do código dentro desse bloco.
  • L07 – $sql = new Hcode\DB\Sql();:
    Cria uma nova instância da classe Sql, uma classe customizada para interagir com o banco de dados.
  • L08 – $results = $sql->select(“SELECT * FROM tb_users”);:
    Executa uma consulta SQL para selecionar todos os dados da tabela “tb_users”. O resultado da consulta é armazenado na variável $results.
  • L09 – echo json_encode($results);:
    Codifica o resultado da consulta em formato JSON e o envia como resposta para o cliente. O formato JSON é comumente utilizado para transmitir dados entre um servidor e um cliente.
  • L10 – catch (PDOException $e):
    Captura qualquer exceção do tipo PDOException que possa ser lançada dentro do bloco try. PDOException é um tipo de exceção específico para erros relacionados ao banco de dados.
  • L11 – echo “Erro ao conectar ao banco de dados: ” . $e->getMessage();:
    Se ocorrer um erro ao conectar ao banco de dados, esta mensagem será exibida, juntamente com uma mensagem mais detalhada sobre o erro contida na propriedade $e->getMessage().

Ao executar o código via browser com “localhost/ecommerce/teste-dados” você verá os dados armazenados na tabela tb_users parecido com imagem abaixo:

banco-de-dados

Para saber mais:

  • Banco de Dados com MySqlAdmin;
  • Json