diff --git a/sys/sys.php b/sys/sys.php index fd107ff..ab870e8 100755 --- a/sys/sys.php +++ b/sys/sys.php @@ -6,28 +6,51 @@ * */ -// Helper function to manage connections cleanly -function get_db_connection($db_host = null, $db_user = null, $db_pass = null) { +function get_db_connection($db_host = null, $db_user = null, $db_pass = null, $db_name = null) { global $db; - // If custom credentials are provided, create a fresh, temporary connection - // This prevents overwriting the global $db with an alternative database - if ($db_host !== null || $db_user !== null || $db_pass !== null) { + // If custom credentials or a custom DB are provided, create a fresh, temporary connection + if ($db_host !== null || $db_user !== null || $db_pass !== null || $db_name !== null) { $host = $db_host ?? DB_HOST; $user = $db_user ?? DB_USER; $pass = $db_pass ?? DB_PASS; - return new PDO("mysql:host=" . $host . ";", $user, $pass); + $name = $db_name ?? (defined('DB_NAME') ? DB_NAME : ''); + + $dsn_base = "mysql:host=" . $host . ";"; + $dsn_full = $dsn_base . (!empty($name) ? "dbname=" . $name . ";" : ""); + + try { + return new PDO($dsn_full, $user, $pass); + } catch (PDOException $e) { + // MySQL Error 1049 is "Unknown database". If caught, fallback to connection without DB. + if (strpos($e->getMessage(), '1049') !== false) { + return new PDO($dsn_base, $user, $pass); + } + throw $e; // Re-throw if it's a real connection/auth issue + } } // Otherwise, use or initialize the global connection using constants if (!isset($db) || is_null($db)) { - $db = new PDO("mysql:host=" . DB_HOST . ";", DB_USER, DB_PASS); + $dsn_base = "mysql:host=" . DB_HOST . ";"; + $name = defined('DB_NAME') ? DB_NAME : ''; + $dsn_full = $dsn_base . (!empty($name) ? "dbname=" . $name . ";" : ""); + + try { + $db = new PDO($dsn_full, DB_USER, DB_PASS); + } catch (PDOException $e) { + if (strpos($e->getMessage(), '1049') !== false) { + $db = new PDO($dsn_base, DB_USER, DB_PASS); + } else { + throw $e; + } + } } return $db; } -function sql_read($query, $db_host = null, $db_user = null, $db_pass = null) { - $pdo = get_db_connection($db_host, $db_user, $db_pass); +function sql_read($query, $db_host = null, $db_user = null, $db_pass = null, $db_name = null) { + $pdo = get_db_connection($db_host, $db_user, $db_pass, $db_name); $stmt = $pdo->prepare($query); if ($stmt->execute() === false) { @@ -36,8 +59,8 @@ function sql_read($query, $db_host = null, $db_user = null, $db_pass = null) { return $stmt->fetchAll(PDO::FETCH_ASSOC); } -function sql_write($query, $db_host = null, $db_user = null, $db_pass = null) { - $pdo = get_db_connection($db_host, $db_user, $db_pass); +function sql_write($query, $db_host = null, $db_user = null, $db_pass = null, $db_name = null) { + $pdo = get_db_connection($db_host, $db_user, $db_pass, $db_name); $stmt = $pdo->prepare($query); if ($stmt->execute() === false) { @@ -46,12 +69,15 @@ function sql_write($query, $db_host = null, $db_user = null, $db_pass = null) { return $stmt->rowCount(); } -function sql($query, $db_host = null, $db_user = null, $db_pass = null) { - // Used trim() and stripos() to catch cases like " select " or "SELECT " - if (stripos(trim($query), "SHOW") === 0 || stripos(trim($query), "SELECT") === 0) { - return sql_read($query, $db_host, $db_user, $db_pass); +function sql($query, $db_host = null, $db_user = null, $db_pass = null, $db_name = null) { + if ( + stripos(trim($query), "SHOW") === 0 + || stripos(trim($query), "DESCRIBE") === 0 + || stripos(trim($query), "SELECT") === 0 + ) { + return sql_read($query, $db_host, $db_user, $db_pass, $db_name); } else { - return sql_write($query, $db_host, $db_user, $db_pass); + return sql_write($query, $db_host, $db_user, $db_pass, $db_name); } }