Sql Codeigniter获得具有限制的随机记录

Sql Codeigniter获得具有限制的随机记录,sql,codeigniter,jquery,codeigniter-2,Sql,Codeigniter,Jquery,Codeigniter 2,我创建了一个页面,每次使用codeigniter和Ajax向下滚动页面时,都会加载4个产品 在使用codeigniter和jQuery创建分页时,我遵循了这一点。一切正常,而且我使用Ajax更改了数据库的加载类型 我的codeigniter有问题。 当我试图从表中获取随机记录时,我得到了重复的产品 这是codeigniter中的功能: 更新控制器 function index() { $this->load->helper('url'); $data['description

我创建了一个页面,每次使用codeigniter和Ajax向下滚动页面时,都会加载4个产品

在使用codeigniter和jQuery创建分页时,我遵循了这一点。
一切正常,而且我使用Ajax更改了数据库的加载类型

我的codeigniter有问题。 当我试图从表中获取随机记录时,我得到了重复的产品

这是codeigniter中的功能:

更新控制器

function index()
{
  $this->load->helper('url');
  $data['description'] = "Description";
  $data['keywords'] = "Keywords";
  $data['products'] = $this->abitainterni->getAllProductsLimit();
  $data['get_products'] = $this->abitainterni->get_products();
  $this->load->view('welcome', $data);
}

function get_products($offset)
{
    $already_used = $this->input->post('already_used');
    $already = explode(',', $already_used);
    $data['products'] = $this->abitainterni->getAllProductsLimit($offset, $already);
    $arr['view'] = $this->load->view('get_products', $data, true);
    $bossy = '';

    foreach($data['products'] as $p) {
      $bossy .= $p->productID.',';
    }
    $arr['view'] = $bam;
    $arr['ids'] = $bossy;
    echo json_encode($arr);

    return;
}
更新脚本

<script type="text/javascript">

$(document).ready(function(){

<?
    $like_a_boss = "";

    foreach($products as $gp):
        $like_a_boss .= $gp->productID.',';
    endforeach;
?>

    var products = '<?= $like_a_boss; ?>';
    var loaded_products = 0;

    $(".loadMoreProducts").click(function(){
        loaded_products += 4;

        var dati = "welcome/get_products/" + loaded_products;

        $.ajax({
          url:'welcome/get_products/' + loaded_products,
          type: 'post',
          data: {already_used: products},
          cache: false,
          success: function(data) {

            var obj = $.parseJSON(data);

            $("#mainContainerProductWelcome").append(obj.view);
      already_used += obj.ids;

            if(loaded_products >= products - 4) {
                $(".loadMoreProducts").hide();
            } else {
                // load more still visible
            }
          },
          error: function() {
            // there's something wrong
          }
        });

        // show spinner on ajax request starts
        $(".loading-spinner").ajaxStart(function(){
            $(".loading-spinner").show();
            $(".text-load").hide();
        });

        // ajax request complets hide spinner
        $(".loading-spinner").ajaxStop(function(){
            $(".loading-spinner").delay(5000).hide();
            $(".text-load").show();
        });

        return false;
    });

    // submit form contact
    $(window).scroll(function() {
    if($(window).scrollTop() + $(window).height() >= $(document).height()) {
        // click on load more btn
        $(".loadMoreProducts").click();
        return false;
    }
});

});
</script>

$(文档).ready(函数(){
var乘积=“”;
var加载的产品=0;
$(“.loadMoreProducts”)。单击(函数(){
装载的产品+=4;
var dati=“欢迎/获取产品/”+加载的产品;
$.ajax({
url:'welcome/get_products/'+loaded_products,
键入:“post”,
数据:{已使用:产品},
cache:false,
成功:功能(数据){
var obj=$.parseJSON(数据);
$(“#mainContainerProductWelcome”).append(obj.view);
已使用+=对象ID;
if(加载的产品>=产品-4){
$(“.loadMoreProducts”).hide();
}否则{
//加载更多仍然可见的内容
}
},
错误:函数(){
//有点不对劲
}
});
//在ajax请求启动时显示微调器
$(“.loading spinner”).ajaxStart(函数(){
$(“.loading微调器”).show();
$(“.text load”).hide();
});
//ajax请求完成隐藏微调器
$(“.loading spinner”).ajaxStop(函数(){
$(“.loading微调器”).delay(5000.hide();
$(“.text load”).show();
});
返回false;
});
//提交表格联系人
$(窗口)。滚动(函数(){
如果($(窗口).scrollTop()+$(窗口).height()>=$(文档).height()){
//点击加载更多btn
$(“.loadMoreProducts”)。单击();
返回false;
}
});
});

您需要跟踪已查询的产品,将其id放入数组中,然后使用类似where not in的命令。比如说:

    function getAllProductsLimit($offset=0, $already_used = array(0))
    {
      $this->db->order_by('productID', 'RANDOM');
      $this->db->where_not_in('productID', $already_used);
      $query = $this->db->get('product', 4, $offset);

      if($query->num_rows() > 0){
        return $query->result();
      } else {
        return 0;
      }
    }

NEW CONTROLLER

    function index()
    {
        $this->load->helper('url');
        $data['title'] = "Scopri i nostri prodotti";
        $data['description'] = "Description";
        $data['keywords'] = "Keywords";
        $data['products'] = $this->abitainterni->getAllProductsLimit();
        $data['get_products'] = $this->abitainterni->get_products();
        $this->load->view('welcome', $data);
    }

    function get_products($offset)
    {
        $already_used = $this->input->post('already_used');
        $already = explode(',', $already_used);
        $data['products'] = $this->abitainterni->getAllProductsLimit($offset, $already);
        $arr['view'] = $this->load->view('get_products', $data, true);
            $bossy = '';
    foreach($data['products'] as $p)
            {
        $bossy .= $->productID.',';
            }
            $arr['view'] = $bam;
            $arr['ids'] = $bossy;
echo json_encode($arr);
return;

    }

NEW SCRIPT

<script type="text/javascript">
$(document).ready(function(){

        <?
    $like_a_boss = '';
    foreach($get_products as $gp):?>
    $like_a_boss .= $gp->productID.',';
    endforeach;?>

    var products = '<?= $like_a_boss; ?>';
    var loaded_products = 0;

    $(".loadMoreProducts").click(function(){
        loaded_products += 4;

        var dati = "welcome/get_products/" + loaded_products;

        $.ajax({
          url:'welcome/get_products/' + loaded_products,
          type: 'post',
          data: {already_used: products},
          cache: false,
          success: function(data) {
            var obj = $.parseJSON(data);

            $("#mainContainerProductWelcome").append(obj.view);
            already_used += obj.ids;           

            if(loaded_products >= products - 4) {
                $(".loadMoreProducts").hide();
            } else {
                // load more still visible
            }
          },
          error: function() {
            // there's something wrong
          }
        });

        // show spinner on ajax request starts
        $(".loading-spinner").ajaxStart(function(){
            $(".loading-spinner").show();
            $(".text-load").hide();
        });

        // ajax request complets hide spinner
        $(".loading-spinner").ajaxStop(function(){
            $(".loading-spinner").delay(5000).hide();
            $(".text-load").show();
        });

        return false;
    });

    // submit form contact
    $(window).scroll(function() {
    if($(window).scrollTop() + $(window).height() >= $(document).height()) {
        // click on load more btn
        $(".loadMoreProducts").click();
        return false;
    }
});

});
</script>
函数getAllProductsLimit($offset=0,$ready\u used=array(0)) { $this->db->order_by('productID','RANDOM'); $this->db->where_not_in('productID',$ready_used); $query=$this->db->get('product',4,$offset); 如果($query->num\u rows()>0){ 返回$query->result(); }否则{ 返回0; } } 新控制器 函数索引() { $this->load->helper('url'); $data['title']=“Scopri i nostri prodotti”; $data['description']=“description”; $data['keywords']=“关键字”; $data['products']=$this->abitainterni->getAllProductsLimit(); $data['get_products']=$this->abitainterni->get_products(); $this->load->view('welcome',$data); } 函数获取产品($offset) { $ready_used=$this->input->post('ready_used'); $ready=explode(“,”,$ready_已使用); $data['products']=$this->abitainterni->getAllProductsLimit($offset,$ready); $arr['view']=$this->load->view('get_products',$data,true); $bossy=''; foreach($p形式的数据['products')) { $bossy.=$->productID','; } $arr['view']=$bam; $arr['id']=$bossy; echo json_编码($arr); 返回; } 新剧本 $(文档).ready(函数(){ $like_a_boss.=$gp->productID.','; endforeach;?> var乘积=“”; var加载的产品=0; $(“.loadMoreProducts”)。单击(函数(){ 装载的产品+=4; var dati=“欢迎/获取产品/”+加载的产品; $.ajax({ url:'welcome/get_products/'+loaded_products, 键入:“post”, 数据:{已使用:产品}, cache:false, 成功:功能(数据){ var obj=$.parseJSON(数据); $(“#mainContainerProductWelcome”).append(obj.view); 已使用+=对象ID; if(加载的产品>=产品-4){ $(“.loadMoreProducts”).hide(); }否则{ //加载更多仍然可见的内容 } }, 错误:函数(){ //有点不对劲 } }); //在ajax请求启动时显示微调器 $(“.loading spinner”).ajaxStart(函数(){ $(“.loading微调器”).show(); $(“.text load”).hide(); }); //ajax请求完成隐藏微调器 $(“.loading spinner”).ajaxStop(函数(){ $(“.loading微调器”).delay(5000.hide(); $(“.text load”).show(); }); 返回false; }); //提交表格联系人 $(窗口)。滚动(函数(){ 如果($(窗口).scrollTop()+$(窗口).height()>=$(文档).height()){ //点击加载更多btn $(“.loadMoreProducts”)。单击(); 返回false; } }); });
然后,无论您在何处使用该函数,在将结果回显到ajax函数之前,运行一个快速foreach,将刚刚获得的产品ID添加到已使用的数组中。您可以存储此is会话,也可以在ajax文件之间来回传递,或者如果您的ajax文件编写得很好,您无需担心,只需使用数据属性或其他方式将产品id附加到正在显示的每个产品上,并以这种方式生成数组。

谢谢您的帮助,当我用foreach将产品加载到页面中时,如果我不太理解的话,在这之前:我必须检查$ready_used var?好的,如果你想让产品id保持在会话中,你可以用foreach,但这要在你调用数据库之前。我可以向您展示一些代码,如果您发布加载带有f的页面的初始控制器