Huymada icon

Storage Examples

Huymada | PRO | 03/13/26 03:23:04 PM UTC | 0 ⭐ | 10136 👁️ | Never ⏰ | []
PHP |

10.3 KB

|

None

|

0 👍

/

0 👎

<?php
/**
 * Exemplos de uso da classe Storage v2.0
 *
 * Configuração inicial: estenda a classe e defina as credenciais
 */
 
class DB extends Storage {
    public $hostname = 'localhost';
    public $username = 'root';
    public $password = 'senha';
    public $database = 'minha_base';
    public $encoding = 'utf8mb4';
}
 
$db = new DB();
 
// =============================================================================
// 1. prepare() — Query segura com prepared statement
//    Use sempre que a query receber dados externos (formulários, URLs etc.)
// =============================================================================
 
// Busca com dado vindo de fora (sem risco de SQL injection)
$email = $_POST['email'] ?? '[email protected]';
 
$user = $db->prepare(
    "SELECT * FROM users WHERE email = ? AND active = ?",
    [$email, 1],
    'si'
)->fetch_one();
 
if ($user) {
    echo "Bem-vindo, {$user['name']}!\n";
}
 
// Inserção segura com prepare()
$db->prepare(
    "INSERT INTO users (name, email, created_at) VALUES (?, ?, NOW())",
    ['Ana Silva', '[email protected]']
);
 
echo "Usuário inserido com ID: " . $db->insert_id() . "\n";
 
 
// =============================================================================
// 2. escape() — Escapar strings para uso manual em queries
//    Use quando não puder usar prepare(), como em queries dinâmicas complexas
// =============================================================================
 
$nome  = $db->escape($_GET['nome'] ?? '');
$ordem = in_array($_GET['ordem'] ?? '', ['ASC', 'DESC']) ? $_GET['ordem'] : 'ASC';
 
$db->query("SELECT * FROM products WHERE name LIKE '%{$nome}%' ORDER BY name {$ordem}");
 
$products = $db->fetch_assoc();
echo "Produtos encontrados: " . count($products) . "\n";
 
 
// =============================================================================
// 3. insert_array() — Inserção via array associativo
//    Campos vazios ou null viram NULL no banco
// =============================================================================
 
$db->insert_array('orders', [
    'user_id'    => 42,
    'product_id' => 7,
    'quantity'   => 3,
    'note'       => '',        // vira NULL automaticamente
    'created_at' => date('Y-m-d H:i:s'),
]);
 
$order_id = $db->insert_id();
echo "Pedido criado: #{$order_id}\n";
 
 
// =============================================================================
// 4. update_array() — Atualização via array associativo
//    O WHERE é obrigatório — lança exceção se omitido
// =============================================================================
 
$db->update_array('users', [
    'name'       => 'Ana Costa',
    'updated_at' => date('Y-m-d H:i:s'),
], "id = 15");
 
echo "Linhas atualizadas: " . $db->affected_rows() . "\n";
 
 
// =============================================================================
// 5. delete_where() — Exclusão com WHERE obrigatório
//    Segurança: não permite apagar todos os registros por engano
// =============================================================================
 
$db->delete_where('sessions', "expires_at < NOW()");
echo "Sessões expiradas removidas: " . $db->affected_rows() . "\n";
 
// Tentativa sem WHERE lança exceção:
try {
    $db->delete_where('logs', '');
} catch (InvalidArgumentException $e) {
    echo "Erro esperado: {$e->getMessage()}\n";
}
 
 
// =============================================================================
// 6. fetch_one() — Primeiro resultado como array associativo
//    Ideal quando você espera apenas um registro
// =============================================================================
 
$product = $db->query("SELECT * FROM products WHERE id = 12")->fetch_one();
 
if ($product) {
    echo "Produto: {$product['name']} — R$ {$product['price']}\n";
} else {
    echo "Produto não encontrado.\n";
}
 
 
// =============================================================================
// 7. fetch_value() — Valor de uma única coluna
//    Útil para COUNT, SUM, buscar um campo específico etc.
// =============================================================================
 
// Primeira coluna (índice 0)
$total_users = $db->query("SELECT COUNT(*) FROM users")->fetch_value();
echo "Total de usuários: {$total_users}\n";
 
// Coluna pelo nome
$email_admin = $db->query("SELECT email FROM users WHERE role = 'admin' LIMIT 1")
                   ->fetch_value('email');
echo "E-mail do admin: {$email_admin}\n";
 
// Soma de valores
$receita = $db->query("SELECT SUM(total) FROM orders WHERE status = 'paid'")
              ->fetch_value();
echo "Receita total: R$ " . number_format($receita, 2, ',', '.') . "\n";
 
 
// =============================================================================
// 8. count() — Contagem direta de registros
// =============================================================================
 
$total    = $db->count('users');
$ativos   = $db->count('users', "active = 1");
$admins   = $db->count('users', "role = 'admin'");
 
