From a36cb738cd2dc08435ed2e90adf16c7d37cccc79 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 15 Feb 2026 21:43:37 +0000 Subject: [PATCH] RC3 --- dashboard.php | 2 +- db/config.php | 36 +++++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/dashboard.php b/dashboard.php index 95629bd..679bce3 100644 --- a/dashboard.php +++ b/dashboard.php @@ -21,7 +21,7 @@ $totalVotes->execute([$electionId]); $totalVotes = $totalVotes->fetchColumn(); // Chart Data: Participation per Grade Level -$gradeStats = $pdo->prepare("SELECT COALESCE(u.grade_level, 'Unknown') as label, COUNT(DISTINCT v.voter_id) as count +$gradeStats = $pdo->prepare("SELECT COALESCE(u.grade_level::TEXT, 'Unknown') as label, COUNT(DISTINCT v.voter_id) as count FROM users u JOIN votes v ON u.id = v.voter_id WHERE v.election_id = ? GROUP BY u.grade_level ORDER BY u.grade_level"); diff --git a/db/config.php b/db/config.php index 2c44b7b..4ae292a 100644 --- a/db/config.php +++ b/db/config.php @@ -13,7 +13,9 @@ define('SUPABASE_DB_PASS', getenv('SUPABASE_DB_PASS') ?: 'gA82h8K80T5QUAwi'); // function db() { static $pdo; if (!$pdo) { - if (defined('SUPABASE_DB_PASS') && !empty(SUPABASE_DB_PASS)) { + $useSupabase = defined('SUPABASE_DB_PASS') && !empty(SUPABASE_DB_PASS); + + if ($useSupabase && extension_loaded('pdo_pgsql')) { // Use Supabase PostgreSQL $host = 'aws-1-ap-southeast-1.pooler.supabase.com'; $port = '6543'; @@ -24,20 +26,36 @@ function db() { $pdo = new PDO("pgsql:host=$host;port=$port;dbname=$dbname", $user, $pass, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_TIMEOUT => 5, // Short timeout for faster fallback ]); - } catch (PDOException $e) { - // Fallback to local MariaDB if PostgreSQL fails - $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASS, [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - ]); + return $pdo; + } catch (PDOException $pgException) { + // Keep the error to report it if the fallback also fails } - } else { - // Use local MariaDB + } + + // Fallback to local MariaDB/MySQL + try { $pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); + } catch (PDOException $mysqlException) { + if (!extension_loaded('pdo_pgsql')) { + die("Connection failed: The 'pdo_pgsql' extension is not enabled in your PHP configuration, and the local MySQL connection also failed.
MySQL Error: " . $mysqlException->getMessage()); + } + + $errorMsg = "

Database Connection Failed

"; + if (isset($pgException)) { + $errorMsg .= "PostgreSQL (Supabase) Error: " . $pgException->getMessage() . "

"; + } + $errorMsg .= "Local MySQL Error: " . $mysqlException->getMessage() . "

"; + $errorMsg .= "Possible Solutions:
"; + $errorMsg .= "1. Supabase: Ensure your firewall/ISP allows outgoing connections on port 6543. Try disabling your antivirus temporarily.
"; + $errorMsg .= "2. Local MySQL: If you want to use local MySQL, update DB_USER and DB_PASS in db/config.php to match your XAMPP settings (usually 'root' and empty password).
"; + $errorMsg .= "3. Verify extension: Make sure extension=pdo_pgsql is uncommented in php.ini AND you have restarted Apache.
"; + + die($errorMsg); } } return $pdo;