From 28513d367ddc6229188698e535fb62ce33e5011e Mon Sep 17 00:00:00 2001 From: Nick Yeoman Date: Thu, 20 Mar 2025 18:27:17 -0700 Subject: [PATCH] functions and classes added. --- src/Database.php | 111 +++++++++++++++++++++-------------------- src/MessageHandler.php | 62 +++++++++++++++++++++++ src/Post.php | 25 ++++++++++ src/Redirect.php | 40 +++++++++++++++ src/Router.php | 21 ++++---- src/Session.php | 12 +++-- src/functions.php | 29 +++++++++++ src/novaconium.php | 22 ++++++-- 8 files changed, 250 insertions(+), 72 deletions(-) create mode 100644 src/MessageHandler.php create mode 100644 src/Post.php create mode 100644 src/Redirect.php create mode 100644 src/functions.php diff --git a/src/Database.php b/src/Database.php index 42f7fd4..8aef4d3 100644 --- a/src/Database.php +++ b/src/Database.php @@ -2,71 +2,74 @@ class Database { - private $host; - private $user; - private $pass; - private $dbname; private $conn; public function __construct($dbinfo) { - $this->host = $dbinfo['host']; - $this->user = $dbinfo['user']; - $this->pass = $dbinfo['pass']; - $this->dbname = $dbinfo['name']; - - $this->connect(); - } - - private function connect() { - $this->conn = new mysqli($this->host, $this->user, $this->pass, $this->dbname); - + $this->conn = new mysqli($dbinfo['host'], $dbinfo['user'], $dbinfo['pass'], $dbinfo['name']); if ($this->conn->connect_error) { die("Connection failed: " . $this->conn->connect_error); } + } - public function query($query) { + public function query($query, $params = []) { + // Prepare the SQL query + if ($stmt = $this->conn->prepare($query)) { + // Bind parameters to the prepared statement (if any) + if (!empty($params)) { + $types = str_repeat('s', count($params)); // Assuming all params are strings + $stmt->bind_param($types, ...$params); + } + + // Execute the statement + if (!$stmt->execute()) { + throw new Exception("Query execution failed: " . $stmt->error); + } + + // Return the statement result + return $stmt; + } else { + throw new Exception("Query preparation failed: " . $this->conn->error); + } + } + + public function getRow($query, $params = []) { + try { + // Perform the query using prepared statement + $stmt = $this->query($query, $params); + + // Get the result of the query + $result = $stmt->get_result(); + + // Fetch the first row from the result + return $result->fetch_assoc(); + } catch (Exception $e) { + // Handle the exception (log it, display a message, etc.) + echo "An error occurred: " . $e->getMessage(); + return null; + } + } + + public function getRows($query, $params = []) { $stmt = $this->conn->prepare($query); + if (!$stmt) { + die("Query preparation failed: " . $this->conn->error); + } + + // Bind parameters if provided + if (!empty($params)) { + $types = str_repeat('s', count($params)); // Assuming all are strings, adjust as needed + $stmt->bind_param($types, ...$params); + } + $stmt->execute(); - - return $stmt->get_result(); - } - - public function getRow($query) { - $result = $this->query($query); - return $result->fetch_assoc(); - } - - public function debugGetRow($query) { - echo "

Debug GetRow Query

"; - echo "
Query: $query
"; - $result = $this->query($query); - $row = $result->fetch_assoc(); + $result = $stmt->get_result(); // Requires MySQL Native Driver (mysqlnd) - echo "
";
-        print_r($row);
-        echo "
"; - - die(); - } - - public function getRows($query) { - $result = $this->query($query); - return $result->fetch_all(MYSQLI_ASSOC); - } - - public function debugGetRows($query) { - echo "

Debug GetRows Query

"; - echo "
Query: $query
"; - - $result = $this->query($query); - $rows = $result->fetch_all(MYSQLI_ASSOC); - - echo "
";
-        print_r($rows);
-        echo "
"; - - die(); + if ($result) { + return $result->fetch_all(MYSQLI_ASSOC); + } else { + return []; + } } public function close() { diff --git a/src/MessageHandler.php b/src/MessageHandler.php new file mode 100644 index 0000000..c5e2b4b --- /dev/null +++ b/src/MessageHandler.php @@ -0,0 +1,62 @@ + [], + 'warning' => [], + 'notice' => [], + 'success' => [] + ]; + + // Add a message of a specific type + public function addMessage($type, $message) { + if (!isset($this->messages[$type])) { + throw new Exception("Invalid message type: $type"); + } + $this->messages[$type][] = $message; + } + + // Get all messages of a specific type + public function getMessages($type) { + return $this->messages[$type] ?? []; + } + + // Get all messages of all types + public function getAllMessages() { + return $this->messages; + } + + // Get the count of messages for a specific type + public function count($type) { + return isset($this->messages[$type]) ? count($this->messages[$type]) : 0; + } + + // Get the total count of all messages + public function totalCount() { + return array_sum(array_map('count', $this->messages)); + } + + // Check if there are any messages of a specific type + public function hasMessages($type) { + return !empty($this->messages[$type]); + } + + // Check if there are any messages at all + public function hasAnyMessages() { + return $this->totalCount() > 0; + } + + // Clear messages of a specific type + public function clear($type) { + if (isset($this->messages[$type])) { + $this->messages[$type] = []; + } + } + + // Clear all messages + public function clearAll() { + foreach ($this->messages as $type => $list) { + $this->messages[$type] = []; + } + } +} diff --git a/src/Post.php b/src/Post.php new file mode 100644 index 0000000..167448b --- /dev/null +++ b/src/Post.php @@ -0,0 +1,25 @@ +sanitize($post); + } + + private function sanitize($post) { + foreach ($post as $key => $value) { + $this->data[$key] = is_array($value) + ? filter_var_array($value, FILTER_SANITIZE_FULL_SPECIAL_CHARS) + : filter_var($value, FILTER_SANITIZE_FULL_SPECIAL_CHARS); + } + } + + public function get($key, $default = null) { + return $this->data[$key] ?? $default; + } + + public function all() { + return $this->data; + } +} diff --git a/src/Redirect.php b/src/Redirect.php new file mode 100644 index 0000000..1cf3561 --- /dev/null +++ b/src/Redirect.php @@ -0,0 +1,40 @@ +to('/login'); + * to trigger a redirect + */ + + +class Redirect { + private ?string $url = null; + private int $statusCode = 303; + + public function url(string $relativeUrl, int $statusCode = 303): void { + $this->statusCode = $statusCode; + + // Detect HTTPS + $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https" : "http"; + + // Get Hostname + $host = $_SERVER['HTTP_HOST']; + + // Get Base Directory + $basePath = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/\\'); + + // Construct Absolute URL + $this->url = "$protocol://$host$basePath/" . ltrim($relativeUrl, '/'); + } + + public function isset(): bool { + return !is_null($this->url); + } + + public function execute(): void { + if ($this->url) { + header("Location: " . $this->url, true, $this->statusCode); + exit(); + } + } +} diff --git a/src/Router.php b/src/Router.php index 3f40182..31d7f88 100644 --- a/src/Router.php +++ b/src/Router.php @@ -119,19 +119,16 @@ class Router { } public function debug() { - echo '

Debugging Router

'; - echo '

Url Path

'; - echo $this->path . '
'; - echo '

ControllerPath

'; - echo $this->controllerPath; - echo '

Parameters

'; - echo '
';
-        print_r($this->parameters);
-        echo '
'; - echo '

Routes Variable

';
-        print_r($this->routes);
-        echo '
'; + echo '
'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
Url Path' . htmlspecialchars($this->path) . '
Controller Path' . htmlspecialchars($this->controllerPath) . '
Parameters
' . print_r($this->parameters, true) . '
Routes
' . print_r($this->routes, true) . '
'; + die(); } + } \ No newline at end of file diff --git a/src/Session.php b/src/Session.php index 4df3504..ade4399 100644 --- a/src/Session.php +++ b/src/Session.php @@ -4,13 +4,15 @@ class Session { private $session; public function __construct() { + session_start(); if (!isset($_SESSION)) { - session_start(); $this->session = $_SESSION; + $this->setToken(); + $this->session['messages'] = []; } else { $this->session = $_SESSION; } - $this->setToken(); + } public function setToken() { @@ -34,7 +36,7 @@ class Session { } public function debug() { - print_r($this->session); + return $this->session; } public function delete($key) { @@ -48,4 +50,8 @@ class Session { session_write_close(); } + public function kill() { + session_destroy(); + } + } \ No newline at end of file diff --git a/src/functions.php b/src/functions.php new file mode 100644 index 0000000..bbf12b0 --- /dev/null +++ b/src/functions.php @@ -0,0 +1,29 @@ +"; + foreach ($vars as $var) { + var_dump($var); + echo "\n"; + } + echo ""; + die(); +} + +function makeitso() { + global $session, $db, $redirect, $config, $messages; + + if (!empty($config['database']['host'])) { + $db->close(); + } + + $session->set('messages', $messages->getAllMessages()); + $session->write(); + + $redirect->execute(); + + exit(); +} diff --git a/src/novaconium.php b/src/novaconium.php index 7c5c6b9..54e4764 100644 --- a/src/novaconium.php +++ b/src/novaconium.php @@ -10,9 +10,16 @@ if (file_exists(BASEPATH . '/App/config.php')) { require_once(FRAMEWORKPATH . '/defaults/App/config.php'); } -// Creates twig and the view() function +// Global Functions +require_once(FRAMEWORKPATH . '/src/functions.php'); + +// Creates the view() function using twig require_once(FRAMEWORKPATH . '/src/twig.php'); +// Messages +require_once(FRAMEWORKPATH . '/src/MessageHandler.php'); +$messages = new MessageHandler; + // Start a Session require_once(FRAMEWORKPATH . '/src/Session.php'); $session = new Session(); @@ -23,11 +30,20 @@ if (!empty($config['database']['host'])) { $db = new Database($config['database']); } +// Sanatize POST Data +if (!empty($_POST)) { + require_once(FRAMEWORKPATH . '/src/Post.php'); + $post = new POST($_POST); +} + +// Start a Redirect +require_once(FRAMEWORKPATH . '/src/Redirect.php'); +$redirect = new Redirect(); + // Load a controller require_once(FRAMEWORKPATH . '/src/Router.php'); $router = new Router(); //$router->debug(); require_once($router->controllerPath); -//write the session -$session->write(); \ No newline at end of file +makeitso();