echo "Total: {$total} | Ativos: {$ativos} | Admins: {$admins}\n";
 
 
// =============================================================================
// 9. paginate() — Paginação automática
//    Adiciona LIMIT e OFFSET com base na página solicitada
// =============================================================================
 
$page     = (int) ($_GET['page'] ?? 1);
$per_page = 10;
 
$orders = $db->paginate(
    "SELECT o.*, u.name as user_name
     FROM orders o
     JOIN users u ON u.id = o.user_id
     ORDER BY o.created_at DESC",
    $page,
    $per_page
)->fetch_assoc();
 
$total_orders = $db->count('orders');
$total_pages  = ceil($total_orders / $per_page);
 
echo "Página {$page} de {$total_pages} ({$total_orders} pedidos no total)\n";
 
foreach ($orders as $order) {
    echo "  Pedido #{$order['id']} — {$order['user_name']}\n";
}
 
 
// =============================================================================
// 10. begin_transaction() / commit() / rollback() — Transações
//     Garante atomicidade: ou tudo funciona, ou nada é gravado
// =============================================================================
 
// Exemplo: transferência de saldo entre contas
$de_conta  = 1;
$para_conta = 2;
$valor      = 150.00;
 
try {
    $db->begin_transaction();
 
    // Verifica saldo disponível
    $saldo = $db->prepare(
        "SELECT balance FROM accounts WHERE id = ? FOR UPDATE",
        [$de_conta]
    )->fetch_value('balance');
 
    if ($saldo < $valor) {
        throw new RuntimeException('Saldo insuficiente.');
    }
 
    // Débito
    $db->prepare(
        "UPDATE accounts SET balance = balance - ? WHERE id = ?",
        [$valor, $de_conta],
        'di'
    );
 
    // Crédito
    $db->prepare(
        "UPDATE accounts SET balance = balance + ? WHERE id = ?",
        [$valor, $para_conta],
        'di'
    );
 
    // Registra a movimentação
    $db->insert_array('transactions', [
        'from_account' => $de_conta,
        'to_account'   => $para_conta,
        'amount'       => $valor,
        'created_at'   => date('Y-m-d H:i:s'),
    ]);
 
    $db->commit();
    echo "Transferência de R$ {$valor} realizada com sucesso.\n";
 
} catch (Exception $e) {
    $db->rollback();
    echo "Transferência cancelada: {$e->getMessage()}\n";
}
 
 
// =============================================================================
// 11. query_cache() / clear_cache() — Cache de resultados em memória
//     Evita repetir queries idênticas dentro da mesma requisição
// =============================================================================
 
// Executa e armazena em cache por 60 segundos
$config = $db->query_cache("SELECT * FROM config", 60)->fetch_assoc();
echo "Configurações carregadas: " . count($config) . " entradas\n";
 
// Segunda chamada usa o cache — não vai ao banco
$config_cached = $db->query_cache("SELECT * FROM config", 60)->fetch_assoc();
echo "Do cache: " . count($config_cached) . " entradas\n";
 
// Limpa o cache de uma query específica
$db->clear_cache("SELECT * FROM config");
 
// Ou limpa tudo:
$db->clear_cache();
 
 
// =============================================================================
// 12. explain() — Plano de execução da última query
//     Use para identificar queries lentas e verificar uso de índices
// =============================================================================
 
$db->query("SELECT * FROM orders WHERE user_id = 42 AND status = 'pending'");
$plan = $db->explain();
 
foreach ($plan as $row) {
    echo "Tipo: {$row['type']} | "
       . "Tabela: {$row['table']} | "
       . "Chave usada: " . ($row['key'] ?? 'nenhuma') . " | "
       . "Linhas estimadas: {$row['rows']}\n";
}
 
// Atenção: se 'type' for 'ALL' e 'key' for null, a query está fazendo full scan.
// Considere adicionar um índice na coluna usada no WHERE.
 
 
// =============================================================================
// 13. get_profile() — Métricas de performance de todas as queries
//     Chame no final da requisição para monitorar o desempenho geral
// =============================================================================
 
$metrics = $db->get_profile();
 
echo "\n--- Resumo da requisição ---\n";
echo "Queries executadas : {$metrics['total']}\n";
echo "Tempo total        : {$metrics['total_ms']}ms\n";
echo "Tempo médio        : {$metrics['avg_ms']}ms\n";
echo "Query mais lenta   : {$metrics['slowest']}ms\n";
 
 
// =============================================================================
// 14. get_history() — Histórico detalhado com timestamps e durações
// =============================================================================
 
echo "\n--- Histórico ---\n";
foreach ($db->get_history() as $i => $entry) {
    echo "#{$i} [{$entry['time']}] ({$entry['duration']}) {$entry['query']}\n";
}
 
 
// =============================================================================
// BÔNUS: is_in_transaction() — Verificar estado antes de operações críticas
// =============================================================================
 
if (!$db->is_in_transaction()) {
    $db->begin_transaction();
    // ... operações ...
    $db->commit();
}
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