пропустить значение параметра функции - PullRequest
0 голосов
/ 25 декабря 2018

Предположим, у меня есть функция:

public function __getalldata($tablename,$tablefield=array(),$orderbyfield = 'id',$ascdesc = 'desc',$limit = 200,$type='result')
{
    //Query generation according to above parameters
    $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)
                ->limit($limit)
                ->get();
    return $data->$type();
}

Эта функция используется для многих страниц.Теперь я хочу пропустить параметр $limit Из функции.Это означает, что я не хочу указывать значение $limit, но мне нужны все данные из базы данных.

Так что же происходит, если у меня есть данные типа 600, и я не знаю, сколько у меня данных, яне назначайте никакое значение параметра функции (поэтому по умолчанию это займет 500 данных). Но здесь мне нужны все данные , как мне справиться с этой ситуацией?

Ответы [ 6 ]

0 голосов
/ 25 декабря 2018

Обратите внимание, что мой основной ответ внизу ( ЕСЛИ вы не можете редактировать эту функцию ), но я добавил альтернативные ответы, так как из OP не ясно, какесли функция может / должна быть отредактирована.

Редактировать эту функцию

Ваша объявленная функция имеет:

public function __getalldata($tablename,...,$limit = 200 ...){ ... }

Где ссылка, указанная в различных ответов здесь похоже, что он корректирует это значение по умолчанию - самое простое решение - НЕ редактировать по умолчанию , а установить особый случай и явно проверить, если $limitточно (и только) null.

Чтобы уточнить: PHP будет использовать явно установленное NULL значение над любым значением по умолчанию (в этом случае,200).

Итак;

// within the function
if($limit !== null) {
    //use limit in your PDO
}

Этот не не преобразует, если $limit == 0 или другие случаи жонглирования типов, общие для PHP

Это выше означает, что если нет * 1045Значение * $limit задается, тогда используется значение по умолчанию 200.Если задано явное значение NULL, оно будет использоваться вместо него.


Код

Обратите внимание, этот код предназначен длятолько в качестве примера и, вероятно, может быть упрощено далее, чтобы лучше следовать шаблонам DRY, но я не знаю достаточно о CodeIgniter, чтобы сделать это здесь и сейчас.

public function __getalldata($tablename,$tablefield=array(),$orderbyfield = 'id',$ascdesc = 'desc',$limit = 200,$type='result')
{
    //Query generation according to above parameters
    if($limit !== null){
        $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)
                ->limit($limit)
                ->get();
    }
    else { 
        $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)
                ->get();    
    }
    return $data->$type();
}

Если выне могу редактировать функцию

Мне неясно, можете ли вы (или хотите) редактировать саму функцию, если вы используете Codeigniter, поэтому вместо этого просто обратитесь к автоматическим значениям аргументов функции для возвратакаждая строка допустимости, независимо от того, что (фактически удаляет регистр для лимита.

. Для этого используйте PHP-константу PHP_INT_SIZE или PHP_INT_MAX, которая будет возвращать именно это значение. Чтение этого вопроса / ответа говорит вам больше об этом, но эти константы должны быть самоочевидными, как максимальные значения int.

Если MySQL LIMIT превышает возвращаемые строки, это не имеетэффект, поэтому, установив это максимальное значениее, он всегда будет превышать возвращаемые строки и / или строки, используемые в результате вывода страницы.

Поэтому:

 $var = __getalldata("table",[0=>'columnname'],'id','desc',PHP_INT_MAX,'result');

вернет вам каждую строку в пределах целочисленного предела PHP [2 147 483 647] или [9 223 372 036 854 775 807], в зависимости от вашей системы (32-разрядная или 64-разрядная).

И давайте посмотрим правде в глаза - если 2 миллиарда недостаточно, вам нужно столкнуться с серьезными проблемами с вашим запросом SQL ;-)

0 голосов
/ 25 декабря 2018

Я предполагаю, что значение по умолчанию $limit = 200 уже используется в ряде мест в приложении.Таким образом, цель состоит в том, чтобы обойти настройки по умолчанию, когда вы хотите все соответствующие записи.Я предлагаю просто передать значение 0 (ноль), когда вы хотите их всех.Тогда в методе класса требуется только небольшое изменение кода.

public function __getalldata($tablename, $tablefield=array(), $orderbyfield = 'id',
                             $ascdesc = 'desc',$limit = 200,$type='result')
{
    if($limit > 0)
    {
        $this->db->limit($limit);
    }

    $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)                
                ->get();
    return $data->$type();
}
0 голосов
/ 25 декабря 2018

Согласно документации MySQL :

Вы можете использовать максимальные значения bigint 18446744073709551615 для извлечения всех данных из MySQL.

Таким образом, ваша функция должна выглядеть следующим образомэто

public function __getalldata($tablename,$tablefield=array(),$orderbyfield = 'id',$ascdesc = 'desc',$limit = 18446744073709551615,$type='result')
{
    //Query generation according to above parameters
    $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)
                ->limit($limit)
                ->get();
    return $data->$type();
}
0 голосов
/ 25 декабря 2018
public function __getalldata($tablename,$tablefield=array(),$orderbyfield = 'id',$ascdesc = 'desc',$limit = '',$type='result')
{
    //Query generation according to above parameters
    if($limit == '') {
    $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)
                ->get();
} else {
$data = $this->db
             ->select($tablefield)
             ->from($tablename)
             ->order_by($orderbyfield, $ascdesc)
             ->limit($limit)
             ->get();
}
    return $data->$type();
}

Вы пробовали это?

0 голосов
/ 25 декабря 2018

От https://www.codeigniter.com/user_guide/database/query_builder.html, передавая NULL методу limit в качестве первого параметра, оператор предела будет не ограничивать что-либо - следовательно, возвращая все строки (см. github ):

public function limit($value, $offset = 0)
{
    is_null($value) OR $this->qb_limit = (int) $value;
    empty($offset) OR $this->qb_offset = (int) $offset;
    return $this;
}

Короче говоря, если вы хотите пропустить параметр $limit, попробуйте установить его значение на NULL.Вот так ...

public function __getalldata($tablename, $tablefield=array(), $orderbyfield = 'id', $ascdesc = 'desc', $limit = NULL, $type='result')
{
    // Query generation according to above parameters
    $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)
                ->limit($limit)
                ->get();
    return $data->$type();
}
0 голосов
/ 25 декабря 2018

Это легко с использованием оператора if.Просто проверьте, является ли условие истинным для вашего limit, если не разрешено до else.Вот так:

public function __getalldata($tablename,$tablefield=array(),$orderbyfield = 'id',$ascdesc = 'desc',$limit = 200,$type='result')
{
    if () // check $limit condition here
    {
    $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)
                ->limit($limit)
                ->get();
    return $data->$type();
    }
    else {
    $data = $this->db
                ->select($tablefield)
                ->from($tablename)
                ->order_by($orderbyfield, $ascdesc)
                ->get();
    return $data->$type();
    }
}

РЕДАКТИРОВАТЬ: Я не уверен, каковы ваши условия для переменной $limit, поэтому просто введите их в аргументы оператора if.

...