2

假设我有一个功能:

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

此功能已用于许多页面。现在,我想跳过参数$limitFrom 函数。这意味着我不想提供$limit价值,但我需要数据库中的所有数据。

因此,如果我有 600 之类的数据并且我不知道我有多少数据,我不会给函数提供任何参数值(因此默认情况下它将需要 500 个数据)。但是在这里我需要所有数据,所以我该如何管理这种情况?

4

6 回答 6

2

https://www.codeigniter.com/user_guide/database/query_builder.html作为第一个参数传入NULL方法将导致限制语句限制任何内容 - 因此返回所有行(参见github):limit

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();
}
于 2018-12-25T13:02:26.080 回答
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();
}
于 2018-12-25T14:33:44.857 回答
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();
}

你试过这个吗?

于 2018-12-25T13:09:40.300 回答
0

根据MySQL 文档

您可以使用 bigint 最大值18446744073709551615MySQL.

所以你的函数应该是这样的

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();
}
于 2018-12-25T13:12:45.530 回答
-1

请注意,我的主要答案在底部(如果您无法编辑此功能),但我已经提供了替代答案,因为 OP 不清楚该功能是否可以/应该被编辑。

编辑此功能

您声明的函数具有:

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

此处各种 答案 中给出的参考似乎正在调整此默认值 - 最简单的解决方案是不编辑默认值,而是设置特殊情况 并明确检查是否完全(且仅)。$limitnull

澄清一下: PHP 将使用显式设置的NULL而不是任何默认值(在本例中为200)。

所以;

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

不会转换 PHP 常见的 if$limit == 0或其他类型杂乱的情况

这意味着如果没有 $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_SIZEPHP_INT_MAX将准确返回该值。阅读这个问题/答案会告诉你更多关于这一点的信息,但这些常量应该是不言自明的,作为最大的 int 值。

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

所以:

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

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

让我们面对现实吧——如果 20 亿还不够,你需要面对你的 SQL 查询有一些严重的问题;-)

于 2018-12-25T15:34:21.337 回答
-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语句的参数中输入它们。

于 2018-12-25T13:00:51.493 回答