假设我有一个函数:
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个数据)。 但是这里我需要所有数据,所以我该如何处理这种情况?
答案 0 :(得分:2)
从https://www.codeigniter.com/user_guide/database/query_builder.html作为第一个参数传入NULL
到limit
方法中,将导致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)
您可以使用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_SIZE
或PHP_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
语句的参数中输入它们即可。