【问题标题】:SELECT with LIMIT in Codeigniter在 Codeigniter 中选择 LIMIT
【发布时间】:2012-12-23 06:16:15
【问题描述】:

我在 Codeigniter 中开发了一个网站,在我的模型中我有这样的功能:

function nationList($limit=null, $start=null) {
    if ($this->session->userdata('language')=="it")
    $this->db->select('nation.id, nation.name_it as name');
    if ($this->session->userdata('language')=="en")
    $this->db->select('nation.id, nation.name_en as name');
    $this->db->from('nation');
    $this->db->order_by("name", "asc");
    $this->db->limit($limit, $start);
    $query = $this->db->get();
    $nation = array();
    foreach ($query->result() as $row)
        array_push($nation, $row);

    return $nation;     
}

如果进入我的控制器,我无限制地调用函数并且 start 不会返回这样的结果:

$data["nationlist"] = $this->Nation_model->nationList();

如果我设置限制并开始工作! 如果limit和start为null,为什么不返回结果?如果 limit 和 start 为空,我不想创建第二个函数或控件。 当 limit 和 start 为空而没有控件或第二个函数来使代码有用并提高效率时,我该如何解决这个问题?

【问题讨论】:

  • 我认为没有if 声明是不可能的。
  • 好的...我希望在没有控件的情况下执行此操作..但是为什么当限制和开始为空时查询不返回某些内容? @Mischa
  • 您必须查看 CodeIgniter 的源代码,但我假设 $this->db->limit(null, null); 在 MySQL 中生成 LIMIT 0,0,它返回零数据库行。
  • 了解...我认为对于“空”值,查询不会考虑限制
  • 查看source code $this->db->limit(null, null); 应该返回LIMIT 1。无论如何,只需添加一个if ;-)

标签: php sql codeigniter


【解决方案1】:

试试这个...

function nationList($limit=null, $start=null) {
    if ($this->session->userdata('language') == "it") {
        $this->db->select('nation.id, nation.name_it as name');
    }

    if ($this->session->userdata('language') == "en") {
        $this->db->select('nation.id, nation.name_en as name');
    }

    $this->db->from('nation');
    $this->db->order_by("name", "asc");

    if ($limit != '' && $start != '') {
       $this->db->limit($limit, $start);
    }
    $query  = $this->db->get();

    $nation = array();
    foreach ($query->result() as $row) {
        array_push($nation, $row);
    }

    return $nation;     
}

【讨论】:

  • ok with control 我知道该怎么做,但我想知道为什么查询不返回查询并在没有控制的情况下解决它,如果可能读取指定的问题
【解决方案2】:

更多访客:

// Executes: SELECT * FROM mytable LIMIT 10 OFFSET 20
// get([$table = ''[, $limit = NULL[, $offset = NULL]]])
$query = $this->db->get('mytable', 10, 20);

// get_where sample, 
$query = $this->db->get_where('mytable', array('id' => $id), 10, 20);

// Produces: LIMIT 10
$this->db->limit(10);  

// Produces: LIMIT 10 OFFSET 20
// limit($value[, $offset = 0])
$this->db->limit(10, 20);

【讨论】:

    【解决方案3】:

    我不知道你在 2013 年使用的是哪个版本的 CI,但我使用的是 CI3,我刚刚测试了两个 null 参数传递给 limit() 并且没有 LIMITOFFSET在呈现的查询中(我使用get_compiled_select() 进行了检查)。

    这意味着 - 假设您已正确发布您的编码尝试 - 您无需更改任何内容(或者至少旧问题不再是 CI 问题)。

    如果这是我的项目,如果结果集中没有符合条件的行,我将编写方法以返回对象的索引数组或空数组。

    function nationList($limit = null, $start = null) {
        // assuming the language value is sanitized/validated/whitelisted
        return $this->db
            ->select('nation.id, nation.name_' . $this->session->userdata('language') . ' AS name')
            ->from('nation')
            ->order_by("name")
            ->limit($limit, $start)
            ->get()
            ->result();
    }
    

    这些改进删除了不必要的语法、条件和冗余循环。

    供参考,这里是CI核心代码:

    /**
     * LIMIT
     *
     * @param   int $value  LIMIT value
     * @param   int $offset OFFSET value
     * @return  CI_DB_query_builder
     */
    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;
    }
    

    所以$this->qb_limit$this->qb_offset 类对象不会更新,因为null 在馈送到is_null()empty() 时评估为true

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2016-08-09
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多