IMPROVEMENT: added a another allowed keyword to inspect schema

This commit is contained in:
EC2 Default User 2026-05-02 07:25:38 +00:00
parent bd29358c57
commit de40a2253d

View File

@ -6,28 +6,51 @@
* *
*/ */
// Helper function to manage connections cleanly function get_db_connection($db_host = null, $db_user = null, $db_pass = null, $db_name = null) {
function get_db_connection($db_host = null, $db_user = null, $db_pass = null) {
global $db; global $db;
// If custom credentials are provided, create a fresh, temporary connection // If custom credentials or a custom DB 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 || $db_name !== null) {
if ($db_host !== null || $db_user !== null || $db_pass !== null) {
$host = $db_host ?? DB_HOST; $host = $db_host ?? DB_HOST;
$user = $db_user ?? DB_USER; $user = $db_user ?? DB_USER;
$pass = $db_pass ?? DB_PASS; $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 // Otherwise, use or initialize the global connection using constants
if (!isset($db) || is_null($db)) { 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; return $db;
} }
function sql_read($query, $db_host = null, $db_user = null, $db_pass = null) { 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); $pdo = get_db_connection($db_host, $db_user, $db_pass, $db_name);
$stmt = $pdo->prepare($query); $stmt = $pdo->prepare($query);
if ($stmt->execute() === false) { 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); return $stmt->fetchAll(PDO::FETCH_ASSOC);
} }
function sql_write($query, $db_host = null, $db_user = null, $db_pass = null) { 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); $pdo = get_db_connection($db_host, $db_user, $db_pass, $db_name);
$stmt = $pdo->prepare($query); $stmt = $pdo->prepare($query);
if ($stmt->execute() === false) { if ($stmt->execute() === false) {
@ -46,12 +69,15 @@ function sql_write($query, $db_host = null, $db_user = null, $db_pass = null) {
return $stmt->rowCount(); return $stmt->rowCount();
} }
function sql($query, $db_host = null, $db_user = null, $db_pass = null) { function sql($query, $db_host = null, $db_user = null, $db_pass = null, $db_name = null) {
// Used trim() and stripos() to catch cases like " select " or "SELECT " if (
if (stripos(trim($query), "SHOW") === 0 || stripos(trim($query), "SELECT") === 0) { stripos(trim($query), "SHOW") === 0
return sql_read($query, $db_host, $db_user, $db_pass); || stripos(trim($query), "DESCRIBE") === 0
|| stripos(trim($query), "SELECT") === 0
) {
return sql_read($query, $db_host, $db_user, $db_pass, $db_name);
} else { } else {
return sql_write($query, $db_host, $db_user, $db_pass); return sql_write($query, $db_host, $db_user, $db_pass, $db_name);
} }
} }