HEX
Server: Apache/2.4.6 (CentOS) mpm-itk/2.4.7-04 mod_fcgid/2.3.9 PHP/5.4.16
System: Linux dvm.vladweb.ru 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: region-gk.ru (1016)
PHP: 7.3.33
Disabled: NONE
Upload Files
File: //home/temp/yarusvl.ru/api/Users.php
<?php

require_once('Mgc.php');

class Users extends Mgc {

    // осторожно, при изменении соли испортятся текущие пароли пользователей
    private $salt = '8e86a279d6e182b3c811c559e6b15484';

    /*Выборка пользователей*/
    public function get_users($filter = array()) {
        $limit = 1000;
        $page = 1;
        $group_id_filter = '';
        $keyword_filter = '';

        if(isset($filter['limit'])) {
            $limit = max(1, intval($filter['limit']));
        }

        if(isset($filter['page'])) {
            $page = max(1, intval($filter['page']));
        }

        if(isset($filter['group_id'])) {
            $group_id_filter = $this->db->placehold('AND u.group_id in(?@)', (array)$filter['group_id']);
        }

        if(isset($filter['keyword'])) {
            $keywords = explode(' ', $filter['keyword']);
            foreach($keywords as $keyword) {
                $keyword_filter .= $this->db->placehold('AND (
                    u.name LIKE "%'.$this->db->escape(trim($keyword)).'%" 
                    OR u.email LIKE "%'.$this->db->escape(trim($keyword)).'%" 
                    OR u.last_ip LIKE "%'.$this->db->escape(trim($keyword)).'%" 
                ) ');
            }
        }

        $order = 'u.name';
        if(!empty($filter['sort'])) {
            switch ($filter['sort']) {
                case 'date':
                    $order = 'u.created DESC';
                    break;
                case 'name':
                    $order = 'u.name';
                    break;
                case 'email':
                    $order = 'u.email';
                    break;
                case 'cnt_order':
                    $order = "(select count(o.id) as count from __orders o where o.user_id = u.id) DESC";
                    break;
            }
        }

        $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit);
        // Выбираем пользователей
        $query = $this->db->placehold("SELECT 
                u.id, 
                u.email, 
                u.password, 
                u.name,
                u.phone,
                u.address,
                u.group_id, 
                u.last_ip, 
                u.created, 
          u.card, 
       u.inn,
         u.org,
                g.discount, 
                g.name as group_name 
            FROM __users u
            LEFT JOIN __groups g ON u.group_id=g.id
            WHERE 
                1 
                $group_id_filter 
                $keyword_filter 
            ORDER BY $order 
            $sql_limit
        ");
        $this->db->query($query);
        return $this->db->results();
    }

