【问题标题】:skip parameter value of a function跳过函数的参数值
【发布时间】:2019-05-24 03:43:12
【问题描述】:

假设我有一个函数:

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 From 函数。这意味着我不想给$limit 值,但我需要数据库中的所有数据。

如果我有 600 条这样的数据并且我不知道我有多少数据,我没有给出任何参数值来运行(所以默认情况下它将需要 500 条数据)。 但是这里我需要所有数据那么我该如何应对这种情况呢?

【问题讨论】:

  • 见下面 marvinIsSacul 的answer

标签: php function codeigniter oop


【解决方案1】:

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

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

【讨论】:

  • 如果设置为null,则转换为0,不返回任何结果,OP要返回所有结果
  • 这不是完全不准确的@chinloyal。实际上limit参数的默认值是NULL。去看看吧,你会看到的。我指的是 CI>=3
  • 将值设置为 null 以逃避值是一种 hack,充其量是一种解决方法。使用条件语句设计代码是更简洁、可靠且良好的做法。
  • 我通过给NULL 赋值并按预期​​工作来尝试它。返回所有结果
  • @revo 使用 null 来逃避一个值从来都不是一个方便的功能。
【解决方案2】:

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

【讨论】:

  • 在本例中,最好用{...} 澄清IF 子句
  • 我喜欢这个想法,因为它缩短了之前if else 答案中的代码,但您确实需要那些花括号。
  • @Martin,我知道有人会评论丢失的大括号。 :) 从技术上讲,您不需要它们。 PHP manual 不会将它们用于单个语句。花括号的使用通常被定义为样式指南中的必须项,例如PSR-2。但指南是首选的演示文稿,而不是功能必需品。也就是说,一直使用牙套是一个好习惯。
  • @DFriend 同意,始终使用它们是最佳实践和好建议。我已经编辑了你的答案,正在等待同行评审。
  • 为了全球和平和对所有人的善意,我添加了大括号。 ;)
【解决方案3】:
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();
}

你试过了吗?

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • this 对于检索从某个偏移量到结果集末尾的所有行是有意义的,我们可以为第二个参数使用一些较大的数字。
    • @TarangP 是的,你也可以在你的函数中使用它。它也不会影响查询执行时间。所以它与选择查询的执行时间相同。
    • 是的,可以在 MySQL 上工作。但该解决方案不是可移植的。因为mssql等呢???
    • @marvinIsSacul 根据 OP 代码,他要求的是 MySQL 而不是 mssql。因为mssql 使用TOP 而不是LIMIT
    • 他现在做到了吗?他的问题在哪里MySQL
    【解决方案5】:

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

    编辑此函数

    你声明的函数有:

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

    variousanswershere 中给出的参考似乎正在调整这个默认值——最简单的解决方案是不编辑 默认值,而是设置一个 特殊情况 并明确检查 $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 常见的其他类型杂耍情况下进行转换

    这意味着如果 no $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');
    

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

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

    【讨论】:

    • 所以你基本上只是使用了一个条件语句。已经有两个答案可以做同样的事情。
    • 请看IF you can't edit the function, @Xavier
    • 没有意义。答案是可以接受的。我的意思是,在你面前已经有两个相同的答案了。在这一点上重复提供相同的答案。
    • @Xavier 这不是同一个答案——我的答案围绕着使用 PHP 常量来放置 INT 的最大值。请阅读我的回答。
    【解决方案6】:

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

    【讨论】:

    • 如果我有这样的20+ 函数怎么办。我不能在任何地方使用if else
    • @TarangP 这不是您使用面向对象编程的原因吗?能够重用您的功能?
    • @TarangP 为什么不将这些值作为扩展类来继承?
    • 另一个答案不是你的副本。不要写粗鲁的 cmets,而是标记您认为错误的内容。
    • @YvetteColomb 粗鲁的 cmets?我在问问题以提出一些想法。不知道你怎么觉得这很粗鲁。
    猜你喜欢
    • 2011-07-20
    • 2021-12-23
    • 2015-12-07
    • 2018-06-13
    • 2013-10-02
    • 1970-01-01
    • 2012-04-10
    • 2020-12-07
    相关资源
    最近更新 更多