Huymada

Storage Examples

Mar 13th, 2026
12,238
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.30 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Exemplos de uso da classe Storage v2.0
  4.  *
  5.  * Configuração inicial: estenda a classe e defina as credenciais
  6.  */
  7.  
  8. class DB extends Storage {
  9.     public $hostname = 'localhost';
  10.     public $username = 'root';
  11.     public $password = 'senha';
  12.     public $database = 'minha_base';
  13.     public $encoding = 'utf8mb4';
  14. }
  15.  
  16. $db = new DB();
  17.  
  18. // =============================================================================
  19. // 1. prepare() — Query segura com prepared statement
  20. //    Use sempre que a query receber dados externos (formulários, URLs etc.)
  21. // =============================================================================
  22.  
  23. // Busca com dado vindo de fora (sem risco de SQL injection)
  24. $email = $_POST['email'] ?? '[email protected]';
  25.  
  26. $user = $db->prepare(
  27.     "SELECT * FROM users WHERE email = ? AND active = ?",
  28.     [$email, 1],
  29.     'si'
  30. )->fetch_one();
  31.  
  32. if ($user) {
  33.     echo "Bem-vindo, {$user['name']}!\n";
  34. }
  35.  
  36. // Inserção segura com prepare()
  37. $db->prepare(
  38.     "INSERT INTO users (name, email, created_at) VALUES (?, ?, NOW())",
  39.     ['Ana Silva', '[email protected]']
  40. );
  41.  
  42. echo "Usuário inserido com ID: " . $db->insert_id() . "\n";
  43.  
  44.  
  45. // =============================================================================
  46. // 2. escape() — Escapar strings para uso manual em queries
  47. //    Use quando não puder usar prepare(), como em queries dinâmicas complexas
  48. // =============================================================================
  49.  
  50. $nome  = $db->escape($_GET['nome'] ?? '');
  51. $ordem = in_array($_GET['ordem'] ?? '', ['ASC', 'DESC']) ? $_GET['ordem'] : 'ASC';
  52.  
  53. $db->query("SELECT * FROM products WHERE name LIKE '%{$nome}%' ORDER BY name {$ordem}");
  54.  
  55. $products = $db->fetch_assoc();
  56. echo "Produtos encontrados: " . count($products) . "\n";
  57.  
  58.  
  59. // =============================================================================
  60. // 3. insert_array() — Inserção via array associativo
  61. //    Campos vazios ou null viram NULL no banco
  62. // =============================================================================
  63.  
  64. $db->insert_array('orders', [
  65.     'user_id'    => 42,
  66.     'product_id' => 7,
  67.     'quantity'   => 3,
  68.     'note'       => '',        // vira NULL automaticamente
  69.     'created_at' => date('Y-m-d H:i:s'),
  70. ]);
  71.  
  72. $order_id = $db->insert_id();
  73. echo "Pedido criado: #{$order_id}\n";
  74.  
  75.  
  76. // =============================================================================
  77. // 4. update_array() — Atualização via array associativo
  78. //    O WHERE é obrigatório — lança exceção se omitido
  79. // =============================================================================
  80.  
  81. $db->update_array('users', [
  82.     'name'       => 'Ana Costa',
  83.     'updated_at' => date('Y-m-d H:i:s'),
  84. ], "id = 15");
  85.  
  86. echo "Linhas atualizadas: " . $db->affected_rows() . "\n";
  87.  
  88.  
  89. // =============================================================================
  90. // 5. delete_where() — Exclusão com WHERE obrigatório
  91. //    Segurança: não permite apagar todos os registros por engano
  92. // =============================================================================
  93.  
  94. $db->delete_where('sessions', "expires_at < NOW()");
  95. echo "Sessões expiradas removidas: " . $db->affected_rows() . "\n";
  96.  
  97. // Tentativa sem WHERE lança exceção:
  98. try {
  99.     $db->delete_where('logs', '');
  100. } catch (InvalidArgumentException $e) {
  101.     echo "Erro esperado: {$e->getMessage()}\n";
  102. }
  103.  
  104.  
  105. // =============================================================================
  106. // 6. fetch_one() — Primeiro resultado como array associativo
  107. //    Ideal quando você espera apenas um registro
  108. // =============================================================================
  109.  
  110. $product = $db->query("SELECT * FROM products WHERE id = 12")->fetch_one();
  111.  
  112. if ($product) {
  113.     echo "Produto: {$product['name']} — R$ {$product['price']}\n";
  114. } else {
  115.     echo "Produto não encontrado.\n";
  116. }
  117.  
  118.  
  119. // =============================================================================
  120. // 7. fetch_value() — Valor de uma única coluna
  121. //    Útil para COUNT, SUM, buscar um campo específico etc.
  122. // =============================================================================
  123.  
  124. // Primeira coluna (índice 0)
  125. $total_users = $db->query("SELECT COUNT(*) FROM users")->fetch_value();
  126. echo "Total de usuários: {$total_users}\n";
  127.  
  128. // Coluna pelo nome
  129. $email_admin = $db->query("SELECT email FROM users WHERE role = 'admin' LIMIT 1")
  130.                    ->fetch_value('email');
  131. echo "E-mail do admin: {$email_admin}\n";
  132.  
  133. // Soma de valores
  134. $receita = $db->query("SELECT SUM(total) FROM orders WHERE status = 'paid'")
  135.               ->fetch_value();
  136. echo "Receita total: R$ " . number_format($receita, 2, ',', '.') . "\n";
  137.  
  138.  
  139. // =============================================================================
  140. // 8. count() — Contagem direta de registros
  141. // =============================================================================
  142.  
  143. $total    = $db->count('users');
  144. $ativos   = $db->count('users', "active = 1");
  145. $admins   = $db->count('users', "role = 'admin'");
  146.  
  147. echo "Total: {$total} | Ativos: {$ativos} | Admins: {$admins}\n";
  148.  
  149.  
  150. // =============================================================================
  151. // 9. paginate() — Paginação automática
  152. //    Adiciona LIMIT e OFFSET com base na página solicitada
  153. // =============================================================================
  154.  
  155. $page     = (int) ($_GET['page'] ?? 1);
  156. $per_page = 10;
  157.  
  158. $orders = $db->paginate(
  159.     "SELECT o.*, u.name as user_name
  160.     FROM orders o
  161.     JOIN users u ON u.id = o.user_id
  162.     ORDER BY o.created_at DESC",
  163.     $page,
  164.     $per_page
  165. )->fetch_assoc();
  166.  
  167. $total_orders = $db->count('orders');
  168. $total_pages  = ceil($total_orders / $per_page);
  169.  
  170. echo "Página {$page} de {$total_pages} ({$total_orders} pedidos no total)\n";
  171.  
  172. foreach ($orders as $order) {
  173.     echo "  Pedido #{$order['id']} — {$order['user_name']}\n";
  174. }
  175.  
  176.  
  177. // =============================================================================
  178. // 10. begin_transaction() / commit() / rollback() — Transações
  179. //     Garante atomicidade: ou tudo funciona, ou nada é gravado
  180. // =============================================================================
  181.  
  182. // Exemplo: transferência de saldo entre contas
  183. $de_conta  = 1;
  184. $para_conta = 2;
  185. $valor      = 150.00;
  186.  
  187. try {
  188.     $db->begin_transaction();
  189.  
  190.     // Verifica saldo disponível
  191.     $saldo = $db->prepare(
  192.         "SELECT balance FROM accounts WHERE id = ? FOR UPDATE",
  193.         [$de_conta]
  194.     )->fetch_value('balance');
  195.  
  196.     if ($saldo < $valor) {
  197.         throw new RuntimeException('Saldo insuficiente.');
  198.     }
  199.  
  200.     // Débito
  201.     $db->prepare(
  202.         "UPDATE accounts SET balance = balance - ? WHERE id = ?",
  203.         [$valor, $de_conta],
  204.         'di'
  205.     );
  206.  
  207.     // Crédito
  208.     $db->prepare(
  209.         "UPDATE accounts SET balance = balance + ? WHERE id = ?",
  210.         [$valor, $para_conta],
  211.         'di'
  212.     );
  213.  
  214.     // Registra a movimentação
  215.     $db->insert_array('transactions', [
  216.         'from_account' => $de_conta,
  217.         'to_account'   => $para_conta,
  218.         'amount'       => $valor,
  219.         'created_at'   => date('Y-m-d H:i:s'),
  220.     ]);
  221.  
  222.     $db->commit();
  223.     echo "Transferência de R$ {$valor} realizada com sucesso.\n";
  224.  
  225. } catch (Exception $e) {
  226.     $db->rollback();
  227.     echo "Transferência cancelada: {$e->getMessage()}\n";
  228. }
  229.  
  230.  
  231. // =============================================================================
  232. // 11. query_cache() / clear_cache() — Cache de resultados em memória
  233. //     Evita repetir queries idênticas dentro da mesma requisição
  234. // =============================================================================
  235.  
  236. // Executa e armazena em cache por 60 segundos
  237. $config = $db->query_cache("SELECT * FROM config", 60)->fetch_assoc();
  238. echo "Configurações carregadas: " . count($config) . " entradas\n";
  239.  
  240. // Segunda chamada usa o cache — não vai ao banco
  241. $config_cached = $db->query_cache("SELECT * FROM config", 60)->fetch_assoc();
  242. echo "Do cache: " . count($config_cached) . " entradas\n";
  243.  
  244. // Limpa o cache de uma query específica
  245. $db->clear_cache("SELECT * FROM config");
  246.  
  247. // Ou limpa tudo:
  248. $db->clear_cache();
  249.  
  250.  
  251. // =============================================================================
  252. // 12. explain() — Plano de execução da última query
  253. //     Use para identificar queries lentas e verificar uso de índices
  254. // =============================================================================
  255.  
  256. $db->query("SELECT * FROM orders WHERE user_id = 42 AND status = 'pending'");
  257. $plan = $db->explain();
  258.  
  259. foreach ($plan as $row) {
  260.     echo "Tipo: {$row['type']} | "
  261.        . "Tabela: {$row['table']} | "
  262.        . "Chave usada: " . ($row['key'] ?? 'nenhuma') . " | "
  263.        . "Linhas estimadas: {$row['rows']}\n";
  264. }
  265.  
  266. // Atenção: se 'type' for 'ALL' e 'key' for null, a query está fazendo full scan.
  267. // Considere adicionar um índice na coluna usada no WHERE.
  268.  
  269.  
  270. // =============================================================================
  271. // 13. get_profile() — Métricas de performance de todas as queries
  272. //     Chame no final da requisição para monitorar o desempenho geral
  273. // =============================================================================
  274.  
  275. $metrics = $db->get_profile();
  276.  
  277. echo "\n--- Resumo da requisição ---\n";
  278. echo "Queries executadas : {$metrics['total']}\n";
  279. echo "Tempo total        : {$metrics['total_ms']}ms\n";
  280. echo "Tempo médio        : {$metrics['avg_ms']}ms\n";
  281. echo "Query mais lenta   : {$metrics['slowest']}ms\n";
  282.  
  283.  
  284. // =============================================================================
  285. // 14. get_history() — Histórico detalhado com timestamps e durações
  286. // =============================================================================
  287.  
  288. echo "\n--- Histórico ---\n";
  289. foreach ($db->get_history() as $i => $entry) {
  290.     echo "#{$i} [{$entry['time']}] ({$entry['duration']}) {$entry['query']}\n";
  291. }
  292.  
  293.  
  294. // =============================================================================
  295. // BÔNUS: is_in_transaction() — Verificar estado antes de operações críticas
  296. // =============================================================================
  297.  
  298. if (!$db->is_in_transaction()) {
  299.     $db->begin_transaction();
  300.     // ... operações ...
  301.     $db->commit();
  302. }
  303.  
Advertisement