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', 'ana@exemplo.com'] ); 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(); }