    /*Подсчет пользователей*/
    public function count_users($filter = array()) {
        $group_id_filter = '';
        $keyword_filter = '';

        if(isset($filter['group_id'])) {
            $group_id_filter = $this->db->placehold('AND u.group_id in(?@)', (array)$filter['group_id']);
        }

        if(isset($filter['keyword'])) {
            $keywords = explode(' ', $filter['keyword']);
            foreach($keywords as $keyword) {
                $keyword_filter .= $this->db->placehold('AND (
                    u.name LIKE "%'.$this->db->escape(trim($keyword)).'%" 
                    OR u.email LIKE "%'.$this->db->escape(trim($keyword)).'%" 
                    OR u.last_ip LIKE "%'.$this->db->escape(trim($keyword)).'%" 
                ) ');
            }
        }
        // Выбираем пользователей
        $query = $this->db->placehold("SELECT count(*) as count 
            FROM __users u
            LEFT JOIN __groups g ON u.group_id=g.id
            WHERE 
                1 
                $group_id_filter 
                $keyword_filter 
        ");
        $this->db->query($query);
        return $this->db->result('count');
    }

    /*Выборка конкретного пользователя*/
    public function get_user($id) {
        if (empty($id)) {
            return false;
        }
        if(gettype($id) == 'string') {
            $where = $this->db->placehold('AND u.email=? ', $id);
        } else {
            $where = $this->db->placehold('AND u.id=? ', intval($id));
        }

        // Выбираем пользователя
        $query = $this->db->placehold("SELECT 
                u.id, 
                u.email, 
                u.password, 
                u.name,
                u.phone,
                u.address,
                u.group_id, 
                u.last_ip, 
                u.created, 
                        u.file, 
          u.card,    u.inn,    u.org, 
                g.discount, 
                g.name as group_name 
            FROM __users u 
            LEFT JOIN __groups g ON u.group_id=g.id 
            WHERE
                1 
                $where 
            LIMIT 1
        ", $id);
        $this->db->query($query);
        $user = $this->db->result();
        if(empty($user)) {
            return false;
        }
        $user->discount *= 1; // Убираем лишние нули, чтобы было 5 вместо 5.00
        return $user;
    }

    /*Добавление пользователя*/
    public function add_user($user) {
        $user = (array)$user;
        if(isset($user['password'])) {
            $user['password'] = md5($this->salt.$user['password'].md5($user['password']));
        }

        $query = $this->db->placehold("SELECT count(*) as count FROM __users WHERE email=?", $user['email']);
        $this->db->query($query);

        if($this->db->result('count') > 0) {
            return false;
        }

        $query = $this->db->placehold("INSERT INTO __users SET ?%", $user);
        $this->db->query($query);
        return $this->db->insert_id();
    }

    /*Обновление пользователя*/
    public function update_user($id, $user) {
        $user = (array)$user;
        if(isset($user['password'])) {
            $user['password'] = md5($this->salt.$user['password'].md5($user['password']));
        }
        $query = $this->db->placehold("UPDATE __users SET ?% WHERE id=? LIMIT 1", $user, intval($id));
        $this->db->query($query);
        return $id;
    }

    /*Удаление пользователя*/
    public function delete_user($id) {
        if(!empty($id)) {
            $query = $this->db->placehold("UPDATE __orders SET user_id=0 WHERE user_id=?", intval($id));
            $this->db->query($query);

            $query = $this->db->placehold("DELETE FROM __users WHERE id=? LIMIT 1", intval($id));
            if($this->db->query($query)) {
                return true;
            }
        }
        return false;
    }

    /*Выборка групп пользователей*/
    public function get_groups() {
        // Выбираем группы
        $query = $this->db->placehold("SELECT g.id, g.name, g.discount FROM __groups AS g ORDER BY g.discount");
        $this->db->query($query);
        return $this->db->results();
    }

    /*Выборка группы пользователей */
    public function get_group($id) {
        // Выбираем группу
        $query = $this->db->placehold("SELECT * FROM __groups WHERE id=? LIMIT 1", $id);
        $this->db->query($query);
        $group = $this->db->result();

        return $group;
    }

    /*Добавление группы пользователей*/
    public function add_group($group) {
        $query = $this->db->placehold("INSERT INTO __groups SET ?%", $group);
        $this->db->query($query);
        return $this->db->insert_id();
    }

    /*Обновление группы пользователей*/
    public function update_group($id, $group) {
        $query = $this->db->placehold("UPDATE __groups SET ?% WHERE id=? LIMIT 1", $group, intval($id));
        $this->db->query($query);
        return $id;
    }

    /*Удаление группы пользователей*/
    public function delete_group($id) {
        if(!empty($id)) {
            $query = $this->db->placehold("UPDATE __users SET group_id=NULL WHERE group_id=? LIMIT 1", intval($id));
            $this->db->query($query);

            $query = $this->db->placehold("DELETE FROM __groups WHERE id=? LIMIT 1", intval($id));
            if($this->db->query($query)) {
                return true;
            }
        }
        return false;
    }

    /*Проверка пароля*/
    public function check_password($email, $password) {
        $encpassword = md5($this->salt.$password.md5($password));
        $query = $this->db->placehold("SELECT id FROM __users WHERE email=? AND password=? LIMIT 1", $email, $encpassword);
        $this->db->query($query);
        if($id = $this->db->result('id')) {
            return $id;
        }
        return false;
    }

}