« Back to History
pdo_logger.php
|
20260920_164915.php
Initial Domain Snapshot
Copy Code
<?php /* ========================================================================= File: /erp/modules/dev/pdo_logger.php Purpose: Best-effort SQL table sniffing; collects table names to global Scope : Page-local; safe to include anywhere. No PDO replacement required. ========================================================================= */ if (!defined('FLAG_PAGE_USAGE_LOG') || FLAG_PAGE_USAGE_LOG !== true) { return; } if (!isset($GLOBALS['_MM_SQL_SNIFF_TABLES'])) { $GLOBALS['_MM_SQL_SNIFF_TABLES'] = []; } if (!function_exists('mm_sql_sniff_tables')) { function mm_sql_sniff_tables($sql) { $tables = []; $s = ' '.strtolower($sql).' '; // naive patterns: FROM, JOIN, INTO, UPDATE $patterns = [ '/\bfrom\s+`?([a-z0-9_]+)`?/i', '/\bjoin\s+`?([a-z0-9_]+)`?/i', '/\binto\s+`?([a-z0-9_]+)`?/i', '/\bupdate\s+`?([a-z0-9_]+)`?/i', '/\btable\s+`?([a-z0-9_]+)`?/i', ]; foreach ($patterns as $p) { if (preg_match_all($p, $sql, $m)) { foreach ($m[1] as $t) $tables[] = $t; } } return array_values(array_unique($tables)); } } /* ---- Hook PDO::prepare and ::query via userland proxy (opt-in) ---- Usage: after $pdo ready → wrap: $pdo = new MM_PDO_Proxy($pdo); ------------------------------------------------------------------------ */ if (!class_exists('MM_PDO_Proxy')) { class MM_PDO_Proxy { private PDO $pdo; function __construct(PDO $pdo) { $this->pdo = $pdo; } function __call($name, $args) { if (in_array($name, ['query','exec'], true) && !empty($args[0])) { $sql = (string)$args[0]; foreach (mm_sql_sniff_tables($sql) as $t) { $GLOBALS['_MM_SQL_SNIFF_TABLES'][] = $t; } } if ($name === 'prepare' && !empty($args[0])) { $sql = (string)$args[0]; foreach (mm_sql_sniff_tables($sql) as $t) { $GLOBALS['_MM_SQL_SNIFF_TABLES'][] = $t; } } $res = $this->pdo->$name(...$args); return $res; } /* ---- Delegate common PDO props/const ---- */ public function __get($n) { return $this->pdo->$n; } public function __set($n,$v) { $this->pdo->$n = $v; } } }