Комментарии к PHP классу для работы с БД [требует правки]

216
15 августа 2017, 16:05

Может кто-нибудь объяснить, как работает этот класс. Хочу научиться использовать mvc, нашел такой класс для работы с бд, но разобраться до конца не могу. Буду очень признателен, если Вы прокомментируете взаимосвязь методов и вообще детали реализации этого базового класса. По моему мнению, если кто-то даст разъяснения и выложит их, например, на github, тому начинающие памятник поставят (нерукотворный)

  Abstract Class Model_Base {
    protected $db;
    protected $table;
    private $dataResult;
    public function __construct($select = false) {
        // объект бд коннекта
        global $dbObject;
        $this->db = $dbObject;
        // имя таблицы
        $modelName = get_class($this);
        $arrExp = explode('_', $modelName);
        $tableName = strtolower($arrExp[1]);
        $this->table = $tableName;
        // обработка запроса, если нужно
        $sql = $this->_getSelect($select);
        if($sql) $this->_getResult("SELECT * FROM $this->table" . $sql);
    }   
    // получить имя таблицы
    public function getTableName() {
        return $this->table;
    }
    // получить все записи
    function getAllRows(){
        if(!isset($this->dataResult) OR empty($this->dataResult)) return false;
        return $this->dataResult;
    }
    // получить одну запись
    function getOneRow(){
        if(!isset($this->dataResult) OR empty($this->dataResult)) return false;
        return $this->dataResult[0];
    }   
    // извлечь из базы данных одну запись
    function fetchOne(){
        if(!isset($this->dataResult) OR empty($this->dataResult)) return false;
        foreach($this->dataResult[0] as $key => $val){
            $this->$key = $val;
        }
        return true;
    }
    // получить запись по id
    function getRowById($id){
        try{
            $db = $this->db;
            $stmt = $db->query("SELECT * from $this->table WHERE id = $id");
            $row = $stmt->fetch();
        }catch(PDOException $e) {
            echo $e->getMessage();
            exit;
        }
        return $row;
    }
    // запись в базу данных
    public function save() {
        $arrayAllFields = array_keys($this->fieldsTable());
        $arraySetFields = array();
        $arrayData = array();
        foreach($arrayAllFields as $field){
            if(!empty($this->$field)){
                $arraySetFields[] = $field;
                $arrayData[] = $this->$field;
            }
        }
        $forQueryFields =  implode(', ', $arraySetFields);
        $rangePlace = array_fill(0, count($arraySetFields), '?');
        $forQueryPlace = implode(', ', $rangePlace);
        try {
            $db = $this->db;
            $stmt = $db->prepare("INSERT INTO $this->table ($forQueryFields) values ($forQueryPlace)");  
            $result = $stmt->execute($arrayData);
        }catch(PDOException $e){
            echo 'Error : '.$e->getMessage();
            echo '<br/>Error sql : ' . "'INSERT INTO $this->table ($forQueryFields) values ($forQueryPlace)'"; 
            exit();
        }
        return $result;
    }
    // составление запроса к базе данных
    private function _getSelect($select) {
        if(is_array($select)){
            $allQuery = array_keys($select);
            array_walk($allQuery, function(&$val){
                $val = strtoupper($val);
            });
            $querySql = "";
            if(in_array("WHERE", $allQuery)){
                foreach($select as $key => $val){
                    if(strtoupper($key) == "WHERE"){
                        $querySql .= " WHERE " . $val;                  
                    }
                }
            }
            if(in_array("GROUP", $allQuery)){
                foreach($select as $key => $val){
                    if(strtoupper($key) == "GROUP"){
                        $querySql .= " GROUP BY " . $val;                   
                    }
                }
            }
            if(in_array("ORDER", $allQuery)){
                foreach($select as $key => $val){
                    if(strtoupper($key) == "ORDER"){
                        $querySql .= " ORDER BY " . $val;                   
                    }
                }
            }
            if(in_array("LIMIT", $allQuery)){
                foreach($select as $key => $val){
                    if(strtoupper($key) == "LIMIT"){
                        $querySql .= " LIMIT " . $val;                  
                    }
                }
            }
            return $querySql;
        }       
        return false;
    }
    // выполнение запроса к базе данных
    private function _getResult($sql){
        try{
            $db = $this->db;
            $stmt = $db->query($sql);
            $rows = $stmt->fetchAll();
            $this->dataResult = $rows;
        }catch(PDOException $e) {
            echo $e->getMessage();
            exit;
        }
        return $rows;
    }
    // уделение записей из базы данных по условию
    public function deleteBySelect($select){
        $sql = $this->_getSelect($select);
        try {
            $db = $this->db;
            $result = $db->exec("DELETE FROM $this->table " . $sql);
        }catch(PDOException $e){
            echo 'Error : '.$e->getMessage();
            echo '<br/>Error sql : ' . "'DELETE FROM $this->table " . $sql . "'"; 
            exit();
        }
        return $result;
    }
    // уделение строки из базы данных
    public function deleteRow(){
        $arrayAllFields = array_keys($this->fieldsTable());
        array_walk($arrayAllFields, function(&$val){
            $val = strtoupper($val);
        });
        if(in_array('ID', $arrayAllFields)){            
            try {
                $db = $this->db;
                $result = $db->exec("DELETE FROM $this->table WHERE `id` = $this->id");
                foreach($arrayAllFields as $one){
                    unset($this->$one);
                }
            }catch(PDOException $e){
                echo 'Error : '.$e->getMessage();
                echo '<br/>Error sql : ' . "'DELETE FROM $this->table WHERE `id` = $this->id'"; 
                exit();
            }           
        }else{
            echo "ID table `$this->table` not found!";
            exit;
        }
        return $result;
    }
    // обновление записи. Происходит по ID
    public function update(){
        $arrayAllFields = array_keys($this->fieldsTable());
        $arrayForSet = array();
        foreach($arrayAllFields as $field){
            if(!empty($this->$field)){
                if(strtoupper($field) != 'ID'){
                    $arrayForSet[] = $field . ' = "' . $this->$field . '"';
                }else{
                    $whereID = $this->$field;
                }
            }
        }
        if(!isset($arrayForSet) OR empty($arrayForSet)){
            echo "Array data table `$this->table` empty!";
            exit;
        }
        if(!isset($whereID) OR empty($whereID)){
            echo "ID table `$this->table` not found!";
            exit;
        }
        $strForSet = implode(', ', $arrayForSet);
        try {
            $db = $this->db;
            $stmt = $db->prepare("UPDATE $this->table SET $strForSet WHERE `id` = $whereID");  
            $result = $stmt->execute();
        }catch(PDOException $e){
            echo 'Error : '.$e->getMessage();
            echo '<br/>Error sql : ' . "'UPDATE $this->table SET $strForSet WHERE `id` = $whereID'"; 
            exit();
        }
        return $result;
    }
}
READ ALSO
Kohana. Не работает модуль авторизации на хостинге

Kohana. Не работает модуль авторизации на хостинге

Добрый деньНачал переносить свое веб приложение на хостинг

271
Какая здесь должна быть переменная?

Какая здесь должна быть переменная?

в функции "beforeDelete' вместо $filename в

181
Yandex Music API php [требует правки]

Yandex Music API php [требует правки]

Как подключить в php api yandex музыки ? Поделитесь готовыми примерами использования music yandex api в php

259
Phalcon Middlewares

Phalcon Middlewares

Есть ли в Phalcon понятие Middleware, сходное с таковым в Laravel? Некая прослойка между роутером и контроллером, через которую проходит запросНу, в качестве...

200