跳过函数的参数值

时间:2018-12-25 12:50:30

标签: php function codeigniter oop

假设我有一个函数:

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 :(得分:2)

https://www.codeigniter.com/user_guide/database/query_builder.html作为第一个参数传入NULLlimit方法中,将导致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();
}

答案 1 :(得分:1)

我假设$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();
}

答案 2 :(得分:0)

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();
}

您尝试过吗?

答案 3 :(得分:0)

根据MySQL documentation

您可以使用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();
}

答案 4 :(得分:-1)

  

请注意,我的主要答案在底部( 如果您无法编辑此功能 ),但是我添加了其他答案,因为OP尚不清楚该功能可以/应该进行编辑。

编辑此功能

您声明的函数具有:

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

various answers here中给出的引用似乎正在调整此默认值-最简单的解决方案是不编辑 default ,而是设置一个特殊情况,并明确检查$limit是否准确(唯一)是null

要澄清: PHP will use an explicitly set NULL value超过任何默认值(在这种情况下为200)。

所以;

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

如果$limit == 0或其他PHP常见的类型变乱情况,则此不会进行转换

上面的意思是,如果给出 $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 Constant PHP_INT_SIZEPHP_INT_MAX,它们将精确返回该值。 Reading this question/answer会为您提供更多有关此的信息,但是这些常量应作为最大的int值来说明。

如果MySQL LIMIT超过了返回的行,则没有任何效果,因此通过将其设置为最大值,它将始终超过返回的行和/或结果页面输出可用的行。

因此:

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

根据系统(32位或64位),将返回PHP整数限制[2,147,483,647]或[9,223,372,036,854,775,807]内的每一行。

  

让我们面对现实-如果20亿个限制还不够,那么您就必须面对SQL查询;-)

的一些严重问题

答案 5 :(得分:-2)

使用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语句的参数中输入它们即可。