Skip to content
Snippets Groups Projects
Select Git revision
  • cc7986d48d3098a1738a3a88857929472e71ce84
  • main default protected
2 results

Objet.php

Blame
  • Objet.php 6.75 KiB
    <?php
    require_once "Objet.php";
    
    /**
     * Implémente les magic methods.
     */
    class Objet
    {
        public function __construct($data = null)
        {
            if(!is_null($data)){
                foreach ($data as $key => $value){
                    $this->$key = $value;
                }
            }
        }
        /**
         * @param $name
         * @return mixed
         */
        public function __get($name)
        {
            return $this->$name ?? null;
        }
    
        /**
         * @param $name
         * @param $value
         * @return void
         */
        public function __set($name, $value)
        {
            $this->$name = $value;
        }
    
        /**
         * Permet d'insérer un objet dans la base de données
         * @param String $tableName
         * @param array $columns
         * @return array|string[]
         */
        public static function addObject(String $tableName, array $columns) : array
        {
            $result["status"] = "success";
            $result["message"] = "Insertion réussie";
    
            $validation = Objet::verifyTableAndFormat($tableName, $columns);
            if($validation["status"] !== "success"){
                return $validation;
            }
    
            // On prépare la requête
            $queryString = ("INSERT INTO $tableName (" . implode(", ", array_keys($columns))
                . ") VALUES (:" . implode(", :", array_keys($columns)) . ")");
            $insertQuery = Database::pdo()->prepare($queryString);
            try{
                // Et on l'exécute
                $insertQuery->execute($columns);
            } catch (PDOException $e) {
                return [
                    "status" => "fail",
                    "message" => "L'insertion de l'objet a échoué.",
                    "pdoError" => $e
                ];
            }
    
            return $result;
        }
    
        /**
         * Permet de décrire une table représentant un objet.
         * @param $tableName
         * @return array
         */
        public static function describeObject($tableName) : array
        {
            if(!isAlphaNumeric($tableName)){
                return [
                    "status" => "fail",
                    "message" => "Le format du nom de la table est incorrect.",
                    "columns" => []
                ];
            }else{
                try{
                    $query = Database::pdo()->query("SHOW FULL COLUMNS FROM $tableName");
                    $columns = $query->fetchAll(PDO::FETCH_ASSOC);
                } catch (PDOException $e) {
                    return [
                        "status" => "fail",
                        "message" => $e->getMessage(),
                        "columns" => []
                    ];
                }
    
                return [
                    "status" => "success",
                    "columns" => $columns
                ];
            }
        }
    
        /**
         * Permet la modification d'un objet dans la base de données
         * @param String $tableName
         * @param array $id
         * @param array $columns
         * @return array|string[]
         */
        public static function modifyObject(String $tableName, array $id, array $columns) : array
        {
            $result["status"] = "success";
            $result["message"] = "Modification réussie";
    
            $validation = Objet::verifyTableAndFormat($tableName, $columns);
            if($validation["status"] !== "success"){
                return $validation;
            }
            if(empty($id["name"]) || empty($id["value"]) || !isAlphaNumeric($id["name"])){
                return [
                    "status" => "fail",
                    "message" => "L'identifiant de la table envoyé est incorrect!"
                ];
            }
    
            // On prépare la requête
            $queryString = ("UPDATE $tableName SET " . http_build_query($columns, '', ',') . " WHERE " . $id["name"] . "=:" . $id["name"]);
            $insertQuery = Database::pdo()->prepare($queryString);
            try{
                // Et on l'exécute
                $insertQuery->execute($columns);
            } catch (PDOException $e) {
                return [
                    "status" => "fail",
                    "message" => "La modification de l'objet a échoué.",
                    "pdoError" => $e
                ];
            }
    
            return $result;
        }
    
        /**
         * Permet la récupération d'un objet depuis la base de données
         * @param string $tableName
         * @param array $id
         * @return array|string[]
         */
        public static function getObject(string $tableName, array $id) : array
        {
            $validation = Objet::verifyTableAndFormat($tableName);
            if($validation["status"] !== "success"){
                return $validation;
            }
            if(empty($id["name"]) || empty($id["value"]) || !isAlphaNumeric($id["name"])){
                return [
                    "status" => "fail",
                    "message" => "L'identifiant de la table envoyé est incorrect!"
                ];
            }
    
            // On prépare la requête
            $queryString = ("SELECT * FROM $tableName WHERE " . $id["name"] . "=?");
            $insertQuery = Database::pdo()->prepare($queryString);
            try{
                // Et on l'exécute
                $insertQuery->execute([$id["name"]]);
            } catch (PDOException $e) {
                return [
                    "status" => "fail",
                    "message" => "La récupération de l'objet a échoué.",
                    "pdoError" => $e
                ];
            }
    
            return [
                "status" => "success",
                "message" => "Récupération réussie.",
                "data" => $insertQuery->fetch(PDO::FETCH_ASSOC)
            ];
        }
    
        /**
         * Permet de vérifier le format du nom de la table et des nom des colonnes + vérifier l'existance de la table.
         * @param String $tableName
         * @param array|null $columns
         * @return array|string[]
         */
        public static function verifyTableAndFormat(string $tableName, array $columns = null) : array
        {
            // On va vérifier que $tableName est bien en format alphanumérique
            if(!isAlphaNumeric($tableName)){
                return [
                    "status" => "fail",
                    "message" => "Le format du nom de la table est incorrect."
                ];
            }
    
            // Maintenant on va vérifier que la table existe
            try{
                Database::pdo()->query("SELECT 1 FROM $tableName LIMIT 1");
            } catch (PDOException $e) {
                return [
                    "status" => "fail",
                    "message" => "La table $tableName ne semble pas exister.",
                    "pdoError" => $e
                ];
            }
    
            if(!is_null($columns)){
                // On va vérifier que l'index de chaque est bien en format alphanumérique
                foreach($columns as $index => $value){
                    if(!isAlphaNumeric($index)){
                        return [
                            "status" => "fail",
                            "message" => "Le format " . htmlspecialchars($index) . " est incorrect."
                        ];
                    }
                }
            }
            return [
                "status" => "success",
                "message" => "Validation réussie."
            ];
        }
    }