PHP e Databases

Capa Curso PHP
Tempo de leitura: 4 minutos

PHP e Databases: A união do PHP com um banco de dados relacional (como MySQL, PostgreSQL, SQLite) é a base para a maioria das aplicações web dinâmicas. O PDO (PHP Data Objects) é a extensão recomendada pelo PHP para essa interação. Ele fornece uma camada leve e consistente para acesso a bancos de dados, garantindo portabilidade e, crucialmente, segurança através do uso de Prepared Statements.

1. 🤝 Conectando ao Banco de Dados com PDO

O PDO utiliza o conceito de DSN (Data Source Name) para especificar o driver do banco, o host e o nome do banco de dados. A conexão deve ser encapsulada em um bloco try-catch para um tratamento de erros elegante.

Estrutura de Conexão

PHP

<?php
// 1. DSN (Driver, Host, Nome do Banco)
$dsn = "mysql:host=localhost;dbname=meu_banco;charset=utf8mb4";
$usuario = "seu_usuario";
$senha = "sua_senha";

try {
    // 2. Cria a instância do objeto PDO
    $pdo = new PDO($dsn, $usuario, $senha);
    
    // 3. Configura o PDO para lançar exceções em caso de erro SQL (Crucial para tratamento de erros)
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    
    echo "Conectado com sucesso!";

} catch (PDOException $exception) {
    // Captura o erro específico de conexão PDO
    die("Erro de conexão: " . $exception->getMessage());
}
?>

2. ⚔️ Prevenção de Injeção SQL: Prepared Statements

O maior benefício do PDO é seu suporte nativo a Prepared Statements (Consultas Preparadas), o método mais eficaz de prevenção contra ataques de Injeção SQL.

Princípio: O comando SQL é enviado ao servidor de banco de dados separadamente dos valores dos dados. O banco de dados compila o comando (prepara a consulta) e, em seguida, insere os dados, garantindo que os inputs do usuário sejam tratados estritamente como dados, e nunca como código SQL executável.

A. Marcadores de Interrogação (?)

PHP

<?php
$nome = 'João';
$email = '[email protected]';

// 1. A estrutura da consulta é enviada com marcadores de posição (?)
$stmt = $pdo->prepare("INSERT INTO usuarios (nome, email) VALUES (?, ?)");

// 2. Os valores são enviados no array do método execute()
$stmt->execute([$nome, $email]); 
?>

B. Marcadores Nomeados (:nome)

Marcadores nomeados são mais legíveis, especialmente em consultas com muitos parâmetros.

PHP

<?php
// Dados do formulário (presumindo que já foram validados e sanitizados)
$nome = $_POST['nome'];
$email = $_POST['email'];

// 1. Estrutura da consulta com marcadores nomeados
$stmt = $pdo->prepare("
    INSERT INTO usuarios (nome, email) 
    VALUES (:nome, :email)
");

// 2. Vinculando (binding) os valores aos marcadores
$stmt->bindValue(':nome', $nome);
$stmt->bindValue(':email', $email);

// 3. Executando a consulta
$stmt->execute();
?>

3. 🔍 Executando e Recuperando Dados

O PDO oferece métodos flexíveis para executar consultas e obter os resultados.

A. Consultas Simples (query())

Para consultas que não possuem inputs do usuário (ou seja, não precisam de prepared statements), como SELECTs simples.

PHP

<?php
// Consulta simples
$stmt = $pdo->query("SELECT * FROM usuarios ORDER BY nome");

// Loop para iterar sobre os resultados
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // FETCH_ASSOC retorna um array associativo
    echo $row['nome'] . " - " . $row['email'] . "<br>";
}
?>

B. Obter Todos os Resultados (fetchAll())

Útil para recuperar todos os registros de uma vez em um único array.

PHP

<?php
$stmt = $pdo->query("SELECT nome, email FROM usuarios");
$usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC); // Retorna todos em um array

// Agora $usuarios é um array de arrays associativos
print_r($usuarios); 
?>

4. 🔀 Transações: Garantindo a Integridade (ACID)

Transações garantem que um conjunto de comandos SQL seja tratado como uma única unidade atômica. Ou todas as operações são concluídas com sucesso (commit), ou nenhuma delas é aplicada (rollback). Isso é vital para operações financeiras ou de estoque.

PHP

<?php
try {
    $pdo->beginTransaction(); // 1. Inicia a transação

    // Exemplo: Transferência de fundos (duas operações que devem ser atômicas)
    $pdo->prepare("UPDATE contas SET saldo = saldo - 100 WHERE id = 1")->execute();
    $pdo->prepare("UPDATE contas SET saldo = saldo + 100 WHERE id = 2")->execute();

    $pdo->commit(); // 2. Confirma a transação se tudo deu certo
    echo "Transação concluída com sucesso!";

} catch (Exception $e) {
    $pdo->rollBack(); // 3. Desfaz todas as alterações se qualquer erro ocorrer
    echo "Erro na transação: " . $e->getMessage();
}
?>

5. ✅ Boas Práticas e Otimização

  • Índices: Garanta que colunas usadas em cláusulas WHERE, JOIN ou ORDER BY tenham índices (especialmente chaves primárias e estrangeiras) para acelerar a busca.
  • Limitar Resultados: Use LIMIT em consultas grandes para evitar carregar dados desnecessários na memória do PHP.
  • Uso Mínimo de SELECT *: Liste explicitamente as colunas que você precisa, o que melhora o desempenho e reduz a carga de rede.
  • Criptografia de Senhas: Nunca armazene senhas em texto puro. Use as funções de hashing seguras do PHP, como password_hash() e password_verify().

✅ Conclusão PHP e Databases

PHP e Databases: O PDO é a ferramenta padrão e mais segura para interagir com bancos de dados em PHP. Ao dominar a sintaxe de conexão, a execução de consultas via Prepared Statements (essenciais para prevenir Injeção SQL) e o gerenciamento de Transações para garantir a integridade dos dados, você estará apto a construir a espinha dorsal de qualquer aplicação web robusta e escalável.

Toda jornada tem um início, e o início para se tornar um desenvolvedor back-end é dominar as seguintes tecnologias, que você encontra aqui mesmo:

SQL
SQL
Capa Curso PHP
PHP
Laravel
Laravel

E se você gosta do nosso conteúdo, não deixe de contribuir adquirindo os serviços e produtos dos nossos apoiadores e empresas que somos associados:

Hospedagem Hostinger
Ofertas Amazon
Amazon Prime

Author: Thiago Rossi
Com mais de 20 anos de jornada na tecnologia, minha trajetória evoluiu do ensino técnico à arquitetura de sistemas complexos. Hoje, foco minha expertise no desenvolvimento de soluções de Inteligência Artificial nativa e análise de dados públicos, utilizando o ecossistema PHP para transformar dados brutos em transparência e eficiência. Como autor e desenvolvedor, acredito na democratização do conhecimento. Essa visão resultou em uma biblioteca de mais de 530 artigos gratuitos, cobrindo desde a base do WebDev e Infraestrutura até os bastidores da indústria de Jogos e IA. No universo de Game Design, sou autor do livro "GDD – O Guia Definitivo" e documento ativamente meus processos através de DevLogs, unindo rigor técnico e criatividade em projetos desenvolvidos com GDevelop 5. Meu compromisso é conectar engenharia de ponta com as reais oportunidades do mercado de tecnologia.