Запрос в mysql (select) для выборки данных с bind_param

Рейтинг: 0Ответов: 0Опубликовано: 04.04.2023

Я делаю метод который будет осуществлять выборку из БД mysql, который подготавливает запрос, чтобы избежать взлома БД.

У меня получилось сделать такой метод, но, по моему, он не очень гибок, в плане того что я не могу с помощью него сделать select с типа ... AND id = 1 AND (r1 = 1 OR r2 = 3)

Сейчас с помощью этого метода я могу делать только запросы такого типа ... AND id = 1 AND r1 = 1 AND ....

Вот так я вызываю метод:

        $user = $this->db->select(
            'users',

            [ 
                [ 
                    'row' => 'auth_token',
                    'value' => $claims['auth_token'],
                    'sep' => 'AND'
                ],
                [
                    'row' => 'email',
                    'value' => $claims['email']
                ]
            ],

            ['id']
        );

А вот сам метод:

    public function select($table, $where = [], $rows = ['*'], $order = '', $limit = '', $offset = '') {
        $get_types = ''; $get_values = [];
        $for_where = [];

        $rows = implode(',', $rows);

        $next_index = 0;

        if ( count($where) > 0 ) {
            foreach ($where as $row => $value) {
                $next_index++;

                $type = gettype($value['value']);
                if ($type == 'integer') {
                    $_p = 'i';
                }else if ($type == 'double') {
                    $_p = 'd';
                }else{
                    $_p = 's';
                }
                $get_types .= $_p;

                $for_where[] = trim($value['row'].' = ? '.( ( isset($value['sep']) && isset($where[ $next_index ]) ) ? $value['sep'] : '' ));
                $get_values[] = $value['value'];
            }
        }

        if ( count($for_where) > 0 ) {
            $sql = "SELECT ".$rows." FROM `$table` WHERE ".implode(' ', $for_where)." ".$order." ".$limit." ".$offset;
        }else{
            $sql = "SELECT ".$rows." FROM `$table` ".$order." ".$limit." ".$offset;
        }
        $sql = trim($sql);

        $stmt = $this->mysqli->prepare($sql);

        if ( count($get_values) > 0 ) {
            $stmt->bind_param($get_types, ...$get_values);
        }

        $stmt->execute();
        $result = $stmt->get_result();

        $result_data = $result->fetch_all(MYSQLI_ASSOC);
        $result_amt = count($result_data);

        $result->close();
        $stmt->close();

        return [ 'data' => $result_data, 'amt' => $result_amt];
    }

Буду благодарен за помощь, хотелось бы по возможности оптимизировать этот код, и сделать метод более гибким!

Ответы

Ответов пока нет.